[
  {
    "path": ".changeset/README.md",
    "content": "# Changesets\n\nHello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works\nwith multi-package repos, or single-package repos to help you version and publish your code. You can\nfind the full documentation for it [in our repository](https://github.com/changesets/changesets)\n\nWe have a quick list of common questions to get you started engaging with this project in\n[our documentation](https://github.com/changesets/changesets/blob/master/docs/common-questions.md)\n"
  },
  {
    "path": ".changeset/config.json",
    "content": "{\n  \"$schema\": \"https://unpkg.com/@changesets/config@2.1.0/schema.json\",\n  \"commit\": false,\n  \"linked\": [],\n  \"access\": \"restricted\",\n  \"baseBranch\": \"master\",\n  \"updateInternalDependencies\": \"patch\",\n  \"ignore\": [\n    \"website\",\n    \"example-*\",\n    \"@graphql-codegen/client-preset-swc-plugin\",\n    \"example-apollo-client-swc-plugin\",\n    \"example-react-nextjs-swr\"\n  ],\n  \"changelog\": [\n    \"@changesets/changelog-github\",\n    {\n      \"repo\": \"dotansimha/graphql-code-generator\"\n    }\n  ],\n  \"snapshot\": {\n    \"useCalculatedVersion\": true,\n    \"prereleaseTemplate\": \"{tag}-{datetime}-{commit}\"\n  }\n}\n"
  },
  {
    "path": ".eslintrc.cjs",
    "content": "module.exports = {\n  root: true,\n  extends: ['@theguild', 'plugin:tailwindcss/recommended'],\n  rules: {\n    'no-empty': 'off',\n    '@typescript-eslint/explicit-module-boundary-types': 'off',\n    '@typescript-eslint/no-use-before-define': 'off',\n    '@typescript-eslint/no-namespace': 'off',\n    '@typescript-eslint/no-empty-interface': 'off',\n    '@typescript-eslint/no-empty-function': 'off',\n    '@typescript-eslint/no-var-requires': 'off',\n    '@typescript-eslint/no-explicit-any': 'off',\n    '@typescript-eslint/no-non-null-assertion': 'off',\n    '@typescript-eslint/explicit-function-return-type': 'off',\n    '@typescript-eslint/ban-ts-ignore': 'off',\n    '@typescript-eslint/ban-types': 'off',\n    'import/no-extraneous-dependencies': 'error',\n\n    // todo: enable\n    'unicorn/filename-case': 'off',\n    'import/extensions': 'off',\n    'import/no-default-export': 'off',\n    // todo: enable in v3\n    'unicorn/prefer-node-protocol': 'off',\n    'prefer-object-has-own': 'off',\n  },\n  env: {\n    node: true,\n  },\n  overrides: [\n    {\n      files: ['website/**'],\n      extends: '@theguild/eslint-config/react',\n    },\n    {\n      files: [\n        '*.spec.ts',\n        '**/tests/**/*.{js,ts,tsx,cjs}',\n        '**/graphql-codegen-testing/**/*.ts',\n        '**/vitest.config.ts',\n        '**/vitest.setup.ts',\n        '**/__mocks__/*',\n      ],\n      rules: {\n        'import/no-extraneous-dependencies': 'off',\n        '@typescript-eslint/no-require-imports': 'off',\n      },\n    },\n    {\n      files: '**/tests/fixtures/*.{ts,js}',\n      rules: {\n        '@typescript-eslint/no-unused-vars': 'off',\n      },\n    },\n    {\n      files: ['packages/**/*.{,c,m}ts{,x}'],\n      parserOptions: {\n        project: ['./tsconfig.json'],\n      },\n    },\n    {\n      files: ['scripts/*.{ts,js}', 'prettier.config.cjs'],\n      rules: {\n        '@typescript-eslint/no-require-imports': 'off',\n      },\n    },\n  ],\n  ignorePatterns: [\n    'dev-test',\n    'website',\n    'examples/**',\n    '**/tests/test-files/**',\n    '**/tests/test-documents/**',\n    '**/react-app-env.d.ts',\n    'packages/presets/swc-plugin/tests/fixtures/simple-uppercase-operation-name.js',\n    'packages/presets/swc-plugin/tests/fixtures/simple-uppercase-operation-name.other-dir.js',\n    '**/build/**/*',\n    '**/dist/**/*',\n  ],\n};\n"
  },
  {
    "path": ".gitattributes",
    "content": "# This fixture must contain CRLF as line breaks. See https://github.com/dotansimha/graphql-code-generator/issues/7362\npackages/presets/gql-tag-operations/tests/fixtures/crlf-operation.ts eol=crlf\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: '🐛 Bug report'\ndescription: Create a report to help us improve\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thank you for reporting an issue :pray:.\n\n\n        ## Is it related to a community plugin?\n\n        All request linked to a \"Community plugin\" (as defined below) should [be addressed on the `dotansimha/graphql-code-generator-community` repository](https://github.com/dotansimha/graphql-code-generator-community/issues/new?assignees=&labels=&template=bug_report.yml).\n\n        <details>\n          <summary>Community plugins:</summary>\n\n        - `@graphql-codegen/typescript-react-apollo`\n        - `@graphql-codegen/typescript-graphql-request`\n        - `@graphql-codegen/typescript-apollo-angular`\n        - `@graphql-codegen/typescript-apollo-client-helpers`\n        - `@graphql-codegen/typescript-react-query`\n        - `@graphql-codegen/typescript-urql`\n        - `@graphql-codegen/named-operations-object`\n        - `@graphql-codegen/urql-introspection`\n        - `@graphql-codegen/flow-resolvers`\n        - `@graphql-codegen/typescript-vue-apollo`\n        - `@graphql-codegen/typescript-rtk-query`\n        - `@graphql-codegen/flow-operations`\n        - `@graphql-codegen/typescript-msw`\n        - `@graphql-codegen/typescript-mongodb`\n        - `@graphql-codegen/typescript-type-graphql`\n        - `@graphql-codegen/jsdoc`\n        - `@graphql-codegen/typescript-vue-urql`\n        - `@graphql-codegen/kotlin`\n        - `@graphql-codegen/typescript-vue-apollo-smart-ops`\n        - `@graphql-codegen/java`\n        - `@graphql-codegen/c-sharp-operations`\n        - `@graphql-codegen/hasura-allow-list`\n        - `@graphql-codegen/typescript-stencil-apollo`\n        - `@graphql-codegen/relay-operation-optimizer`\n        - `@graphql-codegen/typescript-oclif`\n        - `@graphql-codegen/java-resolvers`\n        - `@graphql-codegen/java-apollo-android`\n\n        </details>\n\n        ---\n  - type: dropdown\n    id: packages\n    attributes:\n      label: Which packages are impacted by your issue?\n      multiple: true\n      options:\n        - '@graphql-codegen/cli'\n        - '@graphql-codegen/core'\n        - '@graphql-codegen/add'\n        - '@graphql-codegen/fragment-matcher'\n        - '@graphql-codegen/introspection'\n        - '@graphql-codegen/schema-ast'\n        - '@graphql-codegen/time'\n        - '@graphql-codegen/visitor-plugin-common'\n        - '@graphql-codegen/typescript-document-nodes'\n        - '@graphql-codegen/gql-tag-operations'\n        - '@graphql-codegen/typescript-operations'\n        - '@graphql-codegen/typescript-resolvers'\n        - '@graphql-codegen/typescript-rtk-query'\n        - '@graphql-codegen/typed-document-node'\n        - '@graphql-codegen/typescript'\n        - '@graphql-codegen/client-preset'\n        - '@graphql-codegen/graphql-modules-preset'\n        - '@graphql-codegen/testing'\n        - '@graphql-codegen/plugin-helpers'\n    validations:\n      required: false\n  - type: markdown\n    attributes:\n      value: |\n        The issues on this repo are being tracked and monitored according to our [Contributor Workflow](https://github.com/the-guild-org/Stack/blob/master/CONTRIBUTING.md#a-typical-contributor-workflow), Before submitting a new bug/issue, please check the [Contributor Workflow](https://github.com/the-guild-org/Stack/blob/master/CONTRIBUTING.md#a-typical-contributor-workflow)\n\n        After reading the [Contributor Workflow](https://github.com/the-guild-org/Stack/blob/master/CONTRIBUTING.md#a-typical-contributor-workflow), Check out and update the current state of this issue:\n\n        - [ ] 1. The issue provides a [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) available on [GitHub](https://github.com/dotansimha/graphql-code-generator-issue-sandbox-template), [Stackblitz](https://stackblitz.com/github/dotansimha/graphql-code-generator-issue-sandbox-template) or [CodeSandbox](https://codesandbox.io/s/github/dotansimha/graphql-code-generator-issue-sandbox-template).\n          - _Make sure to fork this template and run `yarn generate` in the terminal._\n          - _Please make sure the Codegen and plugins version under `package.json` matches yours._\n        - [ ] 2. A failing test has been provided\n        - [ ] 3. A local solution has been provided\n        - [ ] 4. A pull request is pending review\n\n        The more information you fill in, the better the community can help you.\n  - type: textarea\n    id: description\n    attributes:\n      label: Describe the bug\n      description: Provide a clear and concise description of the challenge you are running into.\n    validations:\n      required: true\n  - type: input\n    id: link\n    attributes:\n      label: Your Example Website or App\n      description: |\n        Which website or app were you using when the bug happened?\n        Note:\n        - Your bug will may get fixed much faster if we can run your code and it doesn't have dependencies other than the `@graphql-codegen/*` npm related packages / dependencies.\n        - To create a shareable code example you can use [GitHub](https://github.com/dotansimha/graphql-code-generator-issue-sandbox-template), [Stackblitz](https://stackblitz.com/github/dotansimha/graphql-code-generator-issue-sandbox-template) or [CodeSandbox](https://codesandbox.io/s/github/dotansimha/graphql-code-generator-issue-sandbox-template). Please no localhost URLs.\n        - Please read these tips for providing a minimal example: https://stackoverflow.com/help/minimal-reproducible-example.\n      placeholder: |\n        e.g. https://codesandbox.io/...... OR Github Repo\n    validations:\n      required: true\n  - type: textarea\n    id: steps\n    attributes:\n      label: Steps to Reproduce the Bug or Issue\n      description: Describe the steps we have to take to reproduce the behavior.\n      placeholder: |\n        1. Go to '...'\n        2. Click on '....'\n        3. Scroll down to '....'\n        4. See error\n    validations:\n      required: true\n  - type: textarea\n    id: expected\n    attributes:\n      label: Expected behavior\n      description: Provide a clear and concise description of what you expected to happen.\n      placeholder: |\n        As a user, I expected ___ behavior but i am seeing ___\n    validations:\n      required: true\n  - type: textarea\n    id: screenshots_or_videos\n    attributes:\n      label: Screenshots or Videos\n      description: |\n        If applicable, add screenshots or a video to help explain your problem.\n        For more information on the supported file image/file types and the file size limits, please refer\n        to the following link: https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting/attaching-files\n      placeholder: |\n        You can drag your video or image files inside of this editor ↓\n  - type: textarea\n    id: platform\n    attributes:\n      label: Platform\n      value: |\n        - OS: [e.g. macOS, Windows, Linux]\n        - NodeJS: [e.g. 18.5.0]\n        - `graphql` version: [e.g. 16.3.0]\n        - `@graphql-codegen/*` version(s): [e.g. 2.6.2]\n    validations:\n      required: true\n  - type: textarea\n    id: config\n    attributes:\n      label: Codegen Config File\n      description: Your local Codegen config file (YAML/JSON...)\n      placeholder: |\n        schema: schema.graphql\n        documents: document.graphql\n        generates:\n          types.ts:\n            plugins:\n              - typescript\n              - typescript-operations\n  - type: textarea\n    id: additional\n    attributes:\n      label: Additional context\n      description: Add any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Have a question?\n    url: https://github.com/dotansimha/graphql-code-generator/discussions/new\n    about: Not sure about something? need help from the community? have a question to our team? please ask and answer questions here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: '✨ Feature request'\ndescription: Suggest an idea for the core of this project\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        ## Is it related to a community plugin?\n\n        All request linked to a \"Community plugin\" (as defined below) should [be addressed on the `dotansimha/graphql-code-generator-community` repository](https://github.com/dotansimha/graphql-code-generator-community/issues/new?assignees=&labels=&template=feature-request.md).\n\n        <details>\n          <summary>Community plugins:</summary>\n\n        - `@graphql-codegen/typescript-react-apollo`\n        - `@graphql-codegen/typescript-graphql-request`\n        - `@graphql-codegen/typescript-apollo-angular`\n        - `@graphql-codegen/typescript-apollo-client-helpers`\n        - `@graphql-codegen/typescript-react-query`\n        - `@graphql-codegen/typescript-urql`\n        - `@graphql-codegen/named-operations-object`\n        - `@graphql-codegen/urql-introspection`\n        - `@graphql-codegen/flow-resolvers`\n        - `@graphql-codegen/typescript-vue-apollo`\n        - `@graphql-codegen/typescript-rtk-query`\n        - `@graphql-codegen/flow-operations`\n        - `@graphql-codegen/typescript-msw`\n        - `@graphql-codegen/typescript-mongodb`\n        - `@graphql-codegen/typescript-type-graphql`\n        - `@graphql-codegen/jsdoc`\n        - `@graphql-codegen/typescript-vue-urql`\n        - `@graphql-codegen/kotlin`\n        - `@graphql-codegen/typescript-vue-apollo-smart-ops`\n        - `@graphql-codegen/java`\n        - `@graphql-codegen/c-sharp-operations`\n        - `@graphql-codegen/hasura-allow-list`\n        - `@graphql-codegen/typescript-stencil-apollo`\n        - `@graphql-codegen/relay-operation-optimizer`\n        - `@graphql-codegen/typescript-oclif`\n        - `@graphql-codegen/java-resolvers`\n        - `@graphql-codegen/java-apollo-android`\n\n        </details>\n\n        ---\n  - type: textarea\n    id: description\n    attributes:\n      label: Is your feature request related to a problem? Please describe.\n      description: \"A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\"\n    validations:\n      required: true\n  - type: textarea\n    id: solution\n    attributes:\n      label: Describe the solution you'd like\n      description: 'A clear and concise description of what you want to happen.'\n    validations:\n      required: true\n  - type: textarea\n    id: alternatives\n    attributes:\n      label: Describe alternatives you've considered\n      description: \"A clear and concise description of any alternative solutions or features you've considered.\"\n    validations:\n      required: false\n  - type: textarea\n    id: context\n    attributes:\n      label: Any additional important details?\n      description: 'Add context or screenshots about the feature request here.'\n    validations:\n      required: false\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "🚨 **IMPORTANT: Please do not create a Pull Request without creating an issue first.**\n\n_Any change needs to be discussed before proceeding. Failure to do so may result in the rejection of the pull request._\n\n## Description\n\nPlease include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.\n\nRelated # (issue)\n\n<!--\nDon't use `Fixes` or `Fixed` to refer issues\n-->\n\n## Type of change\n\nPlease delete options that are not relevant.\n\n- [ ] Bug fix (non-breaking change which fixes an issue)\n- [ ] New feature (non-breaking change which adds functionality)\n- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)\n- [ ] This change requires a documentation update\n\n## Screenshots/Sandbox (if appropriate/relevant):\n\nAdding links to sandbox or providing screenshots can help us understand more about this PR and take action on it as appropriate\n\n## How Has This Been Tested?\n\nPlease describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration\n\n- [ ] Test A\n- [ ] Test B\n\n**Test Environment**:\n\n- OS:\n- `@graphql-codegen/...`:\n- NodeJS:\n\n## Checklist:\n\n- [ ] I have followed the [CONTRIBUTING](https://github.com/the-guild-org/Stack/blob/master/CONTRIBUTING.md) doc and the style guidelines of this project\n- [ ] I have performed a self-review of my own code\n- [ ] I have commented my code, particularly in hard-to-understand areas\n- [ ] I have made corresponding changes to the documentation\n- [ ] My changes generate no new warnings\n- [ ] I have added tests that prove my fix is effective or that my feature works\n- [ ] New and existing unit tests pass locally with my changes\n- [ ] Any dependent changes have been merged and published in downstream modules\n\n## Further comments\n\nIf this is a relatively large or complex change, kick off the discussion by explaining why you chose the solution you did and what alternatives you considered, etc...\n"
  },
  {
    "path": ".github/labels.yml",
    "content": "# Please add the repo specific custom labels here\n\n- name: 'core'\n  color: '0366d6'\n  description: 'Related to codegen core/cli'\n\n- name: 'dependencies'\n  color: 'd4c5f9'\n\n- name: 'new-preset'\n  color: '006b75'\n  description: 'Suggestion for a new preset'\n\n- name: 'plugins'\n  color: 'c2e0c6'\n\n- name: 'presets'\n  color: '0e8a16'\n  description: 'Related to Codegen presets'\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: Testing\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n    branches:\n      - master\n\nenv:\n  NODE_OPTIONS: '--max_old_space_size=4096'\n  CARGO_TERM_COLOR: always\n\njobs:\n  lint:\n    name: Linting Check\n    uses: the-guild-org/shared-config/.github/workflows/lint.yml@main\n    with:\n      script: yarn ci:lint\n    secrets:\n      githubToken: ${{ secrets.GITHUB_TOKEN }}\n  prettier-check:\n    name: 🧹 Prettier Check\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout Master\n        uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n      - name: Setup env\n        uses: the-guild-org/shared-config/setup@main\n      - name: Prettier Check\n        run: yarn prettier:check\n  dev-tests-old:\n    name: Validating dev-tests\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        method:\n          - 'cjs'\n          - 'esm'\n    steps:\n      - name: Checkout\n        uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n      - name: Setup env\n        uses: the-guild-org/shared-config/setup@main\n      - name: Build\n        run: yarn build\n        env:\n          CI: true\n      - name: Test dev-tests ${{matrix.method}}\n        run: |\n          yarn run generate:examples:${{matrix.method}}\n          git diff --exit-code -- dev-test/\n  dev-tests:\n    name: Examples - Normal\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n      - name: Setup env\n        uses: the-guild-org/shared-config/setup@main\n      - name: Build\n        run: yarn build\n        env:\n          CI: true\n      - name: Generate and Diff Codegen Artifacts\n        run: |\n          EXAMPLE_TYPE=normal yarn examples:codegen\n          git diff --exit-code -- examples/\n      - name: Build Examples\n        run: |\n          EXAMPLE_TYPE=normal yarn examples:build\n      - name: End2End Test Examples\n        run: |\n          EXAMPLE_TYPE=normal yarn examples:test:end2end\n\n  # TODO: Remove all SWC test setup and references as that has been moved to https://github.com/swc-project/plugins/tree/main/contrib/graphql-codegen-client-preset\n  # dev-tests-swc:\n  #   name: Examples - SWC\n  #   runs-on: ubuntu-latest\n  #   steps:\n  #     - name: Checkout\n  #       uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4\n  #     - name: Setup env\n  #       uses: the-guild-org/shared-config/setup@main\n  #     - uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1\n  #       with:\n  #         toolchain: 1.65.0\n  #         target: wasm32-wasi\n  #         override: true\n  #     - name: Build SWC plugin\n  #       working-directory: ./packages/presets/swc-plugin\n  #       run: |\n  #         npm run build-wasm\n  #     - name: Build\n  #       run: yarn build\n  #       env:\n  #         CI: true\n  #     - name: Generate and Diff Codegen Artifacts\n  #       run: |\n  #         EXAMPLE_TYPE=swc yarn examples:codegen\n  #         git diff --exit-code -- examples/\n  #     - name: Build Examples\n  #       run: |\n  #         EXAMPLE_TYPE=swc yarn examples:build\n  #     - name: End2End Test Examples\n  #       run: |\n  #         EXAMPLE_TYPE=swc yarn examples:test:end2end\n\n  esm:\n    name: Testing exports integrity\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n      - name: Setup env\n        uses: the-guild-org/shared-config/setup@main\n      - name: Build\n        run: yarn build\n        env:\n          CI: true\n      - name: Test ESM & CJS integrity\n        run: yarn bob check\n  test:\n    name: Unit Test on Node ${{matrix.node_version}} (${{matrix.os}}) and GraphQL v${{matrix.graphql_version}}\n    runs-on: ubuntu-latest\n    needs:\n      - lint\n      - prettier-check\n      - esm\n    strategy:\n      matrix:\n        os: [ubuntu-latest] # remove windows to speed up the tests\n        node_version: [20, 22, 24]\n        graphql_version: [15, 16]\n        include:\n          - node-version: 20\n            os: windows-latest\n            graphql_version: 16\n    steps:\n      - name: Checkout\n        uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n      - name: Setup env\n        uses: the-guild-org/shared-config/setup@main\n        with:\n          nodeVersion: ${{matrix.node_version}}\n      - name: Use GraphQL v${{matrix.graphql_version}}\n        run: node ./scripts/match-graphql.js ${{matrix.graphql_version}}\n      - name: Install Dependencies\n        run: yarn\n      - name: Build\n        run: yarn build\n      - name: Test\n        # FIXME: Do not test `watcher.run.spec.ts` here because it is currently not working for Node22+ in Ubuntu\n        run: yarn test --exclude=\"**/tests/watcher.run.spec.ts\"\n        env:\n          CI: true\n\n  test-watcher:\n    name: Watcher Unit Test on Node ${{matrix.node_version}} (${{matrix.os}}) and GraphQL v${{matrix.graphql_version}}\n    runs-on: ubuntu-latest\n    needs:\n      - lint\n      - prettier-check\n      - esm\n    strategy:\n      matrix:\n        os: [ubuntu-latest] # remove windows to speed up the tests\n        node_version: [20]\n        graphql_version: [15, 16]\n        include:\n          - node-version: 20\n            os: windows-latest\n            graphql_version: 16\n    steps:\n      - name: Checkout\n        uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n      - name: Setup env\n        uses: the-guild-org/shared-config/setup@main\n        with:\n          nodeVersion: ${{matrix.node_version}}\n      - name: Use GraphQL v${{matrix.graphql_version}}\n        run: node ./scripts/match-graphql.js ${{matrix.graphql_version}}\n      - name: Install Dependencies\n        run: yarn\n      - name: Build\n        run: yarn build\n      - name: Test\n        # FIXME: Merge `watcher.run.spec.ts` test to the above when it works for Node22+ in Ubuntu\n        run: yarn test packages/graphql-codegen-cli/tests/watcher.run.spec.ts\n        env:\n          CI: true\n\n  # TODO: Remove all SWC test setup and references as that has been moved to https://github.com/swc-project/plugins/tree/main/contrib/graphql-codegen-client-preset\n  # test-rust-swc-plugin:\n  #   name: Build and Unit Test SWC Plugin\n  #   runs-on: ubuntu-latest\n  #   steps:\n  #     - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4\n  #     - uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1\n  #       with:\n  #         toolchain: 1.65.0\n  #         target: wasm32-wasi\n  #         override: true\n  #     - uses: marcopolo/cargo@a527bf4d534717ff4424a84446c5d710f8833139\n  #       with:\n  #         working-directory: ./packages/presets/swc-plugin\n  #         command: build\n  #         args: --target wasm32-wasi\n  #     - uses: marcopolo/cargo@a527bf4d534717ff4424a84446c5d710f8833139\n  #       with:\n  #         working-directory: ./packages/presets/swc-plugin\n  #         command: test\n"
  },
  {
    "path": ".github/workflows/pr.yml",
    "content": "name: pr\non:\n  pull_request:\n    branches:\n      - master\n\npermissions:\n  contents: write\n  id-token: write\n  pull-requests: write\n\njobs:\n  dependencies:\n    uses: the-guild-org/shared-config/.github/workflows/changesets-dependencies.yaml@main\n    if: ${{ github.event.pull_request.title != 'Upcoming Release Changes' }}\n    secrets:\n      githubToken: ${{ secrets.GITHUB_TOKEN  }}\n\n  alpha:\n    uses: the-guild-org/shared-config/.github/workflows/release-snapshot.yml@main\n    if: ${{ github.event.pull_request.title != 'Upcoming Release Changes' }}\n    with:\n      npmTag: alpha\n      buildScript: build\n    secrets:\n      githubToken: ${{ secrets.GITHUB_TOKEN }}\n      npmToken: ${{ secrets.NPM_TOKEN }}\n\n  release-candidate:\n    uses: the-guild-org/shared-config/.github/workflows/release-snapshot.yml@main\n    if: ${{ github.event.pull_request.title == 'Upcoming Release Changes' }}\n    with:\n      npmTag: rc\n      restoreDeletedChangesets: true\n      buildScript: build\n    secrets:\n      githubToken: ${{ secrets.GITHUB_TOKEN }}\n      npmToken: ${{ secrets.NPM_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: release\non:\n  push:\n    branches:\n      - master\n\njobs:\n  stable:\n    uses: the-guild-org/shared-config/.github/workflows/release-stable.yml@main\n    with:\n      releaseScript: release\n    secrets:\n      # githubToken: ${{ secrets.GUILD_BOT_TOKEN }}\n      githubToken: ${{ secrets.GITHUB_TOKEN }}\n      npmToken: ${{ secrets.NPM_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/rust.yml",
    "content": "name: Rust plugin\non:\n  workflow_dispatch:\n\njobs:\n  publish-rust-swc-plugin:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n      # Setup .npmrc file to publish to npm\n      - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4\n        with:\n          node-version: '18.x'\n          registry-url: 'https://registry.npmjs.org'\n      - uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1\n        with:\n          toolchain: 1.65.0\n          target: wasm32-wasi\n          override: true\n      - name: Build SWC plugin\n        working-directory: ./packages/presets/swc-plugin\n        run: |\n          npm run build-wasm\n      - name: Publish SWC plugin\n        working-directory: ./packages/presets/swc-plugin\n        run: |\n          npm publish --access=public\n        env:\n          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/website-integrity.yml",
    "content": "name: Website Integrity\non:\n  pull_request:\n    paths:\n      - 'website/**'\njobs:\n  website-check:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n\n      - name: Fetch\n        run: git fetch origin master\n\n      - name: Setup env\n        uses: the-guild-org/shared-config/setup@main\n\n      - name: Build Packages\n        run: yarn build\n\n      - name: Build Website\n        run: yarn workspace website run build\n\n      - name: Compare\n        run: git diff origin/${{ github.base_ref }}.. -- website/route-lockfile.txt\n\n      - name: Diff to file\n        if: always()\n        id: diff_result\n        run: |\n          OUTPUT=$(git diff origin/${{ github.base_ref }}.. -- website/route-lockfile.txt)\n          OUTPUT=\"${OUTPUT//'%'/'%25'}\"\n          OUTPUT=\"${OUTPUT//$'\\n'/'%0A'}\"\n          OUTPUT=\"${OUTPUT//$'\\r'/'%0D'}\"\n          echo \"::set-output name=result::$OUTPUT\"\n\n      - name: Publish a message\n        if: always() && contains(steps.diff_result.outputs.result, 'diff')\n        uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2\n        with:\n          message: |\n            ```diff\n            ${{ steps.diff_result.outputs.result }}\n            ```\n"
  },
  {
    "path": ".github/workflows/website.yml",
    "content": "name: website\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n    branches:\n      - master\n\njobs:\n  deployment:\n    runs-on: ubuntu-latest\n    if: github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'push'\n    steps:\n      - name: checkout\n        uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4\n        with:\n          fetch-depth: 0\n\n      - uses: the-guild-org/shared-config/setup@main\n        name: setup env\n\n      - uses: the-guild-org/shared-config/website-cf@main\n        name: build and deploy website\n        env:\n          NEXT_BASE_PATH: ${{ github.ref == 'refs/heads/master' && '/graphql/codegen' || '' }}\n          SITE_URL: ${{ github.ref == 'refs/heads/master' && 'https://the-guild.dev/graphql/codegen' || '' }}\n        with:\n          cloudflareApiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}\n          cloudflareAccountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}\n          githubToken: ${{ secrets.GITHUB_TOKEN }}\n          projectName: graphql-code-generator\n          prId: ${{ github.event.pull_request.number }}\n          websiteDirectory: ./\n          buildScript: yarn build && cd website && yarn build\n          artifactDir: website/out\n"
  },
  {
    "path": ".gitignore",
    "content": ".idea/\n.npmrc\n.yarnclean\n.DS_Store\ncoverage\n*.log\nnode_modules/\ntemp/\njunit.xml\ndist/\n.bob/\nout.txt\n.cache\ntsconfig.tsbuildinfo\n.yarn/\nrecompile.sh\n\n.next/\nout/\nwebsite/public/sitemap.xml\nwebsite/public/_redirects\n.eslintcache\n\n**/cypress/screenshots\n**/cypress/videos\n"
  },
  {
    "path": ".husky/pre-commit",
    "content": "yarn lint-staged\n"
  },
  {
    "path": ".nvmrc",
    "content": "22\n"
  },
  {
    "path": ".prettierignore",
    "content": "dev-test/githunt-invalid/invalid.graphql\npackages/graphql-codegen-cli/tests/test-documents/invalid-schema.graphql\npackages/presets/gql-tag-operations/tests/fixtures/crlf-operation.ts\ndist/\nbuild/\n.next/\n.bob\nCHANGELOG.md\n.husky/_/\n.changeset/*.md\n\n# temporarily ignore follow files because prettier-ignore comments don't work in mdx2\n# see https://github.com/prettier/prettier/pull/12208\nwebsite/src/pages/docs/advanced/generated-files-colocation.mdx\nwebsite/src/pages/docs/advanced/how-does-it-work.mdx\nwebsite/src/pages/docs/config-reference/schema-field.mdx\nwebsite/src/pages/docs/getting-started/index.mdx\nwebsite/src/pages/docs/guides/graphql-server-apollo-yoga.mdx\nwebsite/src/pages/docs/guides/react.mdx\nwebsite/src/pages/plugins/index.mdx\nwebsite/src/pages/plugins/presets/near-operation-file-preset.mdx\n\ntemp/\nwebsite/out\nwebsite/.next\n\n# added because it blocks CI and when I try to format it locally nothing happens :)\nwebsite/src/components/live-demo/LiveDemo.tsx\n\n# This should be added bc our rust test setup for the SWC plugin does a string diff, and it fails\n# bc it compares imports with double quotes against the formatted perttier single quotes\npackages/presets/swc-plugin/tests/fixtures\n\n# Ignore intentional error files\npackages/graphql-codegen-cli/tests/test-files/schema-dir/error-schema.graphql\npackages/graphql-codegen-cli/tests/test-files/error-document.graphql\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\"rust-lang.rust-analyzer\", \"tamasfe.even-better-toml\"]\n}\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"name\": \"Run open test file\",\n      \"type\": \"node\",\n      \"request\": \"launch\",\n      \"runtimeArgs\": [\"--inspect-brk\", \"${workspaceRoot}/node_modules/.bin/vitest\", \"--runInBand\", \"${relativeFile}\"],\n      \"console\": \"integratedTerminal\",\n      \"internalConsoleOptions\": \"neverOpen\"\n    }\n  ]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"yaml.schemas\": {\n    \"./website/static/config.schema.json\": \"*codegen.*\"\n  },\n  \"eslint.useFlatConfig\": false,\n  \"editor.tabSize\": 2,\n  \"editor.insertSpaces\": true,\n  \"editor.rulers\": [80],\n  \"editor.wordWrapColumn\": 110,\n  \"prettier.semi\": true,\n  \"files.trimTrailingWhitespace\": true,\n  \"files.insertFinalNewline\": true,\n  \"prettier.singleQuote\": true,\n  \"prettier.printWidth\": 110,\n  \"files.exclude\": {\n    \"**/.git\": true,\n    \"**/.DS_Store\": true,\n    \"node_modules\": false,\n    \"test-lib\": true,\n    \"lib\": true,\n    \"coverage\": true,\n    \"npm\": true\n  },\n  \"typescript.tsdk\": \"node_modules/typescript/lib\",\n  \"editor.formatOnSave\": true,\n  \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n  \"[rust]\": {\n    \"editor.defaultFormatter\": \"rust-lang.rust-analyzer\",\n    \"editor.formatOnSave\": true\n  }\n}\n"
  },
  {
    "path": ".yarnrc",
    "content": "--ignore-engines true\n--network-timeout 1000000000"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Dotan Simha\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "<div>\n    <img src=\"./logo.svg\" width=\"150px\" alt=\"GraphQL Code Generator logo\"/>\n    <a href=\"https://the-guild.dev\">\n        <img align=\"right\" src=\"https://the-guild-org.github.io/press-kit/full-dark-logo.svg\" alt=\"Created by The Guild\" style=\"width: 100px;align:right;\"/> \n    </a>\n</div>\n\n[![npm version](https://badge.fury.io/js/%40graphql-codegen%2Fcli.svg)](https://badge.fury.io/js/%40graphql-codegen%2Fcli)\n\n[https://the-guild.dev/graphql/codegen](https://the-guild.dev/graphql/codegen)\n\nGraphQL Code Generator is a tool that generates code out of your GraphQL schema. Whether you are developing a frontend or backend, you can utilize GraphQL Code Generator to generate output from your GraphQL Schema and GraphQL Documents (query/mutation/subscription/fragment).\n\nBy analyzing the schema and documents and parsing it, GraphQL Code Generator can output code at a wide variety of formats, based on pre-defined templates or based on custom user-defined ones. Regardless of the language that you're using, GraphQL Code Generator has you covered.\n\nGraphQL Code Generator lets you choose the output that you need, based on _plugins_, which are very flexible and customizable. You can also write your _plugins_ to generate custom outputs that match your needs.\n\nYou can try this tool live on your browser and see some useful examples. Check out [GraphQL Code Generator Live Examples](https://the-guild.dev/graphql/codegen/#live-demo).\n\nWe currently support and maintain [these plugins](https://the-guild.dev/graphql/codegen/plugins) (TypeScript, Flow, React, Angular, MongoDB, Stencil, Reason, and some more), and there is an active community that writes and maintains custom plugins.\n\n## Quick Start\n\n> You can find the complete instructions in [GraphQL Code Generator website](https://the-guild.dev/graphql/codegen/docs/getting-started/installation).\n\nStart by installing the basic deps of GraphQL Codegen:\n\n```bash\nyarn add graphql\nyarn add -D @graphql-codegen/cli\n```\n\nGraphQL Code Generator lets you setup everything by simply running the following command:\n\n```bash\nyarn graphql-codegen init\n```\n\nQuestion by question, it will guide you through the whole process of setting up a schema, selecting plugins, picking a destination of a generated file, and a lot more.\n\nIf you wish to [manually setup codegen, follow these instructions](https://the-guild.dev/graphql/codegen/docs/getting-started/installation).\n\n## Links\n\nBesides our [docs page](https://the-guild.dev/graphql/codegen/docs/getting-started), feel free to go through our published Medium articles to get a better grasp of what GraphQL Code Generator is all about:\n\n- [All available plugins & presets](https://the-guild.dev/graphql/codegen/plugins)\n\n## Contributing\n\nIf this is your first time contributing to this project, please do read our [Contributor Workflow Guide](https://github.com/the-guild-org/Stack/blob/master/CONTRIBUTING.md) before you get started off.\n\nFeel free to open issues and pull requests. We're always welcome support from the community.\n\nFor a contribution guide specific to this project, please refer to: http://the-guild.dev/graphql/codegen/docs/custom-codegen/contributing.\n\n## Code of Conduct\n\nHelp us keep GraphQL Code Generator open and inclusive. Please read and follow our [Code of Conduct](https://github.com/the-guild-org/Stack/blob/master/CODE_OF_CONDUCT.md) as adopted from [Contributor Covenant](https://contributor-covenant.org)\n\n## License\n\n[![GitHub license](https://img.shields.io/badge/license-MIT-lightgrey.svg?maxAge=2592000)](https://raw.githubusercontent.com/apollostack/apollo-ios/master/LICENSE)\n\nMIT\n"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = {\n  presets: [\n    ['@babel/preset-env', { targets: { node: process.versions.node.split('.')[0] } }],\n    ['@babel/preset-typescript', { allowDeclareFields: true }],\n  ],\n};\n"
  },
  {
    "path": "dev-test/alt-codegen.yml",
    "content": "overwrite: true\nschema: 'test-schema/schema.graphql'\ndocuments:\n  - 'src/**/*.graphql'\n\ngenerates:\n  test-schema/schema.ts:\n    - typescript:\n        declarationKind: interface\n    - typescript-operations:\n        declarationKind: interface\n        defaultScalarType: unknown\n"
  },
  {
    "path": "dev-test/apollo-android/codegen.yml",
    "content": "schema:\n  - https://jpmbfqfpxvcujfn4d4e3lu2pga.appsync-api.us-east-1.amazonaws.com/graphql:\n      headers:\n        'x-api-key': da2-t2u7vtm33fattisq6vrrde56ui\ndocuments:\n  - /Users/dotansimha/Dev/test-app/app/src/main/graphql/com/amazonaws/amplify/generated/graphql/*.graphql\ngenerates:\n  generatedJava/:\n    preset: java-apollo-android\n    config:\n      package: com.app.generated.graphql\n      scalars:\n        AWSDate: Long\n    plugins:\n      - java-apollo-android\n"
  },
  {
    "path": "dev-test/apollo-android/schema.json",
    "content": "{\n  \"data\": {\n    \"__schema\": {\n      \"queryType\": {\n        \"name\": \"Query\"\n      },\n      \"mutationType\": {\n        \"name\": \"Mutation\"\n      },\n      \"subscriptionType\": {\n        \"name\": \"Subscription\"\n      },\n      \"types\": [\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Query\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"getTodo\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"SCALAR\",\n                      \"name\": \"ID\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Todo\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"listTodos\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"filter\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"INPUT_OBJECT\",\n                    \"name\": \"ModelTodoFilterInput\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"limit\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Int\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"nextToken\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"ModelTodoConnection\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Todo\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"ID\",\n          \"description\": \"Built-in ID\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"String\",\n          \"description\": \"Built-in String\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"ModelTodoConnection\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"items\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"Todo\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"nextToken\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"ModelTodoFilterInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"INPUT_OBJECT\",\n                \"name\": \"ModelIDFilterInput\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"INPUT_OBJECT\",\n                \"name\": \"ModelStringFilterInput\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"INPUT_OBJECT\",\n                \"name\": \"ModelStringFilterInput\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"and\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"INPUT_OBJECT\",\n                  \"name\": \"ModelTodoFilterInput\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"or\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"INPUT_OBJECT\",\n                  \"name\": \"ModelTodoFilterInput\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"not\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"INPUT_OBJECT\",\n                \"name\": \"ModelTodoFilterInput\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"ModelIDFilterInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"ne\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"eq\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"le\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"lt\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"ge\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"gt\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"contains\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"notContains\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"between\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"beginsWith\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"ModelStringFilterInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"ne\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"eq\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"le\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"lt\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"ge\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"gt\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"contains\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"notContains\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"between\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"beginsWith\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"Int\",\n          \"description\": \"Built-in Int\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Mutation\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"createTodo\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"input\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"CreateTodoInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Todo\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"updateTodo\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"input\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"UpdateTodoInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Todo\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"deleteTodo\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"input\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"DeleteTodoInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Todo\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"CreateTodoInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"UpdateTodoInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"DeleteTodoInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Subscription\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"onCreateTodo\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Todo\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onUpdateTodo\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Todo\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onDeleteTodo\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Todo\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"ModelFloatFilterInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"ne\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"eq\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"le\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"lt\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"ge\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"gt\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"contains\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"notContains\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"between\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Float\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"Float\",\n          \"description\": \"Built-in Float\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"ModelBooleanFilterInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"ne\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"eq\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"Boolean\",\n          \"description\": \"Built-in Boolean\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"ModelIntFilterInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"ne\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"eq\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"le\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"lt\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"ge\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"gt\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"contains\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"notContains\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"between\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Int\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"ENUM\",\n          \"name\": \"ModelSortDirection\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": [\n            {\n              \"name\": \"ASC\",\n              \"description\": null,\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"DESC\",\n              \"description\": null,\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Schema\",\n          \"description\": \"A GraphQL Introspection defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, the entry points for query, mutation, and subscription operations.\",\n          \"fields\": [\n            {\n              \"name\": \"types\",\n              \"description\": \"A list of all types supported by this server.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__Type\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"queryType\",\n              \"description\": \"The type that query operations will be rooted at.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"mutationType\",\n              \"description\": \"If this server supports mutation, the type that mutation operations will be rooted at.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"directives\",\n              \"description\": \"'A list of all directives supported by this server.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__Directive\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"subscriptionType\",\n              \"description\": \"'If this server support subscription, the type that subscription operations will be rooted at.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Type\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"kind\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"ENUM\",\n                  \"name\": \"__TypeKind\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"fields\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"includeDeprecated\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Boolean\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": \"false\"\n                }\n              ],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Field\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"interfaces\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Type\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"possibleTypes\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Type\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"enumValues\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"includeDeprecated\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Boolean\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": \"false\"\n                }\n              ],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__EnumValue\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"inputFields\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__InputValue\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ofType\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"ENUM\",\n          \"name\": \"__TypeKind\",\n          \"description\": \"An enum describing what kind of type a given __Type is\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": [\n            {\n              \"name\": \"SCALAR\",\n              \"description\": \"Indicates this type is a scalar.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"OBJECT\",\n              \"description\": \"Indicates this type is an object. `fields` and `interfaces` are valid fields.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INTERFACE\",\n              \"description\": \"Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"UNION\",\n              \"description\": \"Indicates this type is a union. `possibleTypes` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ENUM\",\n              \"description\": \"Indicates this type is an enum. `enumValues` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INPUT_OBJECT\",\n              \"description\": \"Indicates this type is an input object. `inputFields` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"LIST\",\n              \"description\": \"Indicates this type is a list. `ofType` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"NON_NULL\",\n              \"description\": \"Indicates this type is a non-null. `ofType` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Field\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"args\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__InputValue\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"type\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"isDeprecated\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"deprecationReason\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__InputValue\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"type\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"defaultValue\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__EnumValue\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"isDeprecated\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"deprecationReason\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Directive\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"locations\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"ENUM\",\n                    \"name\": \"__DirectiveLocation\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"args\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__InputValue\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onOperation\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": true,\n              \"deprecationReason\": \"Use `locations`.\"\n            },\n            {\n              \"name\": \"onFragment\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": true,\n              \"deprecationReason\": \"Use `locations`.\"\n            },\n            {\n              \"name\": \"onField\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": true,\n              \"deprecationReason\": \"Use `locations`.\"\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"ENUM\",\n          \"name\": \"__DirectiveLocation\",\n          \"description\": \"An enum describing valid locations where a directive can be placed\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": [\n            {\n              \"name\": \"QUERY\",\n              \"description\": \"Indicates the directive is valid on queries.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"MUTATION\",\n              \"description\": \"Indicates the directive is valid on mutations.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FIELD\",\n              \"description\": \"Indicates the directive is valid on fields.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FRAGMENT_DEFINITION\",\n              \"description\": \"Indicates the directive is valid on fragment definitions.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FRAGMENT_SPREAD\",\n              \"description\": \"Indicates the directive is valid on fragment spreads.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INLINE_FRAGMENT\",\n              \"description\": \"Indicates the directive is valid on inline fragments.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"SCHEMA\",\n              \"description\": \"Indicates the directive is valid on a schema SDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"SCALAR\",\n              \"description\": \"Indicates the directive is valid on a scalar SDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"OBJECT\",\n              \"description\": \"Indicates the directive is valid on an object SDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FIELD_DEFINITION\",\n              \"description\": \"Indicates the directive is valid on a field SDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ARGUMENT_DEFINITION\",\n              \"description\": \"Indicates the directive is valid on a field argument SDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INTERFACE\",\n              \"description\": \"Indicates the directive is valid on an interface SDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"UNION\",\n              \"description\": \"Indicates the directive is valid on an union SDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ENUM\",\n              \"description\": \"Indicates the directive is valid on an enum SDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ENUM_VALUE\",\n              \"description\": \"Indicates the directive is valid on an enum value SDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INPUT_OBJECT\",\n              \"description\": \"Indicates the directive is valid on an input object SDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INPUT_FIELD_DEFINITION\",\n              \"description\": \"Indicates the directive is valid on an input object field SDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"possibleTypes\": null\n        }\n      ],\n      \"directives\": [\n        {\n          \"name\": \"include\",\n          \"description\": \"Directs the executor to include this field or fragment only when the `if` argument is true\",\n          \"locations\": [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"],\n          \"args\": [\n            {\n              \"name\": \"if\",\n              \"description\": \"Included when true.\",\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"onOperation\": false,\n          \"onFragment\": true,\n          \"onField\": true\n        },\n        {\n          \"name\": \"skip\",\n          \"description\": \"Directs the executor to skip this field or fragment when the `if`'argument is true.\",\n          \"locations\": [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"],\n          \"args\": [\n            {\n              \"name\": \"if\",\n              \"description\": \"Skipped when true.\",\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"onOperation\": false,\n          \"onFragment\": true,\n          \"onField\": true\n        },\n        {\n          \"name\": \"defer\",\n          \"description\": \"This directive allows results to be deferred during execution\",\n          \"locations\": [\"FIELD\"],\n          \"args\": [],\n          \"onOperation\": false,\n          \"onFragment\": false,\n          \"onField\": true\n        },\n        {\n          \"name\": \"aws_auth\",\n          \"description\": \"Directs the schema to enforce authorization on a field\",\n          \"locations\": [\"FIELD_DEFINITION\"],\n          \"args\": [\n            {\n              \"name\": \"cognito_groups\",\n              \"description\": \"List of cognito user pool groups which have access on this field\",\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"onOperation\": false,\n          \"onFragment\": false,\n          \"onField\": false\n        },\n        {\n          \"name\": \"aws_publish\",\n          \"description\": \"Tells the service which subscriptions will be published to when this mutation is called. This directive is deprecated use @aws_susbscribe directive instead.\",\n          \"locations\": [\"FIELD_DEFINITION\"],\n          \"args\": [\n            {\n              \"name\": \"subscriptions\",\n              \"description\": \"List of subscriptions which will be published to when this mutation is called.\",\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"onOperation\": false,\n          \"onFragment\": false,\n          \"onField\": false\n        },\n        {\n          \"name\": \"aws_cognito_user_pools\",\n          \"description\": \"Tells the service this field/object has access authorized by a Cognito User Pools token.\",\n          \"locations\": [\"OBJECT\", \"FIELD_DEFINITION\"],\n          \"args\": [\n            {\n              \"name\": \"cognito_groups\",\n              \"description\": \"List of cognito user pool groups which have access on this field\",\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"onOperation\": false,\n          \"onFragment\": false,\n          \"onField\": false\n        },\n        {\n          \"name\": \"aws_subscribe\",\n          \"description\": \"Tells the service which mutation triggers this subscription.\",\n          \"locations\": [\"FIELD_DEFINITION\"],\n          \"args\": [\n            {\n              \"name\": \"mutations\",\n              \"description\": \"List of mutations which will trigger this subscription when they are called.\",\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"onOperation\": false,\n          \"onFragment\": false,\n          \"onField\": false\n        },\n        {\n          \"name\": \"aws_oidc\",\n          \"description\": \"Tells the service this field/object has access authorized by an OIDC token.\",\n          \"locations\": [\"OBJECT\", \"FIELD_DEFINITION\"],\n          \"args\": [],\n          \"onOperation\": false,\n          \"onFragment\": false,\n          \"onField\": false\n        },\n        {\n          \"name\": \"deprecated\",\n          \"description\": null,\n          \"locations\": [\"FIELD_DEFINITION\", \"ENUM_VALUE\"],\n          \"args\": [\n            {\n              \"name\": \"reason\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": \"\\\"No longer supported\\\"\"\n            }\n          ],\n          \"onOperation\": false,\n          \"onFragment\": false,\n          \"onField\": false\n        },\n        {\n          \"name\": \"aws_api_key\",\n          \"description\": \"Tells the service this field/object has access authorized by an API key.\",\n          \"locations\": [\"OBJECT\", \"FIELD_DEFINITION\"],\n          \"args\": [],\n          \"onOperation\": false,\n          \"onFragment\": false,\n          \"onField\": false\n        },\n        {\n          \"name\": \"aws_iam\",\n          \"description\": \"Tells the service this field/object has access authorized by sigv4 signing.\",\n          \"locations\": [\"OBJECT\", \"FIELD_DEFINITION\"],\n          \"args\": [],\n          \"onOperation\": false,\n          \"onFragment\": false,\n          \"onField\": false\n        }\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "dev-test/codegen.ts",
    "content": "import type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n  emitLegacyCommonJSImports: false,\n  generates: {\n    './dev-test/test-schema/resolvers-types.ts': {\n      schema: './dev-test/test-schema/schema-text.js',\n      plugins: ['typescript', 'typescript-resolvers'],\n    },\n    './dev-test/test-schema/flow-types.flow.js': {\n      schema: './dev-test/test-schema/schema.json',\n      plugins: ['flow', 'flow-resolvers'],\n    },\n    './dev-test/test-schema/resolvers-root.ts': {\n      schema: './dev-test/test-schema/schema-with-root.graphql',\n      plugins: ['typescript', 'typescript-resolvers'],\n    },\n    './dev-test/test-schema/resolvers-federation.ts': {\n      schema: './dev-test/test-schema/schema-federation.graphql',\n      config: { federation: true },\n      plugins: ['typescript', 'typescript-resolvers'],\n    },\n    './dev-test/test-schema/resolvers-stitching.ts': {\n      schema: './dev-test/test-schema/schema-text.js',\n      plugins: ['typescript', { 'typescript-resolvers': { noSchemaStitching: false } }],\n    },\n    './dev-test/test-schema/typings.ts': {\n      schema: './dev-test/test-schema/schema.json',\n      plugins: ['typescript', 'typescript-resolvers'],\n    },\n    './dev-test/test-schema/typings.avoidOptionals.ts': {\n      schema: './dev-test/test-schema/schema.json',\n      config: { avoidOptionals: true },\n      plugins: ['typescript'],\n    },\n    './dev-test/test-schema/typings.wrapped.ts': {\n      schema: './dev-test/test-schema/schema.json',\n      plugins: [\n        { add: { content: 'declare namespace GraphQL {' } },\n        { add: { placement: 'append', content: '}' } },\n        'typescript',\n        'typescript-operations',\n      ],\n    },\n    './dev-test/test-schema/env.types.ts': { schema: process.env.SCHEMA_PATH, plugins: ['typescript'] },\n    './dev-test/test-schema/typings.immutableTypes.ts': {\n      schema: './dev-test/test-schema/schema.json',\n      config: { imutableTypes: true },\n      plugins: ['typescript'],\n    },\n    './dev-test/test-schema/typings.enum.ts': {\n      schema: './dev-test/test-schema/schema-object.js',\n      plugins: ['typescript'],\n    },\n    './dev-test/githunt/graphql-declared-modules.d.ts': {\n      schema: './dev-test/githunt/schema.json',\n      documents: [\n        './dev-test/githunt/**/*.graphql',\n        './dev-test-outer-dir/githunt/**/*.graphql',\n        '!**/nothing-should-use-this-query.graphql',\n      ],\n      plugins: ['typescript-graphql-files-modules'],\n    },\n    './dev-test/githunt/typed-document-nodes.ts': {\n      schema: './dev-test/githunt/schema.json',\n      documents: './dev-test/githunt/**/*.graphql',\n      plugins: ['typescript', 'typescript-operations', 'typed-document-node'],\n    },\n    './dev-test/githunt/types.ts': {\n      schema: './dev-test/githunt/schema.json',\n      documents: './dev-test/githunt/**/*.graphql',\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/githunt/types.preResolveTypes.ts': {\n      schema: './dev-test/githunt/schema.json',\n      documents: './dev-test/githunt/**/*.graphql',\n      config: { preResolveTypes: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/githunt/types.onlyEnums.ts': {\n      schema: './dev-test/githunt/schema.json',\n      documents: './dev-test/githunt/**/*.graphql',\n      config: { onlyEnums: true },\n      plugins: ['typescript'],\n    },\n    './dev-test/githunt/types.preResolveTypes.onlyOperationTypes.ts': {\n      schema: './dev-test/githunt/schema.json',\n      documents: './dev-test/githunt/**/*.graphql',\n      config: { preResolveTypes: true, onlyOperationTypes: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/githunt/types.flatten.preResolveTypes.ts': {\n      schema: './dev-test/githunt/schema.json',\n      documents: './dev-test/githunt/**/*.graphql',\n      config: { preResolveTypes: true, flattenGeneratedTypes: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/githunt/types.enumsAsTypes.ts': {\n      schema: './dev-test/githunt/schema.json',\n      documents: './dev-test/githunt/**/*.graphql',\n      config: { enumsAsTypes: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/githunt/types.d.ts': {\n      schema: './dev-test/githunt/schema.json',\n      documents: './dev-test/githunt/**/*.graphql',\n      config: { enumsAsTypes: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/githunt/types.avoidOptionals.ts': {\n      schema: './dev-test/githunt/schema.json',\n      documents: './dev-test/githunt/**/*.graphql',\n      config: { avoidOptionals: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/githunt/types.immutableTypes.ts': {\n      schema: './dev-test/githunt/schema.json',\n      documents: './dev-test/githunt/**/*.graphql',\n      config: { immutableTypes: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/star-wars/types.ts': {\n      schema: './dev-test/star-wars/schema.json',\n      documents: './dev-test/star-wars/**/*.graphql',\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/star-wars/types.excludeQueryAlpha.ts': {\n      schema: './dev-test/star-wars/schema.json',\n      documents: ['./dev-test/star-wars/**/*.graphql', '!./dev-test/star-wars/**/ExcludeQueryAlpha.graphql'],\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/star-wars/types.excludeQueryBeta.ts': {\n      schema: './dev-test/star-wars/schema.json',\n      documents: ['./dev-test/star-wars/**/*.graphql', '!./dev-test/star-wars/**/ExcludeQueryBeta.graphql'],\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/star-wars/types.preResolveTypes.ts': {\n      schema: './dev-test/star-wars/schema.json',\n      documents: './dev-test/star-wars/**/*.graphql',\n      config: { preResolveTypes: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/star-wars/types.OnlyEnums.ts': {\n      schema: './dev-test/star-wars/schema.json',\n      documents: './dev-test/star-wars/**/*.graphql',\n      config: { onlyEnums: true },\n      plugins: ['typescript'],\n    },\n    './dev-test/star-wars/types.preResolveTypes.onlyOperationTypes.ts': {\n      schema: './dev-test/star-wars/schema.json',\n      documents: './dev-test/star-wars/**/*.graphql',\n      config: { preResolveTypes: true, onlyOperationTypes: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/test-schema/types.preResolveTypes.ts': {\n      schema: './dev-test/test-schema/schema.graphql',\n      documents: ['query test { testArr1 testArr2 testArr3 }'],\n      config: { preResolveTypes: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/test-schema/types.preResolveTypes.onlyOperationTypes.ts': {\n      schema: './dev-test/test-schema/schema.graphql',\n      documents: ['query test { testArr1 testArr2 testArr3 }'],\n      config: { preResolveTypes: true, onlyOperationTypes: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/star-wars/types.d.ts': {\n      schema: './dev-test/star-wars/schema.json',\n      config: { enumsAsTypes: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/modules/': {\n      schema: './dev-test/modules/*/types/*.graphql',\n      preset: 'graphql-modules',\n      presetConfig: { baseTypesPath: 'types.ts', filename: 'generated.ts' },\n      plugins: ['typescript', 'typescript-resolvers'],\n    },\n    './dev-test/star-wars/types.globallyAvailable.d.ts': {\n      schema: './dev-test/star-wars/schema.json',\n      documents: './dev-test/star-wars/**/*.graphql',\n      config: { enumsAsTypes: true, noExport: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/star-wars/types.avoidOptionals.ts': {\n      schema: './dev-test/star-wars/schema.json',\n      documents: './dev-test/star-wars/**/*.graphql',\n      config: { avoidOptionals: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/star-wars/types.immutableTypes.ts': {\n      schema: './dev-test/star-wars/schema.json',\n      documents: './dev-test/star-wars/**/*.graphql',\n      config: { immutableTypes: true },\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/star-wars/types.skipSchema.ts': {\n      schema: './dev-test/star-wars/schema.json',\n      documents: './dev-test/star-wars/**/*.graphql',\n      plugins: ['typescript', 'typescript-operations'],\n    },\n    './dev-test/gql-tag-operations/gql/': {\n      schema: './dev-test/gql-tag-operations/schema.graphql',\n      documents: './dev-test/gql-tag-operations/src/**/*.ts',\n      preset: 'client',\n    },\n    './dev-test/gql-tag-operations/graphql/': {\n      schema: './dev-test/gql-tag-operations/schema.graphql',\n      documents: './dev-test/gql-tag-operations/src/**/*.ts',\n      preset: 'client',\n    },\n    './dev-test/gql-tag-operations-urql/gql/': {\n      schema: './dev-test/gql-tag-operations-urql/schema.graphql',\n      documents: './dev-test/gql-tag-operations-urql/src/**/*.ts',\n      preset: 'client',\n      presetConfig: { augmentedModuleName: '@urql/core' },\n    },\n    './dev-test/gql-tag-operations-masking/gql/': {\n      schema: './dev-test/gql-tag-operations-masking/schema.graphql',\n      documents: './dev-test/gql-tag-operations-masking/src/**/*.tsx',\n      preset: 'client',\n      presetConfig: { fragmentMasking: true },\n    },\n    './dev-test/test-null-value/result.d.ts': {\n      schema: './dev-test/test-null-value/schema.graphql',\n      documents: ['./dev-test/test-null-value/query.ts'],\n      plugins: ['typescript', 'typescript-operations'],\n      config: {\n        // The combination of these two flags caused the following issue:\n        // https://github.com/dotansimha/graphql-code-generator/pull/9709\n        skipTypename: true,\n        mergeFragmentTypes: true,\n      },\n    },\n    './dev-test/subpath-import/result.d.ts': {\n      schema: './dev-test/subpath-import/schema.graphql',\n      plugins: ['typescript', 'typescript-resolvers'],\n      config: {\n        contextType: '\\\\#test-null-value/context#TestContext',\n        fieldContextTypes: ['mutation.createUser#\\\\#test/root#FiedContextType'],\n        enumValues: {\n          RoleStatus: '\\\\#changeName/server/drizzle/schema#RoleStatus',\n        },\n      },\n    },\n    './dev-test/test-federation/generated/types.ts': {\n      schema: './dev-test/test-federation/schema.gql',\n      plugins: ['typescript', 'typescript-resolvers'],\n      config: {\n        mapperTypeSuffix: 'Mapper',\n        enumsAsTypes: true,\n        useIndexSignature: true,\n        maybeValue: 'T | null | undefined',\n        scalars: {\n          CarKey: 'string',\n        },\n      },\n    },\n  },\n};\n\nexport default config;\n"
  },
  {
    "path": "dev-test/gatsby/fragments.ts",
    "content": "import gql from 'graphql-tag';\n\nexport const WPColumns = gql`\n  fragment WPColumns on WpCoreColumnsBlock {\n    __typename\n    attributes {\n      ... on WpCoreColumnsBlockAttributes {\n        align\n        verticalAlignment\n      }\n    }\n    innerBlocks {\n      ...WpColumnFields\n      ...WpCoreImageBlockFragment\n      ...WpCoreGalleryBlockFragment\n      innerBlocks {\n        __typename\n        ...WpCoreImageBlockForGalleryFragment\n        ...WpCoreGalleryBlockFragment\n        saveContent\n        dynamicContent\n        isDynamic\n        #\n        ... on WpCoreGalleryBlock {\n          __typename\n          ...WpCoreGalleryBlockFragment\n\n          innerBlocks {\n            __typename\n            ...WpCoreImageBlockForGalleryFragment\n          }\n        }\n        ... on WpCoreColumnsBlock {\n          innerBlocks {\n            ...WpColumnFields\n            innerBlocks {\n              ...WpCoreImageBlockFragment\n              ...WpCoreGalleryBlockFragment\n              ... on WpCoreColumnsBlock {\n                innerBlocks {\n                  ...WpColumnFields\n                  innerBlocks {\n                    ...WpCoreImageBlockForGalleryFragment\n                    ...WpCoreGalleryBlockFragment\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n`;\n\nexport const wpColumnFields = gql`\n  fragment WpColumnFields on WpCoreColumnBlock {\n    __typename\n    saveContent\n    dynamicContent\n    isDynamic\n    attributes {\n      __typename\n    }\n  }\n`;\n\nexport const WpCoreImageBlockFragment = gql`\n  fragment WpCoreImageBlockFragment on WpCoreImageBlock {\n    __typename\n    saveContent\n    originalContent\n    attributes {\n      __typename\n      ... on WpCoreImageBlockAttributes {\n        id\n        alt\n        caption\n        width\n        title\n        height\n        linkTarget\n        url\n        imageFluid {\n          childImageSharp {\n            gatsbyImageData(quality: 100, layout: FULL_WIDTH)\n          }\n        }\n      }\n    }\n  }\n`;\n\nexport const WpCoreImageBlockForGalleryFragment = gql`\n  fragment WpCoreImageBlockForGalleryFragment on WpCoreImageBlock {\n    __typename\n    saveContent\n    attributes {\n      __typename\n      ... on WpCoreImageBlockAttributes {\n        id\n        alt\n        caption\n        width\n        title\n        height\n        linkTarget\n        url\n        imageFluid {\n          childImageSharp {\n            full: gatsbyImageData(quality: 100, layout: FULL_WIDTH)\n            thumbnail: gatsbyImageData(layout: CONSTRAINED)\n          }\n        }\n      }\n    }\n  }\n`;\n\nexport const WpCoreParagraphBlockFragment = gql`\n  fragment WpCoreParagraphBlockFragment on WpCoreParagraphBlock {\n    __typename\n    saveContent\n    isDynamic\n    dynamicContent\n  }\n`;\n\nexport const WpCoreGalleryBlockFragment = gql`\n  fragment WpCoreGalleryBlockFragment on WpCoreGalleryBlock {\n    dynamicContent\n    attributes {\n      ... on WpCoreGalleryBlockAttributes {\n        align\n        anchor\n        ids\n        caption\n        images {\n          id\n          url\n          link\n          alt\n          caption\n        }\n        className\n      }\n    }\n  }\n`;\n"
  },
  {
    "path": "dev-test/gatsby/schema.graphql",
    "content": "\"\"\"\nDefine parent-child relations between types. This is used to add `child*` and `children*` convenience fields like `childImageSharp`.\n\"\"\"\ndirective @childOf(\n  \"\"\"\n  A list of mime-types this type is a child of. Usually these are the mime-types handled by a transformer plugin.\n  \"\"\"\n  mimeTypes: [String!]! = []\n\n  \"\"\"\n  A list of types this type is a child of. Usually these are the types handled by a transformer plugin.\n  \"\"\"\n  types: [String!]! = []\n) on OBJECT\n\n\"\"\"\nAdd date formatting options.\n\"\"\"\ndirective @dateformat(difference: String, formatString: String, fromNow: Boolean, locale: String) on FIELD_DEFINITION\n\n\"\"\"\nDo not infer field types from field values.\n\"\"\"\ndirective @dontInfer on OBJECT\n\n\"\"\"\nLink to File node by relative path.\n\"\"\"\ndirective @fileByRelativePath(from: String) on FIELD_DEFINITION\n\n\"\"\"\nInfer field types from field values.\n\"\"\"\ndirective @infer on OBJECT\n\n\"\"\"\nLink to node by foreign-key relation.\n\"\"\"\ndirective @link(by: String! = \"id\", from: String, on: String) on FIELD_DEFINITION\n\n\"\"\"\nDefine the mime-types handled by this type.\n\"\"\"\ndirective @mimeTypes(\n  \"\"\"\n  The mime-types handled by this type.\n  \"\"\"\n  types: [String!]! = []\n) on OBJECT\n\n\"\"\"\nDEPRECATED: Use interface inheritance instead, i.e. \"interface Foo implements Node\".\n\nAdds root query fields for an interface. All implementing types must also implement the Node interface.\n\"\"\"\ndirective @nodeInterface on INTERFACE\n\n\"\"\"\nProxy resolver from another field.\n\"\"\"\ndirective @proxy(from: String!, fromNode: Boolean! = false) on FIELD_DEFINITION\n\ninput AVIFOptions {\n  lossless: Boolean\n  quality: Int\n  speed: Int\n}\n\ninput BlurredOptions {\n  \"\"\"\n  Force the output format for the low-res preview. Default is to use the same format as the input. You should rarely need to change this\n  \"\"\"\n  toFormat: ImageFormat\n\n  \"\"\"\n  Width of the generated low-res preview. Default is 20px\n  \"\"\"\n  width: Int\n}\n\ninput BooleanQueryOperatorInput {\n  eq: Boolean\n  in: [Boolean]\n  ne: Boolean\n  nin: [Boolean]\n}\n\n\"\"\"\nA date string, such as 2007-12-03, compliant with the ISO 8601 standard for representation of dates and times using the Gregorian calendar.\n\"\"\"\nscalar Date\n\ninput DateQueryOperatorInput {\n  eq: Date\n  gt: Date\n  gte: Date\n  in: [Date]\n  lt: Date\n  lte: Date\n  ne: Date\n  nin: [Date]\n}\n\ntype Directory implements Node {\n  absolutePath: String!\n  accessTime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  atime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  atimeMs: Float!\n  base: String!\n  birthTime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  birthtime: Date @deprecated(reason: \"Use `birthTime` instead\")\n  birthtimeMs: Float @deprecated(reason: \"Use `birthTime` instead\")\n  changeTime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  children: [Node!]!\n  ctime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  ctimeMs: Float!\n  dev: Int!\n  dir: String!\n  ext: String!\n  extension: String!\n  gid: Int!\n  id: ID!\n  ino: Float!\n  internal: Internal!\n  mode: Int!\n  modifiedTime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  mtime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  mtimeMs: Float!\n  name: String!\n  nlink: Int!\n  parent: Node\n  prettySize: String!\n  rdev: Int!\n  relativeDirectory: String!\n  relativePath: String!\n  root: String!\n  size: Int!\n  sourceInstanceName: String!\n  uid: Int!\n}\n\ntype DirectoryConnection {\n  distinct(field: DirectoryFieldsEnum!): [String!]!\n  edges: [DirectoryEdge!]!\n  group(field: DirectoryFieldsEnum!, limit: Int, skip: Int): [DirectoryGroupConnection!]!\n  max(field: DirectoryFieldsEnum!): Float\n  min(field: DirectoryFieldsEnum!): Float\n  nodes: [Directory!]!\n  pageInfo: PageInfo!\n  sum(field: DirectoryFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype DirectoryEdge {\n  next: Directory\n  node: Directory!\n  previous: Directory\n}\n\nenum DirectoryFieldsEnum {\n  absolutePath\n  accessTime\n  atime\n  atimeMs\n  base\n  birthTime\n  birthtime\n  birthtimeMs\n  changeTime\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  ctime\n  ctimeMs\n  dev\n  dir\n  ext\n  extension\n  gid\n  id\n  ino\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  mode\n  modifiedTime\n  mtime\n  mtimeMs\n  name\n  nlink\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  prettySize\n  rdev\n  relativeDirectory\n  relativePath\n  root\n  size\n  sourceInstanceName\n  uid\n}\n\ninput DirectoryFilterInput {\n  absolutePath: StringQueryOperatorInput\n  accessTime: DateQueryOperatorInput\n  atime: DateQueryOperatorInput\n  atimeMs: FloatQueryOperatorInput\n  base: StringQueryOperatorInput\n  birthTime: DateQueryOperatorInput\n  birthtime: DateQueryOperatorInput\n  birthtimeMs: FloatQueryOperatorInput\n  changeTime: DateQueryOperatorInput\n  children: NodeFilterListInput\n  ctime: DateQueryOperatorInput\n  ctimeMs: FloatQueryOperatorInput\n  dev: IntQueryOperatorInput\n  dir: StringQueryOperatorInput\n  ext: StringQueryOperatorInput\n  extension: StringQueryOperatorInput\n  gid: IntQueryOperatorInput\n  id: StringQueryOperatorInput\n  ino: FloatQueryOperatorInput\n  internal: InternalFilterInput\n  mode: IntQueryOperatorInput\n  modifiedTime: DateQueryOperatorInput\n  mtime: DateQueryOperatorInput\n  mtimeMs: FloatQueryOperatorInput\n  name: StringQueryOperatorInput\n  nlink: IntQueryOperatorInput\n  parent: NodeFilterInput\n  prettySize: StringQueryOperatorInput\n  rdev: IntQueryOperatorInput\n  relativeDirectory: StringQueryOperatorInput\n  relativePath: StringQueryOperatorInput\n  root: StringQueryOperatorInput\n  size: IntQueryOperatorInput\n  sourceInstanceName: StringQueryOperatorInput\n  uid: IntQueryOperatorInput\n}\n\ntype DirectoryGroupConnection {\n  distinct(field: DirectoryFieldsEnum!): [String!]!\n  edges: [DirectoryEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: DirectoryFieldsEnum!, limit: Int, skip: Int): [DirectoryGroupConnection!]!\n  max(field: DirectoryFieldsEnum!): Float\n  min(field: DirectoryFieldsEnum!): Float\n  nodes: [Directory!]!\n  pageInfo: PageInfo!\n  sum(field: DirectoryFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput DirectorySortInput {\n  fields: [DirectoryFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\ninput DuotoneGradient {\n  highlight: String!\n  opacity: Int\n  shadow: String!\n}\n\ntype File implements Node {\n  absolutePath: String!\n  accessTime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  atime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  atimeMs: Float!\n  base: String!\n  birthTime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  birthtime: Date @deprecated(reason: \"Use `birthTime` instead\")\n  birthtimeMs: Float @deprecated(reason: \"Use `birthTime` instead\")\n  blksize: Int\n  blocks: Int\n  changeTime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n\n  \"\"\"\n  Returns the first child node of type ImageSharp or null if there are no children of given type on this node\n  \"\"\"\n  childImageSharp: ImageSharp\n  children: [Node!]!\n\n  \"\"\"\n  Returns all children nodes filtered by type ImageSharp\n  \"\"\"\n  childrenImageSharp: [ImageSharp]\n  ctime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  ctimeMs: Float!\n  dev: Int!\n  dir: String!\n  ext: String!\n  extension: String!\n  gid: Int!\n  hash: String\n  id: ID!\n  ino: Float!\n  internal: Internal!\n  mode: Int!\n  modifiedTime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  mtime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date!\n  mtimeMs: Float!\n  name: String!\n  nlink: Int!\n  parent: Node\n  prettySize: String!\n\n  \"\"\"\n  Copy file to static directory and return public url to it\n  \"\"\"\n  publicURL: String\n  rdev: Int!\n  relativeDirectory: String!\n  relativePath: String!\n  root: String!\n  size: Int!\n  sourceInstanceName: String!\n  uid: Int!\n}\n\ntype FileConnection {\n  distinct(field: FileFieldsEnum!): [String!]!\n  edges: [FileEdge!]!\n  group(field: FileFieldsEnum!, limit: Int, skip: Int): [FileGroupConnection!]!\n  max(field: FileFieldsEnum!): Float\n  min(field: FileFieldsEnum!): Float\n  nodes: [File!]!\n  pageInfo: PageInfo!\n  sum(field: FileFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype FileEdge {\n  next: File\n  node: File!\n  previous: File\n}\n\nenum FileFieldsEnum {\n  absolutePath\n  accessTime\n  atime\n  atimeMs\n  base\n  birthTime\n  birthtime\n  birthtimeMs\n  blksize\n  blocks\n  changeTime\n  childImageSharp___children\n  childImageSharp___children___children\n  childImageSharp___children___children___children\n  childImageSharp___children___children___id\n  childImageSharp___children___id\n  childImageSharp___children___internal___content\n  childImageSharp___children___internal___contentDigest\n  childImageSharp___children___internal___description\n  childImageSharp___children___internal___fieldOwners\n  childImageSharp___children___internal___ignoreType\n  childImageSharp___children___internal___mediaType\n  childImageSharp___children___internal___owner\n  childImageSharp___children___internal___type\n  childImageSharp___children___parent___children\n  childImageSharp___children___parent___id\n  childImageSharp___fixed___aspectRatio\n  childImageSharp___fixed___base64\n  childImageSharp___fixed___height\n  childImageSharp___fixed___originalName\n  childImageSharp___fixed___src\n  childImageSharp___fixed___srcSet\n  childImageSharp___fixed___srcSetWebp\n  childImageSharp___fixed___srcWebp\n  childImageSharp___fixed___tracedSVG\n  childImageSharp___fixed___width\n  childImageSharp___fluid___aspectRatio\n  childImageSharp___fluid___base64\n  childImageSharp___fluid___originalImg\n  childImageSharp___fluid___originalName\n  childImageSharp___fluid___presentationHeight\n  childImageSharp___fluid___presentationWidth\n  childImageSharp___fluid___sizes\n  childImageSharp___fluid___src\n  childImageSharp___fluid___srcSet\n  childImageSharp___fluid___srcSetWebp\n  childImageSharp___fluid___srcWebp\n  childImageSharp___fluid___tracedSVG\n  childImageSharp___gatsbyImageData\n  childImageSharp___id\n  childImageSharp___internal___content\n  childImageSharp___internal___contentDigest\n  childImageSharp___internal___description\n  childImageSharp___internal___fieldOwners\n  childImageSharp___internal___ignoreType\n  childImageSharp___internal___mediaType\n  childImageSharp___internal___owner\n  childImageSharp___internal___type\n  childImageSharp___original___height\n  childImageSharp___original___src\n  childImageSharp___original___width\n  childImageSharp___parent___children\n  childImageSharp___parent___children___children\n  childImageSharp___parent___children___id\n  childImageSharp___parent___id\n  childImageSharp___parent___internal___content\n  childImageSharp___parent___internal___contentDigest\n  childImageSharp___parent___internal___description\n  childImageSharp___parent___internal___fieldOwners\n  childImageSharp___parent___internal___ignoreType\n  childImageSharp___parent___internal___mediaType\n  childImageSharp___parent___internal___owner\n  childImageSharp___parent___internal___type\n  childImageSharp___parent___parent___children\n  childImageSharp___parent___parent___id\n  childImageSharp___resize___aspectRatio\n  childImageSharp___resize___height\n  childImageSharp___resize___originalName\n  childImageSharp___resize___src\n  childImageSharp___resize___tracedSVG\n  childImageSharp___resize___width\n  children\n  childrenImageSharp\n  childrenImageSharp___children\n  childrenImageSharp___children___children\n  childrenImageSharp___children___children___children\n  childrenImageSharp___children___children___id\n  childrenImageSharp___children___id\n  childrenImageSharp___children___internal___content\n  childrenImageSharp___children___internal___contentDigest\n  childrenImageSharp___children___internal___description\n  childrenImageSharp___children___internal___fieldOwners\n  childrenImageSharp___children___internal___ignoreType\n  childrenImageSharp___children___internal___mediaType\n  childrenImageSharp___children___internal___owner\n  childrenImageSharp___children___internal___type\n  childrenImageSharp___children___parent___children\n  childrenImageSharp___children___parent___id\n  childrenImageSharp___fixed___aspectRatio\n  childrenImageSharp___fixed___base64\n  childrenImageSharp___fixed___height\n  childrenImageSharp___fixed___originalName\n  childrenImageSharp___fixed___src\n  childrenImageSharp___fixed___srcSet\n  childrenImageSharp___fixed___srcSetWebp\n  childrenImageSharp___fixed___srcWebp\n  childrenImageSharp___fixed___tracedSVG\n  childrenImageSharp___fixed___width\n  childrenImageSharp___fluid___aspectRatio\n  childrenImageSharp___fluid___base64\n  childrenImageSharp___fluid___originalImg\n  childrenImageSharp___fluid___originalName\n  childrenImageSharp___fluid___presentationHeight\n  childrenImageSharp___fluid___presentationWidth\n  childrenImageSharp___fluid___sizes\n  childrenImageSharp___fluid___src\n  childrenImageSharp___fluid___srcSet\n  childrenImageSharp___fluid___srcSetWebp\n  childrenImageSharp___fluid___srcWebp\n  childrenImageSharp___fluid___tracedSVG\n  childrenImageSharp___gatsbyImageData\n  childrenImageSharp___id\n  childrenImageSharp___internal___content\n  childrenImageSharp___internal___contentDigest\n  childrenImageSharp___internal___description\n  childrenImageSharp___internal___fieldOwners\n  childrenImageSharp___internal___ignoreType\n  childrenImageSharp___internal___mediaType\n  childrenImageSharp___internal___owner\n  childrenImageSharp___internal___type\n  childrenImageSharp___original___height\n  childrenImageSharp___original___src\n  childrenImageSharp___original___width\n  childrenImageSharp___parent___children\n  childrenImageSharp___parent___children___children\n  childrenImageSharp___parent___children___id\n  childrenImageSharp___parent___id\n  childrenImageSharp___parent___internal___content\n  childrenImageSharp___parent___internal___contentDigest\n  childrenImageSharp___parent___internal___description\n  childrenImageSharp___parent___internal___fieldOwners\n  childrenImageSharp___parent___internal___ignoreType\n  childrenImageSharp___parent___internal___mediaType\n  childrenImageSharp___parent___internal___owner\n  childrenImageSharp___parent___internal___type\n  childrenImageSharp___parent___parent___children\n  childrenImageSharp___parent___parent___id\n  childrenImageSharp___resize___aspectRatio\n  childrenImageSharp___resize___height\n  childrenImageSharp___resize___originalName\n  childrenImageSharp___resize___src\n  childrenImageSharp___resize___tracedSVG\n  childrenImageSharp___resize___width\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  ctime\n  ctimeMs\n  dev\n  dir\n  ext\n  extension\n  gid\n  hash\n  id\n  ino\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  mode\n  modifiedTime\n  mtime\n  mtimeMs\n  name\n  nlink\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  prettySize\n  publicURL\n  rdev\n  relativeDirectory\n  relativePath\n  root\n  size\n  sourceInstanceName\n  uid\n}\n\ninput FileFilterInput {\n  absolutePath: StringQueryOperatorInput\n  accessTime: DateQueryOperatorInput\n  atime: DateQueryOperatorInput\n  atimeMs: FloatQueryOperatorInput\n  base: StringQueryOperatorInput\n  birthTime: DateQueryOperatorInput\n  birthtime: DateQueryOperatorInput\n  birthtimeMs: FloatQueryOperatorInput\n  blksize: IntQueryOperatorInput\n  blocks: IntQueryOperatorInput\n  changeTime: DateQueryOperatorInput\n  childImageSharp: ImageSharpFilterInput\n  children: NodeFilterListInput\n  childrenImageSharp: ImageSharpFilterListInput\n  ctime: DateQueryOperatorInput\n  ctimeMs: FloatQueryOperatorInput\n  dev: IntQueryOperatorInput\n  dir: StringQueryOperatorInput\n  ext: StringQueryOperatorInput\n  extension: StringQueryOperatorInput\n  gid: IntQueryOperatorInput\n  hash: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  ino: FloatQueryOperatorInput\n  internal: InternalFilterInput\n  mode: IntQueryOperatorInput\n  modifiedTime: DateQueryOperatorInput\n  mtime: DateQueryOperatorInput\n  mtimeMs: FloatQueryOperatorInput\n  name: StringQueryOperatorInput\n  nlink: IntQueryOperatorInput\n  parent: NodeFilterInput\n  prettySize: StringQueryOperatorInput\n  publicURL: StringQueryOperatorInput\n  rdev: IntQueryOperatorInput\n  relativeDirectory: StringQueryOperatorInput\n  relativePath: StringQueryOperatorInput\n  root: StringQueryOperatorInput\n  size: IntQueryOperatorInput\n  sourceInstanceName: StringQueryOperatorInput\n  uid: IntQueryOperatorInput\n}\n\ntype FileGroupConnection {\n  distinct(field: FileFieldsEnum!): [String!]!\n  edges: [FileEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: FileFieldsEnum!, limit: Int, skip: Int): [FileGroupConnection!]!\n  max(field: FileFieldsEnum!): Float\n  min(field: FileFieldsEnum!): Float\n  nodes: [File!]!\n  pageInfo: PageInfo!\n  sum(field: FileFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput FileSortInput {\n  fields: [FileFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\ninput FloatQueryOperatorInput {\n  eq: Float\n  gt: Float\n  gte: Float\n  in: [Float]\n  lt: Float\n  lte: Float\n  ne: Float\n  nin: [Float]\n}\n\nenum GatsbyImageFormat {\n  AUTO\n  AVIF\n  JPG\n  NO_CHANGE\n  PNG\n  WEBP\n}\n\nenum GatsbyImageLayout {\n  CONSTRAINED\n  FIXED\n  FULL_WIDTH\n}\n\nenum GatsbyImagePlaceholder {\n  BLURRED\n  DOMINANT_COLOR\n  NONE\n  TRACED_SVG\n}\n\ninput IDQueryOperatorInput {\n  eq: ID\n  in: [ID]\n  ne: ID\n  nin: [ID]\n}\n\nenum ImageCropFocus {\n  ATTENTION\n  CENTER\n  EAST\n  ENTROPY\n  NORTH\n  NORTHEAST\n  NORTHWEST\n  SOUTH\n  SOUTHEAST\n  SOUTHWEST\n  WEST\n}\n\nenum ImageFit {\n  CONTAIN\n  COVER\n  FILL\n  INSIDE\n  OUTSIDE\n}\n\nenum ImageFormat {\n  AUTO\n  AVIF\n  JPG\n  NO_CHANGE\n  PNG\n  WEBP\n}\n\nenum ImageLayout {\n  CONSTRAINED\n  FIXED\n  FULL_WIDTH\n}\n\nenum ImagePlaceholder {\n  BLURRED\n  DOMINANT_COLOR\n  NONE\n  TRACED_SVG\n}\n\ntype ImageSharp implements Node {\n  children: [Node!]!\n  fixed(\n    background: String = \"rgba(0,0,0,1)\"\n    base64Width: Int\n    cropFocus: ImageCropFocus = ATTENTION\n    duotone: DuotoneGradient\n    fit: ImageFit = COVER\n    grayscale: Boolean = false\n    height: Int\n    jpegProgressive: Boolean = true\n    jpegQuality: Int\n    pngCompressionSpeed: Int = 4\n    pngQuality: Int\n    quality: Int\n    rotate: Int = 0\n    toFormat: ImageFormat = AUTO\n    toFormatBase64: ImageFormat = AUTO\n    traceSVG: Potrace\n    trim: Float = 0\n    webpQuality: Int\n    width: Int\n  ): ImageSharpFixed\n  fluid(\n    background: String = \"rgba(0,0,0,1)\"\n    base64Width: Int\n    cropFocus: ImageCropFocus = ATTENTION\n    duotone: DuotoneGradient\n    fit: ImageFit = COVER\n    grayscale: Boolean = false\n    jpegProgressive: Boolean = true\n    jpegQuality: Int\n    maxHeight: Int\n    maxWidth: Int\n    pngCompressionSpeed: Int = 4\n    pngQuality: Int\n    quality: Int\n    rotate: Int = 0\n    sizes: String = \"\"\n\n    \"\"\"\n    A list of image widths to be generated. Example: [ 200, 340, 520, 890 ]\n    \"\"\"\n    srcSetBreakpoints: [Int] = []\n    toFormat: ImageFormat = AUTO\n    toFormatBase64: ImageFormat = AUTO\n    traceSVG: Potrace\n    trim: Float = 0\n    webpQuality: Int\n  ): ImageSharpFluid\n  gatsbyImageData(\n    \"\"\"\n    If set along with width or height, this will set the value of the other dimension to match the provided aspect ratio, cropping the image if needed.\n    If neither width or height is provided, height will be set based on the intrinsic width of the source image.\n    \"\"\"\n    aspectRatio: Float\n\n    \"\"\"\n    Options to pass to sharp when generating AVIF images.\n    \"\"\"\n    avifOptions: AVIFOptions\n\n    \"\"\"\n    Background color applied to the wrapper. Also passed to sharp to use as a background when \"letterboxing\" an image to another aspect ratio.\n    \"\"\"\n    backgroundColor: String\n\n    \"\"\"\n    Options for the low-resolution placeholder image. Set placeholder to \"BLURRED\" to use this\n    \"\"\"\n    blurredOptions: BlurredOptions\n\n    \"\"\"\n    Specifies the image widths to generate. For FIXED and CONSTRAINED images it is better to allow these to be determined automatically,\n    based on the image size. For FULL_WIDTH images this can be used to override the default, which is [750, 1080, 1366, 1920].\n    It will never generate any images larger than the source.\n    \"\"\"\n    breakpoints: [Int]\n\n    \"\"\"\n    The image formats to generate. Valid values are \"AUTO\" (meaning the same format as the source image), \"JPG\", \"PNG\", \"WEBP\" and \"AVIF\".\n    The default value is [AUTO, WEBP], and you should rarely need to change this. Take care if you specify JPG or PNG when you do\n    not know the formats of the source images, as this could lead to unwanted results such as converting JPEGs to PNGs. Specifying\n    both PNG and JPG is not supported and will be ignored.\n    \"\"\"\n    formats: [ImageFormat]\n\n    \"\"\"\n    The display height of the generated image for layout = FIXED, and the maximum display height of the largest image for layout = CONSTRAINED.\n    The image will be cropped if the aspect ratio does not match the source image. If omitted, it is calculated from the supplied width,\n    matching the aspect ratio of the source image.\n    \"\"\"\n    height: Int\n\n    \"\"\"\n    Options to pass to sharp when generating JPG images.\n    \"\"\"\n    jpgOptions: JPGOptions\n\n    \"\"\"\n    The layout for the image.\n    FIXED: A static image sized, that does not resize according to the screen width\n    FULL_WIDTH: The image resizes to fit its container. Pass a \"sizes\" option if it isn't going to be the full width of the screen.\n    CONSTRAINED: Resizes to fit its container, up to a maximum width, at which point it will remain fixed in size.\n    \"\"\"\n    layout: ImageLayout = CONSTRAINED\n\n    \"\"\"\n    A list of image pixel densities to generate. It will never generate images larger than the source, and will always include a 1x image.\n    Default is [ 1, 2 ] for FIXED images, meaning 1x and 2x and [0.25, 0.5, 1, 2] for CONSTRAINED. In this case, an image with a constrained layout\n    and width = 400 would generate images at 100, 200, 400 and 800px wide. Ignored for FULL_WIDTH images, which use breakpoints instead\n    \"\"\"\n    outputPixelDensities: [Float]\n\n    \"\"\"\n    Format of generated placeholder image, displayed while the main image loads.\n    BLURRED: a blurred, low resolution image, encoded as a base64 data URI (default)\n    DOMINANT_COLOR: a solid color, calculated from the dominant color of the image.\n    TRACED_SVG: a low-resolution traced SVG of the image.\n    NONE: no placeholder. Set \"background\" to use a fixed background color.\n    \"\"\"\n    placeholder: ImagePlaceholder\n\n    \"\"\"\n    Options to pass to sharp when generating PNG images.\n    \"\"\"\n    pngOptions: PNGOptions\n\n    \"\"\"\n    The default quality. This is overridden by any format-specific options\n    \"\"\"\n    quality: Int\n\n    \"\"\"\n    The \"sizes\" property, passed to the img tag. This describes the display size of the image.\n    This does not affect the generated images, but is used by the browser to decide which images to download.\n    You should usually leave this blank, and a suitable value will be calculated. The exception is if a FULL_WIDTH image\n    does not actually span the full width of the screen, in which case you should pass the correct size here.\n    \"\"\"\n    sizes: String\n\n    \"\"\"\n    Options for traced placeholder SVGs. You also should set placeholder to \"TRACED_SVG\".\n    \"\"\"\n    tracedSVGOptions: Potrace\n\n    \"\"\"\n    Options to pass to sharp to control cropping and other image manipulations.\n    \"\"\"\n    transformOptions: TransformOptions\n\n    \"\"\"\n    Options to pass to sharp when generating WebP images.\n    \"\"\"\n    webpOptions: WebPOptions\n\n    \"\"\"\n    The display width of the generated image for layout = FIXED, and the maximum display width of the largest image for layout = CONSTRAINED.\n    Ignored if layout = FLUID.\n    \"\"\"\n    width: Int\n  ): JSON!\n  id: ID!\n  internal: Internal!\n  original: ImageSharpOriginal\n  parent: Node\n  resize(\n    background: String = \"rgba(0,0,0,1)\"\n    base64: Boolean = false\n    cropFocus: ImageCropFocus = ATTENTION\n    duotone: DuotoneGradient\n    fit: ImageFit = COVER\n    grayscale: Boolean = false\n    height: Int\n    jpegProgressive: Boolean = true\n    jpegQuality: Int\n    pngCompressionLevel: Int = 9\n    pngCompressionSpeed: Int = 4\n    pngQuality: Int\n    quality: Int\n    rotate: Int = 0\n    toFormat: ImageFormat = AUTO\n    traceSVG: Potrace\n    trim: Float = 0\n    webpQuality: Int\n    width: Int\n  ): ImageSharpResize\n}\n\ntype ImageSharpConnection {\n  distinct(field: ImageSharpFieldsEnum!): [String!]!\n  edges: [ImageSharpEdge!]!\n  group(field: ImageSharpFieldsEnum!, limit: Int, skip: Int): [ImageSharpGroupConnection!]!\n  max(field: ImageSharpFieldsEnum!): Float\n  min(field: ImageSharpFieldsEnum!): Float\n  nodes: [ImageSharp!]!\n  pageInfo: PageInfo!\n  sum(field: ImageSharpFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype ImageSharpEdge {\n  next: ImageSharp\n  node: ImageSharp!\n  previous: ImageSharp\n}\n\nenum ImageSharpFieldsEnum {\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  fixed___aspectRatio\n  fixed___base64\n  fixed___height\n  fixed___originalName\n  fixed___src\n  fixed___srcSet\n  fixed___srcSetWebp\n  fixed___srcWebp\n  fixed___tracedSVG\n  fixed___width\n  fluid___aspectRatio\n  fluid___base64\n  fluid___originalImg\n  fluid___originalName\n  fluid___presentationHeight\n  fluid___presentationWidth\n  fluid___sizes\n  fluid___src\n  fluid___srcSet\n  fluid___srcSetWebp\n  fluid___srcWebp\n  fluid___tracedSVG\n  gatsbyImageData\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  original___height\n  original___src\n  original___width\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  resize___aspectRatio\n  resize___height\n  resize___originalName\n  resize___src\n  resize___tracedSVG\n  resize___width\n}\n\ninput ImageSharpFilterInput {\n  children: NodeFilterListInput\n  fixed: ImageSharpFixedFilterInput\n  fluid: ImageSharpFluidFilterInput\n  gatsbyImageData: JSONQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  original: ImageSharpOriginalFilterInput\n  parent: NodeFilterInput\n  resize: ImageSharpResizeFilterInput\n}\n\ninput ImageSharpFilterListInput {\n  elemMatch: ImageSharpFilterInput\n}\n\ntype ImageSharpFixed {\n  aspectRatio: Float\n  base64: String\n  height: Float!\n  originalName: String\n  src: String!\n  srcSet: String!\n  srcSetWebp: String\n  srcWebp: String\n  tracedSVG: String\n  width: Float!\n}\n\ninput ImageSharpFixedFilterInput {\n  aspectRatio: FloatQueryOperatorInput\n  base64: StringQueryOperatorInput\n  height: FloatQueryOperatorInput\n  originalName: StringQueryOperatorInput\n  src: StringQueryOperatorInput\n  srcSet: StringQueryOperatorInput\n  srcSetWebp: StringQueryOperatorInput\n  srcWebp: StringQueryOperatorInput\n  tracedSVG: StringQueryOperatorInput\n  width: FloatQueryOperatorInput\n}\n\ntype ImageSharpFluid {\n  aspectRatio: Float!\n  base64: String\n  originalImg: String\n  originalName: String\n  presentationHeight: Int!\n  presentationWidth: Int!\n  sizes: String!\n  src: String!\n  srcSet: String!\n  srcSetWebp: String\n  srcWebp: String\n  tracedSVG: String\n}\n\ninput ImageSharpFluidFilterInput {\n  aspectRatio: FloatQueryOperatorInput\n  base64: StringQueryOperatorInput\n  originalImg: StringQueryOperatorInput\n  originalName: StringQueryOperatorInput\n  presentationHeight: IntQueryOperatorInput\n  presentationWidth: IntQueryOperatorInput\n  sizes: StringQueryOperatorInput\n  src: StringQueryOperatorInput\n  srcSet: StringQueryOperatorInput\n  srcSetWebp: StringQueryOperatorInput\n  srcWebp: StringQueryOperatorInput\n  tracedSVG: StringQueryOperatorInput\n}\n\ntype ImageSharpGroupConnection {\n  distinct(field: ImageSharpFieldsEnum!): [String!]!\n  edges: [ImageSharpEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: ImageSharpFieldsEnum!, limit: Int, skip: Int): [ImageSharpGroupConnection!]!\n  max(field: ImageSharpFieldsEnum!): Float\n  min(field: ImageSharpFieldsEnum!): Float\n  nodes: [ImageSharp!]!\n  pageInfo: PageInfo!\n  sum(field: ImageSharpFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype ImageSharpOriginal {\n  height: Float\n  src: String\n  width: Float\n}\n\ninput ImageSharpOriginalFilterInput {\n  height: FloatQueryOperatorInput\n  src: StringQueryOperatorInput\n  width: FloatQueryOperatorInput\n}\n\ntype ImageSharpResize {\n  aspectRatio: Float\n  height: Int\n  originalName: String\n  src: String\n  tracedSVG: String\n  width: Int\n}\n\ninput ImageSharpResizeFilterInput {\n  aspectRatio: FloatQueryOperatorInput\n  height: IntQueryOperatorInput\n  originalName: StringQueryOperatorInput\n  src: StringQueryOperatorInput\n  tracedSVG: StringQueryOperatorInput\n  width: IntQueryOperatorInput\n}\n\ninput ImageSharpSortInput {\n  fields: [ImageSharpFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\ninput IntQueryOperatorInput {\n  eq: Int\n  gt: Int\n  gte: Int\n  in: [Int]\n  lt: Int\n  lte: Int\n  ne: Int\n  nin: [Int]\n}\n\ntype Internal {\n  content: String\n  contentDigest: String!\n  description: String\n  fieldOwners: [String]\n  ignoreType: Boolean\n  mediaType: String\n  owner: String!\n  type: String!\n}\n\ninput InternalFilterInput {\n  content: StringQueryOperatorInput\n  contentDigest: StringQueryOperatorInput\n  description: StringQueryOperatorInput\n  fieldOwners: StringQueryOperatorInput\n  ignoreType: BooleanQueryOperatorInput\n  mediaType: StringQueryOperatorInput\n  owner: StringQueryOperatorInput\n  type: StringQueryOperatorInput\n}\n\ninput JPGOptions {\n  progressive: Boolean = true\n  quality: Int\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).\n\"\"\"\nscalar JSON\n\ninput JSONQueryOperatorInput {\n  eq: JSON\n  glob: JSON\n  in: [JSON]\n  ne: JSON\n  nin: [JSON]\n  regex: JSON\n}\n\n\"\"\"\nNode Interface\n\"\"\"\ninterface Node {\n  children: [Node!]!\n  id: ID!\n  internal: Internal!\n  parent: Node\n}\n\ninput NodeFilterInput {\n  children: NodeFilterListInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  parent: NodeFilterInput\n}\n\ninput NodeFilterListInput {\n  elemMatch: NodeFilterInput\n}\n\ninput PNGOptions {\n  compressionSpeed: Int = 4\n  quality: Int\n}\n\ntype PageInfo {\n  currentPage: Int!\n  hasNextPage: Boolean!\n  hasPreviousPage: Boolean!\n  itemCount: Int!\n  pageCount: Int!\n  perPage: Int\n  totalCount: Int!\n}\n\ninput Potrace {\n  alphaMax: Float\n  background: String\n  blackOnWhite: Boolean\n  color: String\n  optCurve: Boolean\n  optTolerance: Float\n  threshold: Int\n  turdSize: Float\n  turnPolicy: PotraceTurnPolicy\n}\n\nenum PotraceTurnPolicy {\n  TURNPOLICY_BLACK\n  TURNPOLICY_LEFT\n  TURNPOLICY_MAJORITY\n  TURNPOLICY_MINORITY\n  TURNPOLICY_RIGHT\n  TURNPOLICY_WHITE\n}\n\ntype Query {\n  allDirectory(filter: DirectoryFilterInput, limit: Int, skip: Int, sort: DirectorySortInput): DirectoryConnection!\n  allFile(filter: FileFilterInput, limit: Int, skip: Int, sort: FileSortInput): FileConnection!\n  allImageSharp(filter: ImageSharpFilterInput, limit: Int, skip: Int, sort: ImageSharpSortInput): ImageSharpConnection!\n  allInternalEvents(\n    filter: internal__eventsFilterInput\n    limit: Int\n    skip: Int\n    sort: internal__eventsSortInput\n  ): internal__eventsConnection!\n  allSite(filter: SiteFilterInput, limit: Int, skip: Int, sort: SiteSortInput): SiteConnection!\n  allSiteBuildMetadata(\n    filter: SiteBuildMetadataFilterInput\n    limit: Int\n    skip: Int\n    sort: SiteBuildMetadataSortInput\n  ): SiteBuildMetadataConnection!\n  allSiteFunction(\n    filter: SiteFunctionFilterInput\n    limit: Int\n    skip: Int\n    sort: SiteFunctionSortInput\n  ): SiteFunctionConnection!\n  allSitePage(filter: SitePageFilterInput, limit: Int, skip: Int, sort: SitePageSortInput): SitePageConnection!\n  allSitePlugin(filter: SitePluginFilterInput, limit: Int, skip: Int, sort: SitePluginSortInput): SitePluginConnection!\n  allWp(filter: WpFilterInput, limit: Int, skip: Int, sort: WpSortInput): WpConnection!\n  allWpBlockEditorContentNode(\n    filter: WpBlockEditorContentNodeFilterInput\n    limit: Int\n    skip: Int\n    sort: WpBlockEditorContentNodeSortInput\n  ): WpBlockEditorContentNodeConnection!\n  allWpBlockEditorPreview(\n    filter: WpBlockEditorPreviewFilterInput\n    limit: Int\n    skip: Int\n    sort: WpBlockEditorPreviewSortInput\n  ): WpBlockEditorPreviewConnection!\n  allWpCategory(filter: WpCategoryFilterInput, limit: Int, skip: Int, sort: WpCategorySortInput): WpCategoryConnection!\n  allWpComment(filter: WpCommentFilterInput, limit: Int, skip: Int, sort: WpCommentSortInput): WpCommentConnection!\n  allWpCommentAuthor(\n    filter: WpCommentAuthorFilterInput\n    limit: Int\n    skip: Int\n    sort: WpCommentAuthorSortInput\n  ): WpCommentAuthorConnection!\n  allWpContentNode(\n    filter: WpContentNodeFilterInput\n    limit: Int\n    skip: Int\n    sort: WpContentNodeSortInput\n  ): WpContentNodeConnection!\n  allWpContentType(\n    filter: WpContentTypeFilterInput\n    limit: Int\n    skip: Int\n    sort: WpContentTypeSortInput\n  ): WpContentTypeConnection!\n  allWpMediaItem(\n    filter: WpMediaItemFilterInput\n    limit: Int\n    skip: Int\n    sort: WpMediaItemSortInput\n  ): WpMediaItemConnection!\n  allWpMenu(filter: WpMenuFilterInput, limit: Int, skip: Int, sort: WpMenuSortInput): WpMenuConnection!\n  allWpMenuItem(filter: WpMenuItemFilterInput, limit: Int, skip: Int, sort: WpMenuItemSortInput): WpMenuItemConnection!\n  allWpPage(filter: WpPageFilterInput, limit: Int, skip: Int, sort: WpPageSortInput): WpPageConnection!\n  allWpPost(filter: WpPostFilterInput, limit: Int, skip: Int, sort: WpPostSortInput): WpPostConnection!\n  allWpPostFormat(\n    filter: WpPostFormatFilterInput\n    limit: Int\n    skip: Int\n    sort: WpPostFormatSortInput\n  ): WpPostFormatConnection!\n  allWpReusableBlock(\n    filter: WpReusableBlockFilterInput\n    limit: Int\n    skip: Int\n    sort: WpReusableBlockSortInput\n  ): WpReusableBlockConnection!\n  allWpTag(filter: WpTagFilterInput, limit: Int, skip: Int, sort: WpTagSortInput): WpTagConnection!\n  allWpTaxonomy(filter: WpTaxonomyFilterInput, limit: Int, skip: Int, sort: WpTaxonomySortInput): WpTaxonomyConnection!\n  allWpTermNode(filter: WpTermNodeFilterInput, limit: Int, skip: Int, sort: WpTermNodeSortInput): WpTermNodeConnection!\n  allWpUser(filter: WpUserFilterInput, limit: Int, skip: Int, sort: WpUserSortInput): WpUserConnection!\n  allWpUserRole(filter: WpUserRoleFilterInput, limit: Int, skip: Int, sort: WpUserRoleSortInput): WpUserRoleConnection!\n  directory(\n    absolutePath: StringQueryOperatorInput\n    accessTime: DateQueryOperatorInput\n    atime: DateQueryOperatorInput\n    atimeMs: FloatQueryOperatorInput\n    base: StringQueryOperatorInput\n    birthTime: DateQueryOperatorInput\n    birthtime: DateQueryOperatorInput\n    birthtimeMs: FloatQueryOperatorInput\n    changeTime: DateQueryOperatorInput\n    children: NodeFilterListInput\n    ctime: DateQueryOperatorInput\n    ctimeMs: FloatQueryOperatorInput\n    dev: IntQueryOperatorInput\n    dir: StringQueryOperatorInput\n    ext: StringQueryOperatorInput\n    extension: StringQueryOperatorInput\n    gid: IntQueryOperatorInput\n    id: StringQueryOperatorInput\n    ino: FloatQueryOperatorInput\n    internal: InternalFilterInput\n    mode: IntQueryOperatorInput\n    modifiedTime: DateQueryOperatorInput\n    mtime: DateQueryOperatorInput\n    mtimeMs: FloatQueryOperatorInput\n    name: StringQueryOperatorInput\n    nlink: IntQueryOperatorInput\n    parent: NodeFilterInput\n    prettySize: StringQueryOperatorInput\n    rdev: IntQueryOperatorInput\n    relativeDirectory: StringQueryOperatorInput\n    relativePath: StringQueryOperatorInput\n    root: StringQueryOperatorInput\n    size: IntQueryOperatorInput\n    sourceInstanceName: StringQueryOperatorInput\n    uid: IntQueryOperatorInput\n  ): Directory\n  file(\n    absolutePath: StringQueryOperatorInput\n    accessTime: DateQueryOperatorInput\n    atime: DateQueryOperatorInput\n    atimeMs: FloatQueryOperatorInput\n    base: StringQueryOperatorInput\n    birthTime: DateQueryOperatorInput\n    birthtime: DateQueryOperatorInput\n    birthtimeMs: FloatQueryOperatorInput\n    blksize: IntQueryOperatorInput\n    blocks: IntQueryOperatorInput\n    changeTime: DateQueryOperatorInput\n    childImageSharp: ImageSharpFilterInput\n    children: NodeFilterListInput\n    childrenImageSharp: ImageSharpFilterListInput\n    ctime: DateQueryOperatorInput\n    ctimeMs: FloatQueryOperatorInput\n    dev: IntQueryOperatorInput\n    dir: StringQueryOperatorInput\n    ext: StringQueryOperatorInput\n    extension: StringQueryOperatorInput\n    gid: IntQueryOperatorInput\n    hash: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    ino: FloatQueryOperatorInput\n    internal: InternalFilterInput\n    mode: IntQueryOperatorInput\n    modifiedTime: DateQueryOperatorInput\n    mtime: DateQueryOperatorInput\n    mtimeMs: FloatQueryOperatorInput\n    name: StringQueryOperatorInput\n    nlink: IntQueryOperatorInput\n    parent: NodeFilterInput\n    prettySize: StringQueryOperatorInput\n    publicURL: StringQueryOperatorInput\n    rdev: IntQueryOperatorInput\n    relativeDirectory: StringQueryOperatorInput\n    relativePath: StringQueryOperatorInput\n    root: StringQueryOperatorInput\n    size: IntQueryOperatorInput\n    sourceInstanceName: StringQueryOperatorInput\n    uid: IntQueryOperatorInput\n  ): File\n  imageSharp(\n    children: NodeFilterListInput\n    fixed: ImageSharpFixedFilterInput\n    fluid: ImageSharpFluidFilterInput\n    gatsbyImageData: JSONQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    original: ImageSharpOriginalFilterInput\n    parent: NodeFilterInput\n    resize: ImageSharpResizeFilterInput\n  ): ImageSharp\n  internalEvents(\n    children: NodeFilterListInput\n    events: internal__eventsEventsFilterListInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    next_rest_url: StringQueryOperatorInput\n    parent: NodeFilterInput\n    previous_rest_url: StringQueryOperatorInput\n    rest_url: StringQueryOperatorInput\n    total: IntQueryOperatorInput\n    total_pages: IntQueryOperatorInput\n  ): internal__events\n  site(\n    buildTime: DateQueryOperatorInput\n    children: NodeFilterListInput\n    host: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    jsxRuntime: StringQueryOperatorInput\n    parent: NodeFilterInput\n    pathPrefix: StringQueryOperatorInput\n    polyfill: BooleanQueryOperatorInput\n    port: IntQueryOperatorInput\n    siteMetadata: SiteSiteMetadataFilterInput\n    trailingSlash: StringQueryOperatorInput\n  ): Site\n  siteBuildMetadata(\n    buildTime: DateQueryOperatorInput\n    children: NodeFilterListInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    parent: NodeFilterInput\n  ): SiteBuildMetadata\n  siteFunction(\n    absoluteCompiledFilePath: StringQueryOperatorInput\n    children: NodeFilterListInput\n    functionRoute: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    matchPath: StringQueryOperatorInput\n    originalAbsoluteFilePath: StringQueryOperatorInput\n    originalRelativeFilePath: StringQueryOperatorInput\n    parent: NodeFilterInput\n    pluginName: StringQueryOperatorInput\n    relativeCompiledFilePath: StringQueryOperatorInput\n  ): SiteFunction\n  sitePage(\n    children: NodeFilterListInput\n    component: StringQueryOperatorInput\n    componentChunkName: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    internalComponentName: StringQueryOperatorInput\n    matchPath: StringQueryOperatorInput\n    pageContext: JSONQueryOperatorInput\n    parent: NodeFilterInput\n    path: StringQueryOperatorInput\n    pluginCreator: SitePluginFilterInput\n  ): SitePage\n  sitePlugin(\n    browserAPIs: StringQueryOperatorInput\n    children: NodeFilterListInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    name: StringQueryOperatorInput\n    nodeAPIs: StringQueryOperatorInput\n    packageJson: JSONQueryOperatorInput\n    parent: NodeFilterInput\n    pluginFilepath: StringQueryOperatorInput\n    pluginOptions: JSONQueryOperatorInput\n    resolve: StringQueryOperatorInput\n    ssrAPIs: StringQueryOperatorInput\n    version: StringQueryOperatorInput\n  ): SitePlugin\n  wp(\n    allSettings: WpSettingsFilterInput\n    children: NodeFilterListInput\n    discussionSettings: WpDiscussionSettingsFilterInput\n    generalSettings: WpGeneralSettingsFilterInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    readingSettings: WpReadingSettingsFilterInput\n    wpGatsby: WpWPGatsbyFilterInput\n    writingSettings: WpWritingSettingsFilterInput\n  ): Wp\n  wpBlockEditorContentNode(\n    blocks: WpBlockFilterListInput\n    blocksJSON: StringQueryOperatorInput\n    children: NodeFilterListInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    previewBlocks: WpBlockFilterListInput\n    previewBlocksJSON: StringQueryOperatorInput\n  ): WpBlockEditorContentNode\n  wpBlockEditorPreview(\n    author: WpNodeWithAuthorToUserConnectionEdgeFilterInput\n    authorDatabaseId: IntQueryOperatorInput\n    authorId: IDQueryOperatorInput\n    blocks: WpBlockFilterListInput\n    blocksJSON: StringQueryOperatorInput\n    children: NodeFilterListInput\n    content: StringQueryOperatorInput\n    contentType: WpContentNodeToContentTypeConnectionEdgeFilterInput\n    contentTypeName: StringQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    date: DateQueryOperatorInput\n    dateGmt: DateQueryOperatorInput\n    desiredSlug: StringQueryOperatorInput\n    enclosure: StringQueryOperatorInput\n    guid: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    isContentNode: BooleanQueryOperatorInput\n    isTermNode: BooleanQueryOperatorInput\n    lastEditedBy: WpContentNodeToEditLastConnectionEdgeFilterInput\n    lastUpdateTime: StringQueryOperatorInput\n    link: StringQueryOperatorInput\n    modified: DateQueryOperatorInput\n    modifiedGmt: DateQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    previewed: WpBlockEditorContentNodeFilterInput\n    previewedDatabaseId: IntQueryOperatorInput\n    previewedParentDatabaseId: IntQueryOperatorInput\n    slug: StringQueryOperatorInput\n    status: StringQueryOperatorInput\n    template: WpContentTemplateFilterInput\n    title: StringQueryOperatorInput\n    uri: StringQueryOperatorInput\n  ): WpBlockEditorPreview\n  wpCategory(\n    ancestors: WpCategoryToAncestorsCategoryConnectionFilterInput\n    children: NodeFilterListInput\n    contentNodes: WpCategoryToContentNodeConnectionFilterInput\n    count: IntQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    description: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    isContentNode: BooleanQueryOperatorInput\n    isTermNode: BooleanQueryOperatorInput\n    link: StringQueryOperatorInput\n    name: StringQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    parentDatabaseId: IntQueryOperatorInput\n    parentId: IDQueryOperatorInput\n    posts: WpCategoryToPostConnectionFilterInput\n    slug: StringQueryOperatorInput\n    taxonomy: WpCategoryToTaxonomyConnectionEdgeFilterInput\n    taxonomyName: StringQueryOperatorInput\n    termGroupId: IntQueryOperatorInput\n    termTaxonomyId: IntQueryOperatorInput\n    uri: StringQueryOperatorInput\n    wpChildren: WpCategoryToCategoryConnectionFilterInput\n    wpParent: WpCategoryToParentCategoryConnectionEdgeFilterInput\n  ): WpCategory\n  wpComment(\n    agent: StringQueryOperatorInput\n    approved: BooleanQueryOperatorInput\n    author: WpCommentToCommenterConnectionEdgeFilterInput\n    authorIp: StringQueryOperatorInput\n    children: NodeFilterListInput\n    commentedOn: WpCommentToContentNodeConnectionEdgeFilterInput\n    content: StringQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    date: DateQueryOperatorInput\n    dateGmt: DateQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    karma: IntQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    parentDatabaseId: IntQueryOperatorInput\n    parentId: IDQueryOperatorInput\n    replies: WpCommentToCommentConnectionFilterInput\n    type: StringQueryOperatorInput\n    wpParent: WpCommentToParentCommentConnectionEdgeFilterInput\n  ): WpComment\n  wpCommentAuthor(\n    avatar: WpAvatarFilterInput\n    children: NodeFilterListInput\n    databaseId: IntQueryOperatorInput\n    email: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    name: StringQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    url: StringQueryOperatorInput\n  ): WpCommentAuthor\n  wpContentNode(\n    children: NodeFilterListInput\n    contentType: WpContentNodeToContentTypeConnectionEdgeFilterInput\n    contentTypeName: StringQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    date: DateQueryOperatorInput\n    dateGmt: DateQueryOperatorInput\n    desiredSlug: StringQueryOperatorInput\n    enclosure: StringQueryOperatorInput\n    guid: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    isContentNode: BooleanQueryOperatorInput\n    isTermNode: BooleanQueryOperatorInput\n    lastEditedBy: WpContentNodeToEditLastConnectionEdgeFilterInput\n    link: StringQueryOperatorInput\n    modified: DateQueryOperatorInput\n    modifiedGmt: DateQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    slug: StringQueryOperatorInput\n    status: StringQueryOperatorInput\n    template: WpContentTemplateFilterInput\n    uri: StringQueryOperatorInput\n  ): WpContentNode\n  wpContentType(\n    archivePath: StringQueryOperatorInput\n    canExport: BooleanQueryOperatorInput\n    children: NodeFilterListInput\n    connectedTaxonomies: WpContentTypeToTaxonomyConnectionFilterInput\n    contentNodes: WpContentTypeToContentNodeConnectionFilterInput\n    deleteWithUser: BooleanQueryOperatorInput\n    description: StringQueryOperatorInput\n    excludeFromSearch: BooleanQueryOperatorInput\n    graphqlPluralName: StringQueryOperatorInput\n    graphqlSingleName: StringQueryOperatorInput\n    hasArchive: BooleanQueryOperatorInput\n    hierarchical: BooleanQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    isContentNode: BooleanQueryOperatorInput\n    isFrontPage: BooleanQueryOperatorInput\n    isPostsPage: BooleanQueryOperatorInput\n    isTermNode: BooleanQueryOperatorInput\n    label: StringQueryOperatorInput\n    labels: WpPostTypeLabelDetailsFilterInput\n    menuIcon: StringQueryOperatorInput\n    menuPosition: IntQueryOperatorInput\n    name: StringQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    public: BooleanQueryOperatorInput\n    publiclyQueryable: BooleanQueryOperatorInput\n    restBase: StringQueryOperatorInput\n    restControllerClass: StringQueryOperatorInput\n    showInAdminBar: BooleanQueryOperatorInput\n    showInGraphql: BooleanQueryOperatorInput\n    showInMenu: BooleanQueryOperatorInput\n    showInNavMenus: BooleanQueryOperatorInput\n    showInRest: BooleanQueryOperatorInput\n    showUi: BooleanQueryOperatorInput\n    uri: StringQueryOperatorInput\n  ): WpContentType\n  wpMediaItem(\n    altText: StringQueryOperatorInput\n    ancestors: WpHierarchicalContentNodeToContentNodeAncestorsConnectionFilterInput\n    author: WpNodeWithAuthorToUserConnectionEdgeFilterInput\n    authorDatabaseId: IntQueryOperatorInput\n    authorId: IDQueryOperatorInput\n    caption: StringQueryOperatorInput\n    children: NodeFilterListInput\n    commentCount: IntQueryOperatorInput\n    commentStatus: StringQueryOperatorInput\n    comments: WpMediaItemToCommentConnectionFilterInput\n    contentType: WpContentNodeToContentTypeConnectionEdgeFilterInput\n    contentTypeName: StringQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    date: DateQueryOperatorInput\n    dateGmt: DateQueryOperatorInput\n    description: StringQueryOperatorInput\n    desiredSlug: StringQueryOperatorInput\n    enclosure: StringQueryOperatorInput\n    fileSize: IntQueryOperatorInput\n    filename: StringQueryOperatorInput\n    filesize: IntQueryOperatorInput\n    gatsbyImage: JSONQueryOperatorInput\n    guid: StringQueryOperatorInput\n    height: IntQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    isContentNode: BooleanQueryOperatorInput\n    isTermNode: BooleanQueryOperatorInput\n    lastEditedBy: WpContentNodeToEditLastConnectionEdgeFilterInput\n    link: StringQueryOperatorInput\n    localFile: FileFilterInput\n    mediaDetails: WpMediaDetailsFilterInput\n    mediaItemUrl: StringQueryOperatorInput\n    mediaType: StringQueryOperatorInput\n    mimeType: StringQueryOperatorInput\n    modified: DateQueryOperatorInput\n    modifiedGmt: DateQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    parentDatabaseId: IntQueryOperatorInput\n    parentId: IDQueryOperatorInput\n    publicUrl: StringQueryOperatorInput\n    remoteFile: FileFilterInput\n    resize: RemoteFileResizeFilterInput\n    sizes: StringQueryOperatorInput\n    slug: StringQueryOperatorInput\n    sourceUrl: StringQueryOperatorInput\n    srcSet: StringQueryOperatorInput\n    status: StringQueryOperatorInput\n    template: WpContentTemplateFilterInput\n    title: StringQueryOperatorInput\n    uri: StringQueryOperatorInput\n    width: IntQueryOperatorInput\n    wpChildren: WpHierarchicalContentNodeToContentNodeChildrenConnectionFilterInput\n    wpParent: WpHierarchicalContentNodeToParentContentNodeConnectionEdgeFilterInput\n  ): WpMediaItem\n  wpMenu(\n    children: NodeFilterListInput\n    count: IntQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    locations: WpMenuLocationEnumQueryOperatorInput\n    menuItems: WpMenuToMenuItemConnectionFilterInput\n    name: StringQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    slug: StringQueryOperatorInput\n  ): WpMenu\n  wpMenuItem(\n    childItems: WpMenuItemToMenuItemConnectionFilterInput\n    children: NodeFilterListInput\n    connectedNode: WpMenuItemToMenuItemLinkableConnectionEdgeFilterInput\n    cssClasses: StringQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    description: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    label: StringQueryOperatorInput\n    linkRelationship: StringQueryOperatorInput\n    locations: WpMenuLocationEnumQueryOperatorInput\n    menu: WpMenuItemToMenuConnectionEdgeFilterInput\n    nodeType: StringQueryOperatorInput\n    order: IntQueryOperatorInput\n    parent: NodeFilterInput\n    parentDatabaseId: IntQueryOperatorInput\n    parentId: IDQueryOperatorInput\n    path: StringQueryOperatorInput\n    target: StringQueryOperatorInput\n    title: StringQueryOperatorInput\n    url: StringQueryOperatorInput\n  ): WpMenuItem\n  wpPage(\n    ancestors: WpHierarchicalContentNodeToContentNodeAncestorsConnectionFilterInput\n    author: WpNodeWithAuthorToUserConnectionEdgeFilterInput\n    authorDatabaseId: IntQueryOperatorInput\n    authorId: IDQueryOperatorInput\n    blocks: WpBlockFilterListInput\n    blocksJSON: StringQueryOperatorInput\n    children: NodeFilterListInput\n    commentCount: IntQueryOperatorInput\n    commentStatus: StringQueryOperatorInput\n    comments: WpPageToCommentConnectionFilterInput\n    content: StringQueryOperatorInput\n    contentType: WpContentNodeToContentTypeConnectionEdgeFilterInput\n    contentTypeName: StringQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    date: DateQueryOperatorInput\n    dateGmt: DateQueryOperatorInput\n    desiredSlug: StringQueryOperatorInput\n    enclosure: StringQueryOperatorInput\n    featuredImage: WpNodeWithFeaturedImageToMediaItemConnectionEdgeFilterInput\n    featuredImageDatabaseId: IntQueryOperatorInput\n    featuredImageId: IDQueryOperatorInput\n    guid: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    isContentNode: BooleanQueryOperatorInput\n    isFrontPage: BooleanQueryOperatorInput\n    isPostsPage: BooleanQueryOperatorInput\n    isPrivacyPage: BooleanQueryOperatorInput\n    isRevision: BooleanQueryOperatorInput\n    isTermNode: BooleanQueryOperatorInput\n    lastEditedBy: WpContentNodeToEditLastConnectionEdgeFilterInput\n    link: StringQueryOperatorInput\n    menuOrder: IntQueryOperatorInput\n    modified: DateQueryOperatorInput\n    modifiedGmt: DateQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    parentDatabaseId: IntQueryOperatorInput\n    parentId: IDQueryOperatorInput\n    previewBlocks: WpBlockFilterListInput\n    previewBlocksJSON: StringQueryOperatorInput\n    slug: StringQueryOperatorInput\n    status: StringQueryOperatorInput\n    template: WpContentTemplateFilterInput\n    title: StringQueryOperatorInput\n    uri: StringQueryOperatorInput\n    wpChildren: WpHierarchicalContentNodeToContentNodeChildrenConnectionFilterInput\n    wpParent: WpHierarchicalContentNodeToParentContentNodeConnectionEdgeFilterInput\n  ): WpPage\n  wpPost(\n    author: WpNodeWithAuthorToUserConnectionEdgeFilterInput\n    authorDatabaseId: IntQueryOperatorInput\n    authorId: IDQueryOperatorInput\n    blocks: WpBlockFilterListInput\n    blocksJSON: StringQueryOperatorInput\n    categories: WpPostToCategoryConnectionFilterInput\n    children: NodeFilterListInput\n    commentCount: IntQueryOperatorInput\n    commentStatus: StringQueryOperatorInput\n    comments: WpPostToCommentConnectionFilterInput\n    content: StringQueryOperatorInput\n    contentType: WpContentNodeToContentTypeConnectionEdgeFilterInput\n    contentTypeName: StringQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    date: DateQueryOperatorInput\n    dateGmt: DateQueryOperatorInput\n    desiredSlug: StringQueryOperatorInput\n    enclosure: StringQueryOperatorInput\n    excerpt: StringQueryOperatorInput\n    featuredImage: WpNodeWithFeaturedImageToMediaItemConnectionEdgeFilterInput\n    featuredImageDatabaseId: IntQueryOperatorInput\n    featuredImageId: IDQueryOperatorInput\n    guid: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    isContentNode: BooleanQueryOperatorInput\n    isRevision: BooleanQueryOperatorInput\n    isSticky: BooleanQueryOperatorInput\n    isTermNode: BooleanQueryOperatorInput\n    lastEditedBy: WpContentNodeToEditLastConnectionEdgeFilterInput\n    link: StringQueryOperatorInput\n    modified: DateQueryOperatorInput\n    modifiedGmt: DateQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    pingStatus: StringQueryOperatorInput\n    pinged: StringQueryOperatorInput\n    postFormats: WpPostToPostFormatConnectionFilterInput\n    previewBlocks: WpBlockFilterListInput\n    previewBlocksJSON: StringQueryOperatorInput\n    slug: StringQueryOperatorInput\n    status: StringQueryOperatorInput\n    tags: WpPostToTagConnectionFilterInput\n    template: WpContentTemplateFilterInput\n    terms: WpPostToTermNodeConnectionFilterInput\n    title: StringQueryOperatorInput\n    toPing: StringQueryOperatorInput\n    uri: StringQueryOperatorInput\n  ): WpPost\n  wpPostFormat(\n    children: NodeFilterListInput\n    contentNodes: WpPostFormatToContentNodeConnectionFilterInput\n    count: IntQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    description: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    isContentNode: BooleanQueryOperatorInput\n    isTermNode: BooleanQueryOperatorInput\n    link: StringQueryOperatorInput\n    name: StringQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    posts: WpPostFormatToPostConnectionFilterInput\n    slug: StringQueryOperatorInput\n    taxonomy: WpPostFormatToTaxonomyConnectionEdgeFilterInput\n    taxonomyName: StringQueryOperatorInput\n    termGroupId: IntQueryOperatorInput\n    termTaxonomyId: IntQueryOperatorInput\n    uri: StringQueryOperatorInput\n  ): WpPostFormat\n  wpReusableBlock(\n    blocks: WpBlockFilterListInput\n    blocksJSON: StringQueryOperatorInput\n    children: NodeFilterListInput\n    content: StringQueryOperatorInput\n    contentType: WpContentNodeToContentTypeConnectionEdgeFilterInput\n    contentTypeName: StringQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    date: DateQueryOperatorInput\n    dateGmt: DateQueryOperatorInput\n    desiredSlug: StringQueryOperatorInput\n    enclosure: StringQueryOperatorInput\n    guid: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    isContentNode: BooleanQueryOperatorInput\n    isRevision: BooleanQueryOperatorInput\n    isTermNode: BooleanQueryOperatorInput\n    lastEditedBy: WpContentNodeToEditLastConnectionEdgeFilterInput\n    link: StringQueryOperatorInput\n    modified: DateQueryOperatorInput\n    modifiedGmt: DateQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    previewBlocks: WpBlockFilterListInput\n    previewBlocksJSON: StringQueryOperatorInput\n    slug: StringQueryOperatorInput\n    status: StringQueryOperatorInput\n    template: WpContentTemplateFilterInput\n    title: StringQueryOperatorInput\n    uri: StringQueryOperatorInput\n  ): WpReusableBlock\n  wpTag(\n    children: NodeFilterListInput\n    contentNodes: WpTagToContentNodeConnectionFilterInput\n    count: IntQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    description: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    isContentNode: BooleanQueryOperatorInput\n    isTermNode: BooleanQueryOperatorInput\n    link: StringQueryOperatorInput\n    name: StringQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    posts: WpTagToPostConnectionFilterInput\n    slug: StringQueryOperatorInput\n    taxonomy: WpTagToTaxonomyConnectionEdgeFilterInput\n    taxonomyName: StringQueryOperatorInput\n    termGroupId: IntQueryOperatorInput\n    termTaxonomyId: IntQueryOperatorInput\n    uri: StringQueryOperatorInput\n  ): WpTag\n  wpTaxonomy(\n    archivePath: StringQueryOperatorInput\n    children: NodeFilterListInput\n    connectedContentTypes: WpTaxonomyToContentTypeConnectionFilterInput\n    description: StringQueryOperatorInput\n    graphqlPluralName: StringQueryOperatorInput\n    graphqlSingleName: StringQueryOperatorInput\n    hierarchical: BooleanQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    label: StringQueryOperatorInput\n    name: StringQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    public: BooleanQueryOperatorInput\n    restBase: StringQueryOperatorInput\n    restControllerClass: StringQueryOperatorInput\n    showCloud: BooleanQueryOperatorInput\n    showInAdminColumn: BooleanQueryOperatorInput\n    showInGraphql: BooleanQueryOperatorInput\n    showInMenu: BooleanQueryOperatorInput\n    showInNavMenus: BooleanQueryOperatorInput\n    showInQuickEdit: BooleanQueryOperatorInput\n    showInRest: BooleanQueryOperatorInput\n    showUi: BooleanQueryOperatorInput\n  ): WpTaxonomy\n  wpTermNode(\n    children: NodeFilterListInput\n    count: IntQueryOperatorInput\n    databaseId: IntQueryOperatorInput\n    description: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    isContentNode: BooleanQueryOperatorInput\n    isTermNode: BooleanQueryOperatorInput\n    link: StringQueryOperatorInput\n    name: StringQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n    slug: StringQueryOperatorInput\n    taxonomyName: StringQueryOperatorInput\n    termGroupId: IntQueryOperatorInput\n    termTaxonomyId: IntQueryOperatorInput\n    uri: StringQueryOperatorInput\n  ): WpTermNode\n  wpUser(\n    avatar: WpAvatarFilterInput\n    blockEditorPreviews: WpUserToBlockEditorPreviewConnectionFilterInput\n    capKey: StringQueryOperatorInput\n    capabilities: StringQueryOperatorInput\n    children: NodeFilterListInput\n    comments: WpUserToCommentConnectionFilterInput\n    databaseId: IntQueryOperatorInput\n    description: StringQueryOperatorInput\n    email: StringQueryOperatorInput\n    extraCapabilities: StringQueryOperatorInput\n    firstName: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    isContentNode: BooleanQueryOperatorInput\n    isTermNode: BooleanQueryOperatorInput\n    lastName: StringQueryOperatorInput\n    locale: StringQueryOperatorInput\n    name: StringQueryOperatorInput\n    nicename: StringQueryOperatorInput\n    nickname: StringQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    pages: WpUserToPageConnectionFilterInput\n    parent: NodeFilterInput\n    posts: WpUserToPostConnectionFilterInput\n    registeredDate: StringQueryOperatorInput\n    roles: WpUserToUserRoleConnectionFilterInput\n    slug: StringQueryOperatorInput\n    uri: StringQueryOperatorInput\n    url: StringQueryOperatorInput\n    username: StringQueryOperatorInput\n  ): WpUser\n  wpUserRole(\n    capabilities: StringQueryOperatorInput\n    children: NodeFilterListInput\n    displayName: StringQueryOperatorInput\n    id: StringQueryOperatorInput\n    internal: InternalFilterInput\n    name: StringQueryOperatorInput\n    nodeType: StringQueryOperatorInput\n    parent: NodeFilterInput\n  ): WpUserRole\n}\n\n\"\"\"\nRemote Interface\n\"\"\"\ninterface RemoteFile {\n  filename: String!\n  filesize: Int\n\n  \"\"\"\n  Data used in the <GatsbyImage /> component. See https://gatsby.dev/img for more info.\n  \"\"\"\n  gatsbyImage(\n    \"\"\"\n    If set along with width or height, this will set the value of the other dimension to match the provided aspect ratio, cropping the image if needed.\n    If neither width or height is provided, height will be set based on the intrinsic width of the source image.\n    \"\"\"\n    aspectRatio: Float\n\n    \"\"\"\n    Background color applied to the wrapper, or when \"letterboxing\" an image to another aspect ratio.\n    \"\"\"\n    backgroundColor: String\n\n    \"\"\"\n    Specifies the image widths to generate. You should rarely need to change this. For FIXED and CONSTRAINED images it is better to allow these to be determined automatically,\n    based on the image size. For FULL_WIDTH images this can be used to override the default, which is [750, 1080, 1366, 1920].\n    It will never generate any images larger than the source.\n    \"\"\"\n    breakpoints: [Int] = [750, 1080, 1366, 1920]\n    cropFocus: [RemoteFileCropFocus]\n    fit: RemoteFileFit = COVER\n\n    \"\"\"\n    The image formats to generate. Valid values are AUTO (meaning the same format as the source image), JPG, PNG, WEBP and AVIF.\n    The default value is [AUTO, WEBP, AVIF], and you should rarely need to change this. Take care if you specify JPG or PNG when you do\n    not know the formats of the source images, as this could lead to unwanted results such as converting JPEGs to PNGs. Specifying\n    both PNG and JPG is not supported and will be ignored.\n    \"\"\"\n    formats: [RemoteFileFormat!] = [AUTO, WEBP, AVIF]\n\n    \"\"\"\n    If set, the height of the generated image. If omitted, it is calculated from the supplied width, matching the aspect ratio of the source image.\n    \"\"\"\n    height: Int\n\n    \"\"\"\n    The layout for the image.\n    FIXED: A static image sized, that does not resize according to the screen width\n    FULL_WIDTH: The image resizes to fit its container. Pass a \"sizes\" option if it isn't going to be the full width of the screen.\n    CONSTRAINED: Resizes to fit its container, up to a maximum width, at which point it will remain fixed in size.\n    \"\"\"\n    layout: RemoteFileLayout = CONSTRAINED\n\n    \"\"\"\n    A list of image pixel densities to generate for FIXED and CONSTRAINED images. You should rarely need to change this. It will never generate images larger than the source, and will always include a 1x image.\n    Default is [ 1, 2 ] for fixed images, meaning 1x, 2x, and [0.25, 0.5, 1, 2] for fluid. In this case, an image with a fluid layout and width = 400 would generate images at 100, 200, 400 and 800px wide.\n    \"\"\"\n    outputPixelDensities: [Float] = [0.25, 0.5, 1, 2]\n\n    \"\"\"\n    Format of generated placeholder image, displayed while the main image loads.\n    BLURRED: a blurred, low resolution image, encoded as a base64 data URI (default)\n    DOMINANT_COLOR: a solid color, calculated from the dominant color of the image.\n    TRACED_SVG: a low-resolution traced SVG of the image.\n    NONE: no placeholder. Set the argument \"backgroundColor\" to use a fixed background color.\n    \"\"\"\n    placeholder: RemoteFilePlaceholder = DOMINANT_COLOR\n    quality: Int = 75\n\n    \"\"\"\n    The \"sizes\" property, passed to the img tag. This describes the display size of the image.\n    This does not affect the generated images, but is used by the browser to decide which images to download. You can leave this blank for fixed images, or if the responsive image\n    container will be the full width of the screen. In these cases we will generate an appropriate value.\n    \"\"\"\n    sizes: String\n\n    \"\"\"\n    The display width of the generated image for layout = FIXED, and the display width of the largest image for layout = CONSTRAINED.\n    The actual largest image resolution will be this value multiplied by the largest value in outputPixelDensities\n    Ignored if layout = FLUID.\n    \"\"\"\n    width: Int\n  ): JSON\n  height: Int\n  id: ID!\n  mimeType: String!\n  publicUrl: String!\n  resize(\n    cropFocus: [RemoteFileCropFocus]\n    fit: RemoteFileFit = COVER\n\n    \"\"\"\n    The image formats to generate. Valid values are AUTO (meaning the same format as the source image), JPG, PNG, WEBP and AVIF.\n    The default value is [AUTO, WEBP, AVIF], and you should rarely need to change this. Take care if you specify JPG or PNG when you do\n    not know the formats of the source images, as this could lead to unwanted results such as converting JPEGs to PNGs. Specifying\n    both PNG and JPG is not supported and will be ignored.\n    \"\"\"\n    format: RemoteFileFormat = AUTO\n    height: Int\n    quality: Int = 75\n    width: Int\n  ): RemoteFileResize\n  width: Int\n}\n\nenum RemoteFileCropFocus {\n  BOTTOM\n  CENTER\n  EDGES\n  ENTROPY\n  FACES\n  LEFT\n  RIGHT\n  TOP\n}\n\nenum RemoteFileFit {\n  CONTAIN\n  COVER\n  FILL\n  OUTSIDE\n}\n\nenum RemoteFileFormat {\n  AUTO\n  AVIF\n  JPG\n  PNG\n  WEBP\n}\n\nenum RemoteFileLayout {\n  CONSTRAINED\n  FIXED\n  FULL_WIDTH\n}\n\nenum RemoteFilePlaceholder {\n  BLURRED\n  DOMINANT_COLOR\n  NONE\n}\n\ntype RemoteFileResize {\n  height: Int\n  src: String\n  width: Int\n}\n\ninput RemoteFileResizeFilterInput {\n  height: IntQueryOperatorInput\n  src: StringQueryOperatorInput\n  width: IntQueryOperatorInput\n}\n\ntype Site implements Node {\n  buildTime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  children: [Node!]!\n  host: String\n  id: ID!\n  internal: Internal!\n  jsxRuntime: String\n  parent: Node\n  pathPrefix: String\n  polyfill: Boolean\n  port: Int\n  siteMetadata: SiteSiteMetadata\n  trailingSlash: String\n}\n\ntype SiteBuildMetadata implements Node {\n  buildTime(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  children: [Node!]!\n  id: ID!\n  internal: Internal!\n  parent: Node\n}\n\ntype SiteBuildMetadataConnection {\n  distinct(field: SiteBuildMetadataFieldsEnum!): [String!]!\n  edges: [SiteBuildMetadataEdge!]!\n  group(field: SiteBuildMetadataFieldsEnum!, limit: Int, skip: Int): [SiteBuildMetadataGroupConnection!]!\n  max(field: SiteBuildMetadataFieldsEnum!): Float\n  min(field: SiteBuildMetadataFieldsEnum!): Float\n  nodes: [SiteBuildMetadata!]!\n  pageInfo: PageInfo!\n  sum(field: SiteBuildMetadataFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype SiteBuildMetadataEdge {\n  next: SiteBuildMetadata\n  node: SiteBuildMetadata!\n  previous: SiteBuildMetadata\n}\n\nenum SiteBuildMetadataFieldsEnum {\n  buildTime\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n}\n\ninput SiteBuildMetadataFilterInput {\n  buildTime: DateQueryOperatorInput\n  children: NodeFilterListInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  parent: NodeFilterInput\n}\n\ntype SiteBuildMetadataGroupConnection {\n  distinct(field: SiteBuildMetadataFieldsEnum!): [String!]!\n  edges: [SiteBuildMetadataEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: SiteBuildMetadataFieldsEnum!, limit: Int, skip: Int): [SiteBuildMetadataGroupConnection!]!\n  max(field: SiteBuildMetadataFieldsEnum!): Float\n  min(field: SiteBuildMetadataFieldsEnum!): Float\n  nodes: [SiteBuildMetadata!]!\n  pageInfo: PageInfo!\n  sum(field: SiteBuildMetadataFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput SiteBuildMetadataSortInput {\n  fields: [SiteBuildMetadataFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\ntype SiteConnection {\n  distinct(field: SiteFieldsEnum!): [String!]!\n  edges: [SiteEdge!]!\n  group(field: SiteFieldsEnum!, limit: Int, skip: Int): [SiteGroupConnection!]!\n  max(field: SiteFieldsEnum!): Float\n  min(field: SiteFieldsEnum!): Float\n  nodes: [Site!]!\n  pageInfo: PageInfo!\n  sum(field: SiteFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype SiteEdge {\n  next: Site\n  node: Site!\n  previous: Site\n}\n\nenum SiteFieldsEnum {\n  buildTime\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  host\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  jsxRuntime\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  pathPrefix\n  polyfill\n  port\n  siteMetadata___description\n  siteMetadata___title\n  trailingSlash\n}\n\ninput SiteFilterInput {\n  buildTime: DateQueryOperatorInput\n  children: NodeFilterListInput\n  host: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  jsxRuntime: StringQueryOperatorInput\n  parent: NodeFilterInput\n  pathPrefix: StringQueryOperatorInput\n  polyfill: BooleanQueryOperatorInput\n  port: IntQueryOperatorInput\n  siteMetadata: SiteSiteMetadataFilterInput\n  trailingSlash: StringQueryOperatorInput\n}\n\ntype SiteFunction implements Node {\n  absoluteCompiledFilePath: String!\n  children: [Node!]!\n  functionRoute: String!\n  id: ID!\n  internal: Internal!\n  matchPath: String\n  originalAbsoluteFilePath: String!\n  originalRelativeFilePath: String!\n  parent: Node\n  pluginName: String!\n  relativeCompiledFilePath: String!\n}\n\ntype SiteFunctionConnection {\n  distinct(field: SiteFunctionFieldsEnum!): [String!]!\n  edges: [SiteFunctionEdge!]!\n  group(field: SiteFunctionFieldsEnum!, limit: Int, skip: Int): [SiteFunctionGroupConnection!]!\n  max(field: SiteFunctionFieldsEnum!): Float\n  min(field: SiteFunctionFieldsEnum!): Float\n  nodes: [SiteFunction!]!\n  pageInfo: PageInfo!\n  sum(field: SiteFunctionFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype SiteFunctionEdge {\n  next: SiteFunction\n  node: SiteFunction!\n  previous: SiteFunction\n}\n\nenum SiteFunctionFieldsEnum {\n  absoluteCompiledFilePath\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  functionRoute\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  matchPath\n  originalAbsoluteFilePath\n  originalRelativeFilePath\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  pluginName\n  relativeCompiledFilePath\n}\n\ninput SiteFunctionFilterInput {\n  absoluteCompiledFilePath: StringQueryOperatorInput\n  children: NodeFilterListInput\n  functionRoute: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  matchPath: StringQueryOperatorInput\n  originalAbsoluteFilePath: StringQueryOperatorInput\n  originalRelativeFilePath: StringQueryOperatorInput\n  parent: NodeFilterInput\n  pluginName: StringQueryOperatorInput\n  relativeCompiledFilePath: StringQueryOperatorInput\n}\n\ntype SiteFunctionGroupConnection {\n  distinct(field: SiteFunctionFieldsEnum!): [String!]!\n  edges: [SiteFunctionEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: SiteFunctionFieldsEnum!, limit: Int, skip: Int): [SiteFunctionGroupConnection!]!\n  max(field: SiteFunctionFieldsEnum!): Float\n  min(field: SiteFunctionFieldsEnum!): Float\n  nodes: [SiteFunction!]!\n  pageInfo: PageInfo!\n  sum(field: SiteFunctionFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput SiteFunctionSortInput {\n  fields: [SiteFunctionFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\ntype SiteGroupConnection {\n  distinct(field: SiteFieldsEnum!): [String!]!\n  edges: [SiteEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: SiteFieldsEnum!, limit: Int, skip: Int): [SiteGroupConnection!]!\n  max(field: SiteFieldsEnum!): Float\n  min(field: SiteFieldsEnum!): Float\n  nodes: [Site!]!\n  pageInfo: PageInfo!\n  sum(field: SiteFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype SitePage implements Node {\n  children: [Node!]!\n  component: String!\n  componentChunkName: String!\n  id: ID!\n  internal: Internal!\n  internalComponentName: String!\n  matchPath: String\n  pageContext: JSON\n  parent: Node\n  path: String!\n  pluginCreator: SitePlugin\n}\n\ntype SitePageConnection {\n  distinct(field: SitePageFieldsEnum!): [String!]!\n  edges: [SitePageEdge!]!\n  group(field: SitePageFieldsEnum!, limit: Int, skip: Int): [SitePageGroupConnection!]!\n  max(field: SitePageFieldsEnum!): Float\n  min(field: SitePageFieldsEnum!): Float\n  nodes: [SitePage!]!\n  pageInfo: PageInfo!\n  sum(field: SitePageFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype SitePageEdge {\n  next: SitePage\n  node: SitePage!\n  previous: SitePage\n}\n\nenum SitePageFieldsEnum {\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  component\n  componentChunkName\n  id\n  internalComponentName\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  matchPath\n  pageContext\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  path\n  pluginCreator___browserAPIs\n  pluginCreator___children\n  pluginCreator___children___children\n  pluginCreator___children___children___children\n  pluginCreator___children___children___id\n  pluginCreator___children___id\n  pluginCreator___children___internal___content\n  pluginCreator___children___internal___contentDigest\n  pluginCreator___children___internal___description\n  pluginCreator___children___internal___fieldOwners\n  pluginCreator___children___internal___ignoreType\n  pluginCreator___children___internal___mediaType\n  pluginCreator___children___internal___owner\n  pluginCreator___children___internal___type\n  pluginCreator___children___parent___children\n  pluginCreator___children___parent___id\n  pluginCreator___id\n  pluginCreator___internal___content\n  pluginCreator___internal___contentDigest\n  pluginCreator___internal___description\n  pluginCreator___internal___fieldOwners\n  pluginCreator___internal___ignoreType\n  pluginCreator___internal___mediaType\n  pluginCreator___internal___owner\n  pluginCreator___internal___type\n  pluginCreator___name\n  pluginCreator___nodeAPIs\n  pluginCreator___packageJson\n  pluginCreator___parent___children\n  pluginCreator___parent___children___children\n  pluginCreator___parent___children___id\n  pluginCreator___parent___id\n  pluginCreator___parent___internal___content\n  pluginCreator___parent___internal___contentDigest\n  pluginCreator___parent___internal___description\n  pluginCreator___parent___internal___fieldOwners\n  pluginCreator___parent___internal___ignoreType\n  pluginCreator___parent___internal___mediaType\n  pluginCreator___parent___internal___owner\n  pluginCreator___parent___internal___type\n  pluginCreator___parent___parent___children\n  pluginCreator___parent___parent___id\n  pluginCreator___pluginFilepath\n  pluginCreator___pluginOptions\n  pluginCreator___resolve\n  pluginCreator___ssrAPIs\n  pluginCreator___version\n}\n\ninput SitePageFilterInput {\n  children: NodeFilterListInput\n  component: StringQueryOperatorInput\n  componentChunkName: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  internalComponentName: StringQueryOperatorInput\n  matchPath: StringQueryOperatorInput\n  pageContext: JSONQueryOperatorInput\n  parent: NodeFilterInput\n  path: StringQueryOperatorInput\n  pluginCreator: SitePluginFilterInput\n}\n\ntype SitePageGroupConnection {\n  distinct(field: SitePageFieldsEnum!): [String!]!\n  edges: [SitePageEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: SitePageFieldsEnum!, limit: Int, skip: Int): [SitePageGroupConnection!]!\n  max(field: SitePageFieldsEnum!): Float\n  min(field: SitePageFieldsEnum!): Float\n  nodes: [SitePage!]!\n  pageInfo: PageInfo!\n  sum(field: SitePageFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput SitePageSortInput {\n  fields: [SitePageFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\ntype SitePlugin implements Node {\n  browserAPIs: [String]\n  children: [Node!]!\n  id: ID!\n  internal: Internal!\n  name: String\n  nodeAPIs: [String]\n  packageJson: JSON\n  parent: Node\n  pluginFilepath: String\n  pluginOptions: JSON\n  resolve: String\n  ssrAPIs: [String]\n  version: String\n}\n\ntype SitePluginConnection {\n  distinct(field: SitePluginFieldsEnum!): [String!]!\n  edges: [SitePluginEdge!]!\n  group(field: SitePluginFieldsEnum!, limit: Int, skip: Int): [SitePluginGroupConnection!]!\n  max(field: SitePluginFieldsEnum!): Float\n  min(field: SitePluginFieldsEnum!): Float\n  nodes: [SitePlugin!]!\n  pageInfo: PageInfo!\n  sum(field: SitePluginFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype SitePluginEdge {\n  next: SitePlugin\n  node: SitePlugin!\n  previous: SitePlugin\n}\n\nenum SitePluginFieldsEnum {\n  browserAPIs\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  name\n  nodeAPIs\n  packageJson\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  pluginFilepath\n  pluginOptions\n  resolve\n  ssrAPIs\n  version\n}\n\ninput SitePluginFilterInput {\n  browserAPIs: StringQueryOperatorInput\n  children: NodeFilterListInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  name: StringQueryOperatorInput\n  nodeAPIs: StringQueryOperatorInput\n  packageJson: JSONQueryOperatorInput\n  parent: NodeFilterInput\n  pluginFilepath: StringQueryOperatorInput\n  pluginOptions: JSONQueryOperatorInput\n  resolve: StringQueryOperatorInput\n  ssrAPIs: StringQueryOperatorInput\n  version: StringQueryOperatorInput\n}\n\ntype SitePluginGroupConnection {\n  distinct(field: SitePluginFieldsEnum!): [String!]!\n  edges: [SitePluginEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: SitePluginFieldsEnum!, limit: Int, skip: Int): [SitePluginGroupConnection!]!\n  max(field: SitePluginFieldsEnum!): Float\n  min(field: SitePluginFieldsEnum!): Float\n  nodes: [SitePlugin!]!\n  pageInfo: PageInfo!\n  sum(field: SitePluginFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput SitePluginSortInput {\n  fields: [SitePluginFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\ntype SiteSiteMetadata {\n  description: String\n  title: String\n}\n\ninput SiteSiteMetadataFilterInput {\n  description: StringQueryOperatorInput\n  title: StringQueryOperatorInput\n}\n\ninput SiteSortInput {\n  fields: [SiteFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\nenum SortOrderEnum {\n  ASC\n  DESC\n}\n\ninput StringQueryOperatorInput {\n  eq: String\n  glob: String\n  in: [String]\n  ne: String\n  nin: [String]\n  regex: String\n}\n\ninput TransformOptions {\n  cropFocus: ImageCropFocus = ATTENTION\n  duotone: DuotoneGradient\n  fit: ImageFit = COVER\n  grayscale: Boolean = false\n  rotate: Int = 0\n  trim: Float = 0\n}\n\ninput WebPOptions {\n  quality: Int\n}\n\n\"\"\"\nNon-node WPGraphQL root fields.\n\"\"\"\ntype Wp implements Node {\n  \"\"\"\n  Entry point to get all settings for the site\n  \"\"\"\n  allSettings: WpSettings\n  children: [Node!]!\n\n  \"\"\"\n  Fields of the &#039;DiscussionSettings&#039; settings group\n  \"\"\"\n  discussionSettings: WpDiscussionSettings\n\n  \"\"\"\n  Fields of the &#039;GeneralSettings&#039; settings group\n  \"\"\"\n  generalSettings: WpGeneralSettings\n  id: ID!\n  internal: Internal!\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  Fields of the &#039;ReadingSettings&#039; settings group\n  \"\"\"\n  readingSettings: WpReadingSettings\n\n  \"\"\"\n  Information needed by gatsby-source-wordpress.\n  \"\"\"\n  wpGatsby: WpWPGatsby\n\n  \"\"\"\n  Fields of the &#039;WritingSettings&#039; settings group\n  \"\"\"\n  writingSettings: WpWritingSettings\n}\n\n\"\"\"\nAvatars are profile images for users. WordPress by default uses the Gravatar service to host and fetch avatars from.\n\"\"\"\ntype WpAvatar {\n  \"\"\"\n  URL for the default image or a default type. Accepts &#039;404&#039; (return a 404 instead of a default image), &#039;retro&#039; (8bit), &#039;monsterid&#039; (monster), &#039;wavatar&#039; (cartoon face), &#039;indenticon&#039; (the &#039;quilt&#039;), &#039;mystery&#039;, &#039;mm&#039;, or &#039;mysteryman&#039; (The Oyster Man), &#039;blank&#039; (transparent GIF), or &#039;gravatar_default&#039; (the Gravatar logo).\n  \"\"\"\n  default: String\n\n  \"\"\"\n  HTML attributes to insert in the IMG element. Is not sanitized.\n  \"\"\"\n  extraAttr: String\n\n  \"\"\"\n  Whether to always show the default image, never the Gravatar.\n  \"\"\"\n  forceDefault: Boolean\n\n  \"\"\"\n  Whether the avatar was successfully found.\n  \"\"\"\n  foundAvatar: Boolean\n\n  \"\"\"\n  Height of the avatar image.\n  \"\"\"\n  height: Int\n\n  \"\"\"\n  What rating to display avatars up to. Accepts &#039;G&#039;, &#039;PG&#039;, &#039;R&#039;, &#039;X&#039;, and are judged in that order.\n  \"\"\"\n  rating: String\n\n  \"\"\"\n  Type of url scheme to use. Typically HTTP vs. HTTPS.\n  \"\"\"\n  scheme: String\n\n  \"\"\"\n  The size of the avatar in pixels. A value of 96 will match a 96px x 96px gravatar image.\n  \"\"\"\n  size: Int\n\n  \"\"\"\n  URL for the gravatar image source.\n  \"\"\"\n  url: String\n\n  \"\"\"\n  Width of the avatar image.\n  \"\"\"\n  width: Int\n}\n\ninput WpAvatarFilterInput {\n  default: StringQueryOperatorInput\n  extraAttr: StringQueryOperatorInput\n  forceDefault: BooleanQueryOperatorInput\n  foundAvatar: BooleanQueryOperatorInput\n  height: IntQueryOperatorInput\n  rating: StringQueryOperatorInput\n  scheme: StringQueryOperatorInput\n  size: IntQueryOperatorInput\n  url: StringQueryOperatorInput\n  width: IntQueryOperatorInput\n}\n\ninterface WpBlock {\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpBlockAttributesObject {\n  foobar: String\n}\n\ninterface WpBlockEditorContentNode implements Node {\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  blocks: [WpBlock!]\n\n  \"\"\"\n  Gutenberg blocks as json string\n  \"\"\"\n  blocksJSON: String\n  children: [Node!]!\n  id: ID!\n  internal: Internal!\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  Previewed gutenberg blocks\n  \"\"\"\n  previewBlocks: [WpBlock!]\n\n  \"\"\"\n  Previewed Gutenberg blocks as json string\n  \"\"\"\n  previewBlocksJSON: String\n}\n\ntype WpBlockEditorContentNodeConnection {\n  distinct(field: WpBlockEditorContentNodeFieldsEnum!): [String!]!\n  edges: [WpBlockEditorContentNodeEdge!]!\n  group(field: WpBlockEditorContentNodeFieldsEnum!, limit: Int, skip: Int): [WpBlockEditorContentNodeGroupConnection!]!\n  max(field: WpBlockEditorContentNodeFieldsEnum!): Float\n  min(field: WpBlockEditorContentNodeFieldsEnum!): Float\n  nodes: [WpBlockEditorContentNode!]!\n  pageInfo: PageInfo!\n  sum(field: WpBlockEditorContentNodeFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpBlockEditorContentNodeEdge {\n  next: WpBlockEditorContentNode\n  node: WpBlockEditorContentNode!\n  previous: WpBlockEditorContentNode\n}\n\nenum WpBlockEditorContentNodeFieldsEnum {\n  blocks\n  blocksJSON\n  blocks___attributesJSON\n  blocks___dynamicContent\n  blocks___innerBlocks\n  blocks___innerBlocks___attributesJSON\n  blocks___innerBlocks___dynamicContent\n  blocks___innerBlocks___innerBlocks\n  blocks___innerBlocks___innerBlocks___attributesJSON\n  blocks___innerBlocks___innerBlocks___dynamicContent\n  blocks___innerBlocks___innerBlocks___innerBlocks\n  blocks___innerBlocks___innerBlocks___isDynamic\n  blocks___innerBlocks___innerBlocks___name\n  blocks___innerBlocks___innerBlocks___order\n  blocks___innerBlocks___innerBlocks___originalContent\n  blocks___innerBlocks___innerBlocks___parentNodeDatabaseId\n  blocks___innerBlocks___innerBlocks___saveContent\n  blocks___innerBlocks___isDynamic\n  blocks___innerBlocks___name\n  blocks___innerBlocks___order\n  blocks___innerBlocks___originalContent\n  blocks___innerBlocks___parentNodeDatabaseId\n  blocks___innerBlocks___parentNode___id\n  blocks___innerBlocks___saveContent\n  blocks___isDynamic\n  blocks___name\n  blocks___order\n  blocks___originalContent\n  blocks___parentNodeDatabaseId\n  blocks___parentNode___id\n  blocks___saveContent\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  previewBlocks\n  previewBlocksJSON\n  previewBlocks___attributesJSON\n  previewBlocks___dynamicContent\n  previewBlocks___innerBlocks\n  previewBlocks___innerBlocks___attributesJSON\n  previewBlocks___innerBlocks___dynamicContent\n  previewBlocks___innerBlocks___innerBlocks\n  previewBlocks___innerBlocks___innerBlocks___attributesJSON\n  previewBlocks___innerBlocks___innerBlocks___dynamicContent\n  previewBlocks___innerBlocks___innerBlocks___innerBlocks\n  previewBlocks___innerBlocks___innerBlocks___isDynamic\n  previewBlocks___innerBlocks___innerBlocks___name\n  previewBlocks___innerBlocks___innerBlocks___order\n  previewBlocks___innerBlocks___innerBlocks___originalContent\n  previewBlocks___innerBlocks___innerBlocks___parentNodeDatabaseId\n  previewBlocks___innerBlocks___innerBlocks___saveContent\n  previewBlocks___innerBlocks___isDynamic\n  previewBlocks___innerBlocks___name\n  previewBlocks___innerBlocks___order\n  previewBlocks___innerBlocks___originalContent\n  previewBlocks___innerBlocks___parentNodeDatabaseId\n  previewBlocks___innerBlocks___parentNode___id\n  previewBlocks___innerBlocks___saveContent\n  previewBlocks___isDynamic\n  previewBlocks___name\n  previewBlocks___order\n  previewBlocks___originalContent\n  previewBlocks___parentNodeDatabaseId\n  previewBlocks___parentNode___id\n  previewBlocks___saveContent\n}\n\ninput WpBlockEditorContentNodeFilterInput {\n  blocks: WpBlockFilterListInput\n  blocksJSON: StringQueryOperatorInput\n  children: NodeFilterListInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  previewBlocks: WpBlockFilterListInput\n  previewBlocksJSON: StringQueryOperatorInput\n}\n\ntype WpBlockEditorContentNodeGroupConnection {\n  distinct(field: WpBlockEditorContentNodeFieldsEnum!): [String!]!\n  edges: [WpBlockEditorContentNodeEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpBlockEditorContentNodeFieldsEnum!, limit: Int, skip: Int): [WpBlockEditorContentNodeGroupConnection!]!\n  max(field: WpBlockEditorContentNodeFieldsEnum!): Float\n  min(field: WpBlockEditorContentNodeFieldsEnum!): Float\n  nodes: [WpBlockEditorContentNode!]!\n  pageInfo: PageInfo!\n  sum(field: WpBlockEditorContentNodeFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpBlockEditorContentNodeSortInput {\n  fields: [WpBlockEditorContentNodeFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nThe BlockEditorPreview type\n\"\"\"\ntype WpBlockEditorPreview implements Node & WpContentNode & WpDatabaseIdentifier & WpNode & WpNodeWithAuthor & WpNodeWithContentEditor & WpNodeWithTemplate & WpNodeWithTitle & WpUniformResourceIdentifiable {\n  \"\"\"\n  Connection between the NodeWithAuthor type and the User type\n  \"\"\"\n  author: WpNodeWithAuthorToUserConnectionEdge\n\n  \"\"\"\n  The database identifier of the author of the node\n  \"\"\"\n  authorDatabaseId: Int\n\n  \"\"\"\n  The globally unique identifier of the author of the node\n  \"\"\"\n  authorId: ID\n  blocks: [WpBlock!]\n  blocksJSON: String\n  children: [Node!]!\n\n  \"\"\"\n  The content of the post.\n  \"\"\"\n  content: String\n\n  \"\"\"\n  Connection between the ContentNode type and the ContentType type\n  \"\"\"\n  contentType: WpContentNodeToContentTypeConnectionEdge\n\n  \"\"\"\n  The name of the Content Type the node belongs to\n  \"\"\"\n  contentTypeName: String!\n\n  \"\"\"\n  The unique identifier stored in the database\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  Post publishing date.\n  \"\"\"\n  date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The publishing date set in GMT.\n  \"\"\"\n  dateGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The desired slug of the post\n  \"\"\"\n  desiredSlug: String\n\n  \"\"\"\n  The RSS enclosure for the object\n  \"\"\"\n  enclosure: String\n\n  \"\"\"\n  The global unique identifier for this post. This currently matches the value stored in WP_Post-&gt;guid and the guid column in the &quot;post_objects&quot; database table.\n  \"\"\"\n  guid: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  The user that most recently edited the node\n  \"\"\"\n  lastEditedBy: WpContentNodeToEditLastConnectionEdge\n  lastUpdateTime: String\n\n  \"\"\"\n  The permalink of the post\n  \"\"\"\n  link: String\n\n  \"\"\"\n  The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time.\n  \"\"\"\n  modified(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT.\n  \"\"\"\n  modifiedGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  nodeType: String\n  parent: Node\n  previewed: WpBlockEditorContentNode\n  previewedDatabaseId: Int\n  previewedParentDatabaseId: Int\n\n  \"\"\"\n  The uri slug for the post. This is equivalent to the WP_Post-&gt;post_name field and the post_name column in the database for the &quot;post_objects&quot; table.\n  \"\"\"\n  slug: String\n\n  \"\"\"\n  The current status of the object\n  \"\"\"\n  status: String\n\n  \"\"\"\n  The template assigned to the node\n  \"\"\"\n  template: WpContentTemplate\n\n  \"\"\"\n  The title of the post. This is currently just the raw title. An amendment to support rendered title needs to be made.\n  \"\"\"\n  title: String\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n}\n\ntype WpBlockEditorPreviewConnection {\n  distinct(field: WpBlockEditorPreviewFieldsEnum!): [String!]!\n  edges: [WpBlockEditorPreviewEdge!]!\n  group(field: WpBlockEditorPreviewFieldsEnum!, limit: Int, skip: Int): [WpBlockEditorPreviewGroupConnection!]!\n  max(field: WpBlockEditorPreviewFieldsEnum!): Float\n  min(field: WpBlockEditorPreviewFieldsEnum!): Float\n  nodes: [WpBlockEditorPreview!]!\n  pageInfo: PageInfo!\n  sum(field: WpBlockEditorPreviewFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpBlockEditorPreviewEdge {\n  next: WpBlockEditorPreview\n  node: WpBlockEditorPreview!\n  previous: WpBlockEditorPreview\n}\n\nenum WpBlockEditorPreviewFieldsEnum {\n  authorDatabaseId\n  authorId\n  author___node___avatar___default\n  author___node___avatar___extraAttr\n  author___node___avatar___forceDefault\n  author___node___avatar___foundAvatar\n  author___node___avatar___height\n  author___node___avatar___rating\n  author___node___avatar___scheme\n  author___node___avatar___size\n  author___node___avatar___url\n  author___node___avatar___width\n  author___node___blockEditorPreviews___nodes\n  author___node___capKey\n  author___node___capabilities\n  author___node___children\n  author___node___children___children\n  author___node___children___id\n  author___node___comments___nodes\n  author___node___databaseId\n  author___node___description\n  author___node___email\n  author___node___extraCapabilities\n  author___node___firstName\n  author___node___id\n  author___node___internal___content\n  author___node___internal___contentDigest\n  author___node___internal___description\n  author___node___internal___fieldOwners\n  author___node___internal___ignoreType\n  author___node___internal___mediaType\n  author___node___internal___owner\n  author___node___internal___type\n  author___node___isContentNode\n  author___node___isTermNode\n  author___node___lastName\n  author___node___locale\n  author___node___name\n  author___node___nicename\n  author___node___nickname\n  author___node___nodeType\n  author___node___pages___nodes\n  author___node___parent___children\n  author___node___parent___id\n  author___node___posts___nodes\n  author___node___registeredDate\n  author___node___roles___nodes\n  author___node___slug\n  author___node___uri\n  author___node___url\n  author___node___username\n  blocks\n  blocksJSON\n  blocks___attributesJSON\n  blocks___dynamicContent\n  blocks___innerBlocks\n  blocks___innerBlocks___attributesJSON\n  blocks___innerBlocks___dynamicContent\n  blocks___innerBlocks___innerBlocks\n  blocks___innerBlocks___innerBlocks___attributesJSON\n  blocks___innerBlocks___innerBlocks___dynamicContent\n  blocks___innerBlocks___innerBlocks___innerBlocks\n  blocks___innerBlocks___innerBlocks___isDynamic\n  blocks___innerBlocks___innerBlocks___name\n  blocks___innerBlocks___innerBlocks___order\n  blocks___innerBlocks___innerBlocks___originalContent\n  blocks___innerBlocks___innerBlocks___parentNodeDatabaseId\n  blocks___innerBlocks___innerBlocks___saveContent\n  blocks___innerBlocks___isDynamic\n  blocks___innerBlocks___name\n  blocks___innerBlocks___order\n  blocks___innerBlocks___originalContent\n  blocks___innerBlocks___parentNodeDatabaseId\n  blocks___innerBlocks___parentNode___id\n  blocks___innerBlocks___saveContent\n  blocks___isDynamic\n  blocks___name\n  blocks___order\n  blocks___originalContent\n  blocks___parentNodeDatabaseId\n  blocks___parentNode___id\n  blocks___saveContent\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  content\n  contentTypeName\n  contentType___node___archivePath\n  contentType___node___canExport\n  contentType___node___children\n  contentType___node___children___children\n  contentType___node___children___id\n  contentType___node___connectedTaxonomies___nodes\n  contentType___node___contentNodes___nodes\n  contentType___node___deleteWithUser\n  contentType___node___description\n  contentType___node___excludeFromSearch\n  contentType___node___graphqlPluralName\n  contentType___node___graphqlSingleName\n  contentType___node___hasArchive\n  contentType___node___hierarchical\n  contentType___node___id\n  contentType___node___internal___content\n  contentType___node___internal___contentDigest\n  contentType___node___internal___description\n  contentType___node___internal___fieldOwners\n  contentType___node___internal___ignoreType\n  contentType___node___internal___mediaType\n  contentType___node___internal___owner\n  contentType___node___internal___type\n  contentType___node___isContentNode\n  contentType___node___isFrontPage\n  contentType___node___isPostsPage\n  contentType___node___isTermNode\n  contentType___node___label\n  contentType___node___labels___addNew\n  contentType___node___labels___addNewItem\n  contentType___node___labels___allItems\n  contentType___node___labels___archives\n  contentType___node___labels___attributes\n  contentType___node___labels___editItem\n  contentType___node___labels___featuredImage\n  contentType___node___labels___filterItemsList\n  contentType___node___labels___insertIntoItem\n  contentType___node___labels___itemsList\n  contentType___node___labels___itemsListNavigation\n  contentType___node___labels___menuName\n  contentType___node___labels___name\n  contentType___node___labels___newItem\n  contentType___node___labels___notFound\n  contentType___node___labels___notFoundInTrash\n  contentType___node___labels___parentItemColon\n  contentType___node___labels___removeFeaturedImage\n  contentType___node___labels___searchItems\n  contentType___node___labels___setFeaturedImage\n  contentType___node___labels___singularName\n  contentType___node___labels___uploadedToThisItem\n  contentType___node___labels___useFeaturedImage\n  contentType___node___labels___viewItem\n  contentType___node___labels___viewItems\n  contentType___node___menuIcon\n  contentType___node___menuPosition\n  contentType___node___name\n  contentType___node___nodeType\n  contentType___node___parent___children\n  contentType___node___parent___id\n  contentType___node___public\n  contentType___node___publiclyQueryable\n  contentType___node___restBase\n  contentType___node___restControllerClass\n  contentType___node___showInAdminBar\n  contentType___node___showInGraphql\n  contentType___node___showInMenu\n  contentType___node___showInNavMenus\n  contentType___node___showInRest\n  contentType___node___showUi\n  contentType___node___uri\n  databaseId\n  date\n  dateGmt\n  desiredSlug\n  enclosure\n  guid\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  isContentNode\n  isTermNode\n  lastEditedBy___node___avatar___default\n  lastEditedBy___node___avatar___extraAttr\n  lastEditedBy___node___avatar___forceDefault\n  lastEditedBy___node___avatar___foundAvatar\n  lastEditedBy___node___avatar___height\n  lastEditedBy___node___avatar___rating\n  lastEditedBy___node___avatar___scheme\n  lastEditedBy___node___avatar___size\n  lastEditedBy___node___avatar___url\n  lastEditedBy___node___avatar___width\n  lastEditedBy___node___blockEditorPreviews___nodes\n  lastEditedBy___node___capKey\n  lastEditedBy___node___capabilities\n  lastEditedBy___node___children\n  lastEditedBy___node___children___children\n  lastEditedBy___node___children___id\n  lastEditedBy___node___comments___nodes\n  lastEditedBy___node___databaseId\n  lastEditedBy___node___description\n  lastEditedBy___node___email\n  lastEditedBy___node___extraCapabilities\n  lastEditedBy___node___firstName\n  lastEditedBy___node___id\n  lastEditedBy___node___internal___content\n  lastEditedBy___node___internal___contentDigest\n  lastEditedBy___node___internal___description\n  lastEditedBy___node___internal___fieldOwners\n  lastEditedBy___node___internal___ignoreType\n  lastEditedBy___node___internal___mediaType\n  lastEditedBy___node___internal___owner\n  lastEditedBy___node___internal___type\n  lastEditedBy___node___isContentNode\n  lastEditedBy___node___isTermNode\n  lastEditedBy___node___lastName\n  lastEditedBy___node___locale\n  lastEditedBy___node___name\n  lastEditedBy___node___nicename\n  lastEditedBy___node___nickname\n  lastEditedBy___node___nodeType\n  lastEditedBy___node___pages___nodes\n  lastEditedBy___node___parent___children\n  lastEditedBy___node___parent___id\n  lastEditedBy___node___posts___nodes\n  lastEditedBy___node___registeredDate\n  lastEditedBy___node___roles___nodes\n  lastEditedBy___node___slug\n  lastEditedBy___node___uri\n  lastEditedBy___node___url\n  lastEditedBy___node___username\n  lastUpdateTime\n  link\n  modified\n  modifiedGmt\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  previewedDatabaseId\n  previewedParentDatabaseId\n  previewed___blocks\n  previewed___blocksJSON\n  previewed___blocks___attributesJSON\n  previewed___blocks___dynamicContent\n  previewed___blocks___innerBlocks\n  previewed___blocks___innerBlocks___attributesJSON\n  previewed___blocks___innerBlocks___dynamicContent\n  previewed___blocks___innerBlocks___innerBlocks\n  previewed___blocks___innerBlocks___isDynamic\n  previewed___blocks___innerBlocks___name\n  previewed___blocks___innerBlocks___order\n  previewed___blocks___innerBlocks___originalContent\n  previewed___blocks___innerBlocks___parentNodeDatabaseId\n  previewed___blocks___innerBlocks___saveContent\n  previewed___blocks___isDynamic\n  previewed___blocks___name\n  previewed___blocks___order\n  previewed___blocks___originalContent\n  previewed___blocks___parentNodeDatabaseId\n  previewed___blocks___parentNode___id\n  previewed___blocks___saveContent\n  previewed___children\n  previewed___children___children\n  previewed___children___children___children\n  previewed___children___children___id\n  previewed___children___id\n  previewed___children___internal___content\n  previewed___children___internal___contentDigest\n  previewed___children___internal___description\n  previewed___children___internal___fieldOwners\n  previewed___children___internal___ignoreType\n  previewed___children___internal___mediaType\n  previewed___children___internal___owner\n  previewed___children___internal___type\n  previewed___children___parent___children\n  previewed___children___parent___id\n  previewed___id\n  previewed___internal___content\n  previewed___internal___contentDigest\n  previewed___internal___description\n  previewed___internal___fieldOwners\n  previewed___internal___ignoreType\n  previewed___internal___mediaType\n  previewed___internal___owner\n  previewed___internal___type\n  previewed___nodeType\n  previewed___parent___children\n  previewed___parent___children___children\n  previewed___parent___children___id\n  previewed___parent___id\n  previewed___parent___internal___content\n  previewed___parent___internal___contentDigest\n  previewed___parent___internal___description\n  previewed___parent___internal___fieldOwners\n  previewed___parent___internal___ignoreType\n  previewed___parent___internal___mediaType\n  previewed___parent___internal___owner\n  previewed___parent___internal___type\n  previewed___parent___parent___children\n  previewed___parent___parent___id\n  previewed___previewBlocks\n  previewed___previewBlocksJSON\n  previewed___previewBlocks___attributesJSON\n  previewed___previewBlocks___dynamicContent\n  previewed___previewBlocks___innerBlocks\n  previewed___previewBlocks___innerBlocks___attributesJSON\n  previewed___previewBlocks___innerBlocks___dynamicContent\n  previewed___previewBlocks___innerBlocks___innerBlocks\n  previewed___previewBlocks___innerBlocks___isDynamic\n  previewed___previewBlocks___innerBlocks___name\n  previewed___previewBlocks___innerBlocks___order\n  previewed___previewBlocks___innerBlocks___originalContent\n  previewed___previewBlocks___innerBlocks___parentNodeDatabaseId\n  previewed___previewBlocks___innerBlocks___saveContent\n  previewed___previewBlocks___isDynamic\n  previewed___previewBlocks___name\n  previewed___previewBlocks___order\n  previewed___previewBlocks___originalContent\n  previewed___previewBlocks___parentNodeDatabaseId\n  previewed___previewBlocks___parentNode___id\n  previewed___previewBlocks___saveContent\n  slug\n  status\n  template___templateName\n  title\n  uri\n}\n\ninput WpBlockEditorPreviewFilterInput {\n  author: WpNodeWithAuthorToUserConnectionEdgeFilterInput\n  authorDatabaseId: IntQueryOperatorInput\n  authorId: IDQueryOperatorInput\n  blocks: WpBlockFilterListInput\n  blocksJSON: StringQueryOperatorInput\n  children: NodeFilterListInput\n  content: StringQueryOperatorInput\n  contentType: WpContentNodeToContentTypeConnectionEdgeFilterInput\n  contentTypeName: StringQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  date: DateQueryOperatorInput\n  dateGmt: DateQueryOperatorInput\n  desiredSlug: StringQueryOperatorInput\n  enclosure: StringQueryOperatorInput\n  guid: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  isContentNode: BooleanQueryOperatorInput\n  isTermNode: BooleanQueryOperatorInput\n  lastEditedBy: WpContentNodeToEditLastConnectionEdgeFilterInput\n  lastUpdateTime: StringQueryOperatorInput\n  link: StringQueryOperatorInput\n  modified: DateQueryOperatorInput\n  modifiedGmt: DateQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  previewed: WpBlockEditorContentNodeFilterInput\n  previewedDatabaseId: IntQueryOperatorInput\n  previewedParentDatabaseId: IntQueryOperatorInput\n  slug: StringQueryOperatorInput\n  status: StringQueryOperatorInput\n  template: WpContentTemplateFilterInput\n  title: StringQueryOperatorInput\n  uri: StringQueryOperatorInput\n}\n\ninput WpBlockEditorPreviewFilterListInput {\n  elemMatch: WpBlockEditorPreviewFilterInput\n}\n\ntype WpBlockEditorPreviewGroupConnection {\n  distinct(field: WpBlockEditorPreviewFieldsEnum!): [String!]!\n  edges: [WpBlockEditorPreviewEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpBlockEditorPreviewFieldsEnum!, limit: Int, skip: Int): [WpBlockEditorPreviewGroupConnection!]!\n  max(field: WpBlockEditorPreviewFieldsEnum!): Float\n  min(field: WpBlockEditorPreviewFieldsEnum!): Float\n  nodes: [WpBlockEditorPreview!]!\n  pageInfo: PageInfo!\n  sum(field: WpBlockEditorPreviewFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpBlockEditorPreviewSortInput {\n  fields: [WpBlockEditorPreviewFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\ninput WpBlockFilterInput {\n  attributesJSON: StringQueryOperatorInput\n  dynamicContent: StringQueryOperatorInput\n  innerBlocks: WpBlockFilterListInput\n  isDynamic: BooleanQueryOperatorInput\n  name: StringQueryOperatorInput\n  order: IntQueryOperatorInput\n  originalContent: StringQueryOperatorInput\n  parentNode: WpNodeFilterInput\n  parentNodeDatabaseId: IntQueryOperatorInput\n  saveContent: StringQueryOperatorInput\n}\n\ninput WpBlockFilterListInput {\n  elemMatch: WpBlockFilterInput\n}\n\n\"\"\"\nThe category type\n\"\"\"\ntype WpCategory implements Node & WpDatabaseIdentifier & WpHierarchicalTermNode & WpMenuItemLinkable & WpNode & WpTermNode & WpUniformResourceIdentifiable {\n  \"\"\"\n  The ancestors of the node. Default ordered as lowest (closest to the child) to highest (closest to the root).\n  \"\"\"\n  ancestors: WpCategoryToAncestorsCategoryConnection\n  children: [Node!]!\n\n  \"\"\"\n  Connection between the category type and the ContentNode type\n  \"\"\"\n  contentNodes: WpCategoryToContentNodeConnection\n\n  \"\"\"\n  The number of objects connected to the object\n  \"\"\"\n  count: Int\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  The description of the object\n  \"\"\"\n  description: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  The link to the term\n  \"\"\"\n  link: String\n\n  \"\"\"\n  The human friendly name of the object.\n  \"\"\"\n  name: String\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  Database id of the parent node\n  \"\"\"\n  parentDatabaseId: Int\n\n  \"\"\"\n  The globally unique identifier of the parent node.\n  \"\"\"\n  parentId: ID\n\n  \"\"\"\n  Connection between the category type and the post type\n  \"\"\"\n  posts: WpCategoryToPostConnection\n\n  \"\"\"\n  An alphanumeric identifier for the object unique to its type.\n  \"\"\"\n  slug: String\n\n  \"\"\"\n  Connection between the category type and the Taxonomy type\n  \"\"\"\n  taxonomy: WpCategoryToTaxonomyConnectionEdge\n\n  \"\"\"\n  The name of the taxonomy that the object is associated with\n  \"\"\"\n  taxonomyName: String\n\n  \"\"\"\n  The ID of the term group that this term object belongs to\n  \"\"\"\n  termGroupId: Int\n\n  \"\"\"\n  The taxonomy ID that the object is associated with\n  \"\"\"\n  termTaxonomyId: Int\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n\n  \"\"\"\n  Connection between the category type and the category type\n  \"\"\"\n  wpChildren: WpCategoryToCategoryConnection\n\n  \"\"\"\n  Connection between the category type and the category type\n  \"\"\"\n  wpParent: WpCategoryToParentCategoryConnectionEdge\n}\n\ntype WpCategoryConnection {\n  distinct(field: WpCategoryFieldsEnum!): [String!]!\n  edges: [WpCategoryEdge!]!\n  group(field: WpCategoryFieldsEnum!, limit: Int, skip: Int): [WpCategoryGroupConnection!]!\n  max(field: WpCategoryFieldsEnum!): Float\n  min(field: WpCategoryFieldsEnum!): Float\n  nodes: [WpCategory!]!\n  pageInfo: PageInfo!\n  sum(field: WpCategoryFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpCategoryEdge {\n  next: WpCategory\n  node: WpCategory!\n  previous: WpCategory\n}\n\nenum WpCategoryFieldsEnum {\n  ancestors___nodes\n  ancestors___nodes___ancestors___nodes\n  ancestors___nodes___children\n  ancestors___nodes___children___children\n  ancestors___nodes___children___id\n  ancestors___nodes___contentNodes___nodes\n  ancestors___nodes___count\n  ancestors___nodes___databaseId\n  ancestors___nodes___description\n  ancestors___nodes___id\n  ancestors___nodes___internal___content\n  ancestors___nodes___internal___contentDigest\n  ancestors___nodes___internal___description\n  ancestors___nodes___internal___fieldOwners\n  ancestors___nodes___internal___ignoreType\n  ancestors___nodes___internal___mediaType\n  ancestors___nodes___internal___owner\n  ancestors___nodes___internal___type\n  ancestors___nodes___isContentNode\n  ancestors___nodes___isTermNode\n  ancestors___nodes___link\n  ancestors___nodes___name\n  ancestors___nodes___nodeType\n  ancestors___nodes___parentDatabaseId\n  ancestors___nodes___parentId\n  ancestors___nodes___parent___children\n  ancestors___nodes___parent___id\n  ancestors___nodes___posts___nodes\n  ancestors___nodes___slug\n  ancestors___nodes___taxonomyName\n  ancestors___nodes___termGroupId\n  ancestors___nodes___termTaxonomyId\n  ancestors___nodes___uri\n  ancestors___nodes___wpChildren___nodes\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  contentNodes___nodes\n  contentNodes___nodes___children\n  contentNodes___nodes___children___children\n  contentNodes___nodes___children___id\n  contentNodes___nodes___contentTypeName\n  contentNodes___nodes___databaseId\n  contentNodes___nodes___date\n  contentNodes___nodes___dateGmt\n  contentNodes___nodes___desiredSlug\n  contentNodes___nodes___enclosure\n  contentNodes___nodes___guid\n  contentNodes___nodes___id\n  contentNodes___nodes___internal___content\n  contentNodes___nodes___internal___contentDigest\n  contentNodes___nodes___internal___description\n  contentNodes___nodes___internal___fieldOwners\n  contentNodes___nodes___internal___ignoreType\n  contentNodes___nodes___internal___mediaType\n  contentNodes___nodes___internal___owner\n  contentNodes___nodes___internal___type\n  contentNodes___nodes___isContentNode\n  contentNodes___nodes___isTermNode\n  contentNodes___nodes___link\n  contentNodes___nodes___modified\n  contentNodes___nodes___modifiedGmt\n  contentNodes___nodes___nodeType\n  contentNodes___nodes___parent___children\n  contentNodes___nodes___parent___id\n  contentNodes___nodes___slug\n  contentNodes___nodes___status\n  contentNodes___nodes___template___templateName\n  contentNodes___nodes___uri\n  count\n  databaseId\n  description\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  isContentNode\n  isTermNode\n  link\n  name\n  nodeType\n  parentDatabaseId\n  parentId\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  posts___nodes\n  posts___nodes___authorDatabaseId\n  posts___nodes___authorId\n  posts___nodes___blocks\n  posts___nodes___blocksJSON\n  posts___nodes___blocks___attributesJSON\n  posts___nodes___blocks___dynamicContent\n  posts___nodes___blocks___innerBlocks\n  posts___nodes___blocks___isDynamic\n  posts___nodes___blocks___name\n  posts___nodes___blocks___order\n  posts___nodes___blocks___originalContent\n  posts___nodes___blocks___parentNodeDatabaseId\n  posts___nodes___blocks___saveContent\n  posts___nodes___categories___nodes\n  posts___nodes___children\n  posts___nodes___children___children\n  posts___nodes___children___id\n  posts___nodes___commentCount\n  posts___nodes___commentStatus\n  posts___nodes___comments___nodes\n  posts___nodes___content\n  posts___nodes___contentTypeName\n  posts___nodes___databaseId\n  posts___nodes___date\n  posts___nodes___dateGmt\n  posts___nodes___desiredSlug\n  posts___nodes___enclosure\n  posts___nodes___excerpt\n  posts___nodes___featuredImageDatabaseId\n  posts___nodes___featuredImageId\n  posts___nodes___guid\n  posts___nodes___id\n  posts___nodes___internal___content\n  posts___nodes___internal___contentDigest\n  posts___nodes___internal___description\n  posts___nodes___internal___fieldOwners\n  posts___nodes___internal___ignoreType\n  posts___nodes___internal___mediaType\n  posts___nodes___internal___owner\n  posts___nodes___internal___type\n  posts___nodes___isContentNode\n  posts___nodes___isRevision\n  posts___nodes___isSticky\n  posts___nodes___isTermNode\n  posts___nodes___link\n  posts___nodes___modified\n  posts___nodes___modifiedGmt\n  posts___nodes___nodeType\n  posts___nodes___parent___children\n  posts___nodes___parent___id\n  posts___nodes___pingStatus\n  posts___nodes___pinged\n  posts___nodes___postFormats___nodes\n  posts___nodes___previewBlocks\n  posts___nodes___previewBlocksJSON\n  posts___nodes___previewBlocks___attributesJSON\n  posts___nodes___previewBlocks___dynamicContent\n  posts___nodes___previewBlocks___innerBlocks\n  posts___nodes___previewBlocks___isDynamic\n  posts___nodes___previewBlocks___name\n  posts___nodes___previewBlocks___order\n  posts___nodes___previewBlocks___originalContent\n  posts___nodes___previewBlocks___parentNodeDatabaseId\n  posts___nodes___previewBlocks___saveContent\n  posts___nodes___slug\n  posts___nodes___status\n  posts___nodes___tags___nodes\n  posts___nodes___template___templateName\n  posts___nodes___terms___nodes\n  posts___nodes___title\n  posts___nodes___toPing\n  posts___nodes___uri\n  slug\n  taxonomyName\n  taxonomy___node___archivePath\n  taxonomy___node___children\n  taxonomy___node___children___children\n  taxonomy___node___children___id\n  taxonomy___node___connectedContentTypes___nodes\n  taxonomy___node___description\n  taxonomy___node___graphqlPluralName\n  taxonomy___node___graphqlSingleName\n  taxonomy___node___hierarchical\n  taxonomy___node___id\n  taxonomy___node___internal___content\n  taxonomy___node___internal___contentDigest\n  taxonomy___node___internal___description\n  taxonomy___node___internal___fieldOwners\n  taxonomy___node___internal___ignoreType\n  taxonomy___node___internal___mediaType\n  taxonomy___node___internal___owner\n  taxonomy___node___internal___type\n  taxonomy___node___label\n  taxonomy___node___name\n  taxonomy___node___nodeType\n  taxonomy___node___parent___children\n  taxonomy___node___parent___id\n  taxonomy___node___public\n  taxonomy___node___restBase\n  taxonomy___node___restControllerClass\n  taxonomy___node___showCloud\n  taxonomy___node___showInAdminColumn\n  taxonomy___node___showInGraphql\n  taxonomy___node___showInMenu\n  taxonomy___node___showInNavMenus\n  taxonomy___node___showInQuickEdit\n  taxonomy___node___showInRest\n  taxonomy___node___showUi\n  termGroupId\n  termTaxonomyId\n  uri\n  wpChildren___nodes\n  wpChildren___nodes___ancestors___nodes\n  wpChildren___nodes___children\n  wpChildren___nodes___children___children\n  wpChildren___nodes___children___id\n  wpChildren___nodes___contentNodes___nodes\n  wpChildren___nodes___count\n  wpChildren___nodes___databaseId\n  wpChildren___nodes___description\n  wpChildren___nodes___id\n  wpChildren___nodes___internal___content\n  wpChildren___nodes___internal___contentDigest\n  wpChildren___nodes___internal___description\n  wpChildren___nodes___internal___fieldOwners\n  wpChildren___nodes___internal___ignoreType\n  wpChildren___nodes___internal___mediaType\n  wpChildren___nodes___internal___owner\n  wpChildren___nodes___internal___type\n  wpChildren___nodes___isContentNode\n  wpChildren___nodes___isTermNode\n  wpChildren___nodes___link\n  wpChildren___nodes___name\n  wpChildren___nodes___nodeType\n  wpChildren___nodes___parentDatabaseId\n  wpChildren___nodes___parentId\n  wpChildren___nodes___parent___children\n  wpChildren___nodes___parent___id\n  wpChildren___nodes___posts___nodes\n  wpChildren___nodes___slug\n  wpChildren___nodes___taxonomyName\n  wpChildren___nodes___termGroupId\n  wpChildren___nodes___termTaxonomyId\n  wpChildren___nodes___uri\n  wpChildren___nodes___wpChildren___nodes\n  wpParent___node___ancestors___nodes\n  wpParent___node___children\n  wpParent___node___children___children\n  wpParent___node___children___id\n  wpParent___node___contentNodes___nodes\n  wpParent___node___count\n  wpParent___node___databaseId\n  wpParent___node___description\n  wpParent___node___id\n  wpParent___node___internal___content\n  wpParent___node___internal___contentDigest\n  wpParent___node___internal___description\n  wpParent___node___internal___fieldOwners\n  wpParent___node___internal___ignoreType\n  wpParent___node___internal___mediaType\n  wpParent___node___internal___owner\n  wpParent___node___internal___type\n  wpParent___node___isContentNode\n  wpParent___node___isTermNode\n  wpParent___node___link\n  wpParent___node___name\n  wpParent___node___nodeType\n  wpParent___node___parentDatabaseId\n  wpParent___node___parentId\n  wpParent___node___parent___children\n  wpParent___node___parent___id\n  wpParent___node___posts___nodes\n  wpParent___node___slug\n  wpParent___node___taxonomyName\n  wpParent___node___termGroupId\n  wpParent___node___termTaxonomyId\n  wpParent___node___uri\n  wpParent___node___wpChildren___nodes\n}\n\ninput WpCategoryFilterInput {\n  ancestors: WpCategoryToAncestorsCategoryConnectionFilterInput\n  children: NodeFilterListInput\n  contentNodes: WpCategoryToContentNodeConnectionFilterInput\n  count: IntQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  description: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  isContentNode: BooleanQueryOperatorInput\n  isTermNode: BooleanQueryOperatorInput\n  link: StringQueryOperatorInput\n  name: StringQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  parentDatabaseId: IntQueryOperatorInput\n  parentId: IDQueryOperatorInput\n  posts: WpCategoryToPostConnectionFilterInput\n  slug: StringQueryOperatorInput\n  taxonomy: WpCategoryToTaxonomyConnectionEdgeFilterInput\n  taxonomyName: StringQueryOperatorInput\n  termGroupId: IntQueryOperatorInput\n  termTaxonomyId: IntQueryOperatorInput\n  uri: StringQueryOperatorInput\n  wpChildren: WpCategoryToCategoryConnectionFilterInput\n  wpParent: WpCategoryToParentCategoryConnectionEdgeFilterInput\n}\n\ninput WpCategoryFilterListInput {\n  elemMatch: WpCategoryFilterInput\n}\n\ntype WpCategoryGroupConnection {\n  distinct(field: WpCategoryFieldsEnum!): [String!]!\n  edges: [WpCategoryEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpCategoryFieldsEnum!, limit: Int, skip: Int): [WpCategoryGroupConnection!]!\n  max(field: WpCategoryFieldsEnum!): Float\n  min(field: WpCategoryFieldsEnum!): Float\n  nodes: [WpCategory!]!\n  pageInfo: PageInfo!\n  sum(field: WpCategoryFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpCategorySortInput {\n  fields: [WpCategoryFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the category type and the category type\n\"\"\"\ntype WpCategoryToAncestorsCategoryConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpCategory]\n}\n\ninput WpCategoryToAncestorsCategoryConnectionFilterInput {\n  nodes: WpCategoryFilterListInput\n}\n\n\"\"\"\nConnection between the category type and the category type\n\"\"\"\ntype WpCategoryToCategoryConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpCategory]\n}\n\ninput WpCategoryToCategoryConnectionFilterInput {\n  nodes: WpCategoryFilterListInput\n}\n\n\"\"\"\nConnection between the category type and the ContentNode type\n\"\"\"\ntype WpCategoryToContentNodeConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpContentNode]\n}\n\ninput WpCategoryToContentNodeConnectionFilterInput {\n  nodes: WpContentNodeFilterListInput\n}\n\n\"\"\"\nConnection between the category type and the category type\n\"\"\"\ntype WpCategoryToParentCategoryConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpCategory\n}\n\ninput WpCategoryToParentCategoryConnectionEdgeFilterInput {\n  node: WpCategoryFilterInput\n}\n\n\"\"\"\nConnection between the category type and the post type\n\"\"\"\ntype WpCategoryToPostConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpPost]\n}\n\ninput WpCategoryToPostConnectionFilterInput {\n  nodes: WpPostFilterListInput\n}\n\n\"\"\"\nConnection between the category type and the Taxonomy type\n\"\"\"\ntype WpCategoryToTaxonomyConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpTaxonomy\n}\n\ninput WpCategoryToTaxonomyConnectionEdgeFilterInput {\n  node: WpTaxonomyFilterInput\n}\n\n\"\"\"\nA Comment object\n\"\"\"\ntype WpComment implements Node & WpDatabaseIdentifier & WpNode {\n  \"\"\"\n  User agent used to post the comment. This field is equivalent to WP_Comment-&gt;comment_agent and the value matching the &quot;comment_agent&quot; column in SQL.\n  \"\"\"\n  agent: String\n\n  \"\"\"\n  The approval status of the comment. This field is equivalent to WP_Comment-&gt;comment_approved and the value matching the &quot;comment_approved&quot; column in SQL.\n  \"\"\"\n  approved: Boolean\n\n  \"\"\"\n  The author of the comment\n  \"\"\"\n  author: WpCommentToCommenterConnectionEdge\n\n  \"\"\"\n  IP address for the author. This field is equivalent to WP_Comment-&gt;comment_author_IP and the value matching the &quot;comment_author_IP&quot; column in SQL.\n  \"\"\"\n  authorIp: String\n  children: [Node!]!\n\n  \"\"\"\n  Connection between the Comment type and the ContentNode type\n  \"\"\"\n  commentedOn: WpCommentToContentNodeConnectionEdge\n\n  \"\"\"\n  Content of the comment. This field is equivalent to WP_Comment-&gt;comment_content and the value matching the &quot;comment_content&quot; column in SQL.\n  \"\"\"\n  content: String\n\n  \"\"\"\n  The unique identifier stored in the database\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  Date the comment was posted in local time. This field is equivalent to WP_Comment-&gt;date and the value matching the &quot;date&quot; column in SQL.\n  \"\"\"\n  date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  Date the comment was posted in GMT. This field is equivalent to WP_Comment-&gt;date_gmt and the value matching the &quot;date_gmt&quot; column in SQL.\n  \"\"\"\n  dateGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Karma value for the comment. This field is equivalent to WP_Comment-&gt;comment_karma and the value matching the &quot;comment_karma&quot; column in SQL.\n  \"\"\"\n  karma: Int\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  The database id of the parent comment node or null if it is the root comment\n  \"\"\"\n  parentDatabaseId: Int\n\n  \"\"\"\n  The globally unique identifier of the parent comment node.\n  \"\"\"\n  parentId: ID\n\n  \"\"\"\n  Connection between the Comment type and the Comment type\n  \"\"\"\n  replies: WpCommentToCommentConnection\n\n  \"\"\"\n  Type of comment. This field is equivalent to WP_Comment-&gt;comment_type and the value matching the &quot;comment_type&quot; column in SQL.\n  \"\"\"\n  type: String\n\n  \"\"\"\n  Connection between the Comment type and the Comment type\n  \"\"\"\n  wpParent: WpCommentToParentCommentConnectionEdge\n}\n\n\"\"\"\nA Comment Author object\n\"\"\"\ntype WpCommentAuthor implements Node & WpCommenter & WpNode {\n  \"\"\"\n  Avatar object for user. The avatar object can be retrieved in different sizes by specifying the size argument.\n  \"\"\"\n  avatar: WpAvatar\n  children: [Node!]!\n\n  \"\"\"\n  Identifies the primary key from the database.\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  The email for the comment author\n  \"\"\"\n  email: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  The name for the comment author.\n  \"\"\"\n  name: String\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  The url the comment author.\n  \"\"\"\n  url: String\n}\n\ntype WpCommentAuthorConnection {\n  distinct(field: WpCommentAuthorFieldsEnum!): [String!]!\n  edges: [WpCommentAuthorEdge!]!\n  group(field: WpCommentAuthorFieldsEnum!, limit: Int, skip: Int): [WpCommentAuthorGroupConnection!]!\n  max(field: WpCommentAuthorFieldsEnum!): Float\n  min(field: WpCommentAuthorFieldsEnum!): Float\n  nodes: [WpCommentAuthor!]!\n  pageInfo: PageInfo!\n  sum(field: WpCommentAuthorFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpCommentAuthorEdge {\n  next: WpCommentAuthor\n  node: WpCommentAuthor!\n  previous: WpCommentAuthor\n}\n\nenum WpCommentAuthorFieldsEnum {\n  avatar___default\n  avatar___extraAttr\n  avatar___forceDefault\n  avatar___foundAvatar\n  avatar___height\n  avatar___rating\n  avatar___scheme\n  avatar___size\n  avatar___url\n  avatar___width\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  databaseId\n  email\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  name\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  url\n}\n\ninput WpCommentAuthorFilterInput {\n  avatar: WpAvatarFilterInput\n  children: NodeFilterListInput\n  databaseId: IntQueryOperatorInput\n  email: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  name: StringQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  url: StringQueryOperatorInput\n}\n\ntype WpCommentAuthorGroupConnection {\n  distinct(field: WpCommentAuthorFieldsEnum!): [String!]!\n  edges: [WpCommentAuthorEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpCommentAuthorFieldsEnum!, limit: Int, skip: Int): [WpCommentAuthorGroupConnection!]!\n  max(field: WpCommentAuthorFieldsEnum!): Float\n  min(field: WpCommentAuthorFieldsEnum!): Float\n  nodes: [WpCommentAuthor!]!\n  pageInfo: PageInfo!\n  sum(field: WpCommentAuthorFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpCommentAuthorSortInput {\n  fields: [WpCommentAuthorFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\ntype WpCommentConnection {\n  distinct(field: WpCommentFieldsEnum!): [String!]!\n  edges: [WpCommentEdge!]!\n  group(field: WpCommentFieldsEnum!, limit: Int, skip: Int): [WpCommentGroupConnection!]!\n  max(field: WpCommentFieldsEnum!): Float\n  min(field: WpCommentFieldsEnum!): Float\n  nodes: [WpComment!]!\n  pageInfo: PageInfo!\n  sum(field: WpCommentFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpCommentEdge {\n  next: WpComment\n  node: WpComment!\n  previous: WpComment\n}\n\nenum WpCommentFieldsEnum {\n  agent\n  approved\n  authorIp\n  author___node___avatar___default\n  author___node___avatar___extraAttr\n  author___node___avatar___forceDefault\n  author___node___avatar___foundAvatar\n  author___node___avatar___height\n  author___node___avatar___rating\n  author___node___avatar___scheme\n  author___node___avatar___size\n  author___node___avatar___url\n  author___node___avatar___width\n  author___node___databaseId\n  author___node___email\n  author___node___id\n  author___node___name\n  author___node___url\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  commentedOn___node___children\n  commentedOn___node___children___children\n  commentedOn___node___children___id\n  commentedOn___node___contentTypeName\n  commentedOn___node___databaseId\n  commentedOn___node___date\n  commentedOn___node___dateGmt\n  commentedOn___node___desiredSlug\n  commentedOn___node___enclosure\n  commentedOn___node___guid\n  commentedOn___node___id\n  commentedOn___node___internal___content\n  commentedOn___node___internal___contentDigest\n  commentedOn___node___internal___description\n  commentedOn___node___internal___fieldOwners\n  commentedOn___node___internal___ignoreType\n  commentedOn___node___internal___mediaType\n  commentedOn___node___internal___owner\n  commentedOn___node___internal___type\n  commentedOn___node___isContentNode\n  commentedOn___node___isTermNode\n  commentedOn___node___link\n  commentedOn___node___modified\n  commentedOn___node___modifiedGmt\n  commentedOn___node___nodeType\n  commentedOn___node___parent___children\n  commentedOn___node___parent___id\n  commentedOn___node___slug\n  commentedOn___node___status\n  commentedOn___node___template___templateName\n  commentedOn___node___uri\n  content\n  databaseId\n  date\n  dateGmt\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  karma\n  nodeType\n  parentDatabaseId\n  parentId\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  replies___nodes\n  replies___nodes___agent\n  replies___nodes___approved\n  replies___nodes___authorIp\n  replies___nodes___children\n  replies___nodes___children___children\n  replies___nodes___children___id\n  replies___nodes___content\n  replies___nodes___databaseId\n  replies___nodes___date\n  replies___nodes___dateGmt\n  replies___nodes___id\n  replies___nodes___internal___content\n  replies___nodes___internal___contentDigest\n  replies___nodes___internal___description\n  replies___nodes___internal___fieldOwners\n  replies___nodes___internal___ignoreType\n  replies___nodes___internal___mediaType\n  replies___nodes___internal___owner\n  replies___nodes___internal___type\n  replies___nodes___karma\n  replies___nodes___nodeType\n  replies___nodes___parentDatabaseId\n  replies___nodes___parentId\n  replies___nodes___parent___children\n  replies___nodes___parent___id\n  replies___nodes___replies___nodes\n  replies___nodes___type\n  type\n  wpParent___node___agent\n  wpParent___node___approved\n  wpParent___node___authorIp\n  wpParent___node___children\n  wpParent___node___children___children\n  wpParent___node___children___id\n  wpParent___node___content\n  wpParent___node___databaseId\n  wpParent___node___date\n  wpParent___node___dateGmt\n  wpParent___node___id\n  wpParent___node___internal___content\n  wpParent___node___internal___contentDigest\n  wpParent___node___internal___description\n  wpParent___node___internal___fieldOwners\n  wpParent___node___internal___ignoreType\n  wpParent___node___internal___mediaType\n  wpParent___node___internal___owner\n  wpParent___node___internal___type\n  wpParent___node___karma\n  wpParent___node___nodeType\n  wpParent___node___parentDatabaseId\n  wpParent___node___parentId\n  wpParent___node___parent___children\n  wpParent___node___parent___id\n  wpParent___node___replies___nodes\n  wpParent___node___type\n}\n\ninput WpCommentFilterInput {\n  agent: StringQueryOperatorInput\n  approved: BooleanQueryOperatorInput\n  author: WpCommentToCommenterConnectionEdgeFilterInput\n  authorIp: StringQueryOperatorInput\n  children: NodeFilterListInput\n  commentedOn: WpCommentToContentNodeConnectionEdgeFilterInput\n  content: StringQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  date: DateQueryOperatorInput\n  dateGmt: DateQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  karma: IntQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  parentDatabaseId: IntQueryOperatorInput\n  parentId: IDQueryOperatorInput\n  replies: WpCommentToCommentConnectionFilterInput\n  type: StringQueryOperatorInput\n  wpParent: WpCommentToParentCommentConnectionEdgeFilterInput\n}\n\ninput WpCommentFilterListInput {\n  elemMatch: WpCommentFilterInput\n}\n\ntype WpCommentGroupConnection {\n  distinct(field: WpCommentFieldsEnum!): [String!]!\n  edges: [WpCommentEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpCommentFieldsEnum!, limit: Int, skip: Int): [WpCommentGroupConnection!]!\n  max(field: WpCommentFieldsEnum!): Float\n  min(field: WpCommentFieldsEnum!): Float\n  nodes: [WpComment!]!\n  pageInfo: PageInfo!\n  sum(field: WpCommentFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpCommentSortInput {\n  fields: [WpCommentFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the Comment type and the Comment type\n\"\"\"\ntype WpCommentToCommentConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpComment]\n}\n\ninput WpCommentToCommentConnectionFilterInput {\n  nodes: WpCommentFilterListInput\n}\n\n\"\"\"\nConnection between the Comment type and the Commenter type\n\"\"\"\ntype WpCommentToCommenterConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpCommenter\n}\n\ninput WpCommentToCommenterConnectionEdgeFilterInput {\n  node: WpCommenterFilterInput\n}\n\n\"\"\"\nConnection between the Comment type and the ContentNode type\n\"\"\"\ntype WpCommentToContentNodeConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpContentNode\n}\n\ninput WpCommentToContentNodeConnectionEdgeFilterInput {\n  node: WpContentNodeFilterInput\n}\n\n\"\"\"\nConnection between the Comment type and the Comment type\n\"\"\"\ntype WpCommentToParentCommentConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpComment\n}\n\ninput WpCommentToParentCommentConnectionEdgeFilterInput {\n  node: WpCommentFilterInput\n}\n\ninterface WpCommenter {\n  \"\"\"\n  Avatar object for user. The avatar object can be retrieved in different sizes by specifying the size argument.\n  \"\"\"\n  avatar: WpAvatar\n\n  \"\"\"\n  Identifies the primary key from the database.\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  The email address of the author of a comment.\n  \"\"\"\n  email: String\n\n  \"\"\"\n  The globally unique identifier for the comment author.\n  \"\"\"\n  id: ID!\n\n  \"\"\"\n  The name of the author of a comment.\n  \"\"\"\n  name: String\n\n  \"\"\"\n  The url of the author of a comment.\n  \"\"\"\n  url: String\n}\n\ninput WpCommenterFilterInput {\n  avatar: WpAvatarFilterInput\n  databaseId: IntQueryOperatorInput\n  email: StringQueryOperatorInput\n  id: IDQueryOperatorInput\n  name: StringQueryOperatorInput\n  url: StringQueryOperatorInput\n}\n\ntype WpConnection {\n  distinct(field: WpFieldsEnum!): [String!]!\n  edges: [WpEdge!]!\n  group(field: WpFieldsEnum!, limit: Int, skip: Int): [WpGroupConnection!]!\n  max(field: WpFieldsEnum!): Float\n  min(field: WpFieldsEnum!): Float\n  nodes: [Wp!]!\n  pageInfo: PageInfo!\n  sum(field: WpFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninterface WpContentNode implements Node {\n  children: [Node!]!\n\n  \"\"\"\n  Connection between the ContentNode type and the ContentType type\n  \"\"\"\n  contentType: WpContentNodeToContentTypeConnectionEdge\n\n  \"\"\"\n  The name of the Content Type the node belongs to\n  \"\"\"\n  contentTypeName: String!\n\n  \"\"\"\n  The ID of the node in the database.\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  Post publishing date.\n  \"\"\"\n  date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The publishing date set in GMT.\n  \"\"\"\n  dateGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The desired slug of the post\n  \"\"\"\n  desiredSlug: String\n\n  \"\"\"\n  The RSS enclosure for the object\n  \"\"\"\n  enclosure: String\n\n  \"\"\"\n  The global unique identifier for this post. This currently matches the value stored in WP_Post-&gt;guid and the guid column in the &quot;post_objects&quot; database table.\n  \"\"\"\n  guid: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  The user that most recently edited the node\n  \"\"\"\n  lastEditedBy: WpContentNodeToEditLastConnectionEdge\n\n  \"\"\"\n  The permalink of the post\n  \"\"\"\n  link: String\n\n  \"\"\"\n  The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time.\n  \"\"\"\n  modified(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT.\n  \"\"\"\n  modifiedGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  The uri slug for the post. This is equivalent to the WP_Post-&gt;post_name field and the post_name column in the database for the &quot;post_objects&quot; table.\n  \"\"\"\n  slug: String\n\n  \"\"\"\n  The current status of the object\n  \"\"\"\n  status: String\n\n  \"\"\"\n  The template assigned to a node of content\n  \"\"\"\n  template: WpContentTemplate\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n}\n\ntype WpContentNodeConnection {\n  distinct(field: WpContentNodeFieldsEnum!): [String!]!\n  edges: [WpContentNodeEdge!]!\n  group(field: WpContentNodeFieldsEnum!, limit: Int, skip: Int): [WpContentNodeGroupConnection!]!\n  max(field: WpContentNodeFieldsEnum!): Float\n  min(field: WpContentNodeFieldsEnum!): Float\n  nodes: [WpContentNode!]!\n  pageInfo: PageInfo!\n  sum(field: WpContentNodeFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpContentNodeEdge {\n  next: WpContentNode\n  node: WpContentNode!\n  previous: WpContentNode\n}\n\nenum WpContentNodeFieldsEnum {\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  contentTypeName\n  contentType___node___archivePath\n  contentType___node___canExport\n  contentType___node___children\n  contentType___node___children___children\n  contentType___node___children___id\n  contentType___node___connectedTaxonomies___nodes\n  contentType___node___contentNodes___nodes\n  contentType___node___deleteWithUser\n  contentType___node___description\n  contentType___node___excludeFromSearch\n  contentType___node___graphqlPluralName\n  contentType___node___graphqlSingleName\n  contentType___node___hasArchive\n  contentType___node___hierarchical\n  contentType___node___id\n  contentType___node___internal___content\n  contentType___node___internal___contentDigest\n  contentType___node___internal___description\n  contentType___node___internal___fieldOwners\n  contentType___node___internal___ignoreType\n  contentType___node___internal___mediaType\n  contentType___node___internal___owner\n  contentType___node___internal___type\n  contentType___node___isContentNode\n  contentType___node___isFrontPage\n  contentType___node___isPostsPage\n  contentType___node___isTermNode\n  contentType___node___label\n  contentType___node___labels___addNew\n  contentType___node___labels___addNewItem\n  contentType___node___labels___allItems\n  contentType___node___labels___archives\n  contentType___node___labels___attributes\n  contentType___node___labels___editItem\n  contentType___node___labels___featuredImage\n  contentType___node___labels___filterItemsList\n  contentType___node___labels___insertIntoItem\n  contentType___node___labels___itemsList\n  contentType___node___labels___itemsListNavigation\n  contentType___node___labels___menuName\n  contentType___node___labels___name\n  contentType___node___labels___newItem\n  contentType___node___labels___notFound\n  contentType___node___labels___notFoundInTrash\n  contentType___node___labels___parentItemColon\n  contentType___node___labels___removeFeaturedImage\n  contentType___node___labels___searchItems\n  contentType___node___labels___setFeaturedImage\n  contentType___node___labels___singularName\n  contentType___node___labels___uploadedToThisItem\n  contentType___node___labels___useFeaturedImage\n  contentType___node___labels___viewItem\n  contentType___node___labels___viewItems\n  contentType___node___menuIcon\n  contentType___node___menuPosition\n  contentType___node___name\n  contentType___node___nodeType\n  contentType___node___parent___children\n  contentType___node___parent___id\n  contentType___node___public\n  contentType___node___publiclyQueryable\n  contentType___node___restBase\n  contentType___node___restControllerClass\n  contentType___node___showInAdminBar\n  contentType___node___showInGraphql\n  contentType___node___showInMenu\n  contentType___node___showInNavMenus\n  contentType___node___showInRest\n  contentType___node___showUi\n  contentType___node___uri\n  databaseId\n  date\n  dateGmt\n  desiredSlug\n  enclosure\n  guid\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  isContentNode\n  isTermNode\n  lastEditedBy___node___avatar___default\n  lastEditedBy___node___avatar___extraAttr\n  lastEditedBy___node___avatar___forceDefault\n  lastEditedBy___node___avatar___foundAvatar\n  lastEditedBy___node___avatar___height\n  lastEditedBy___node___avatar___rating\n  lastEditedBy___node___avatar___scheme\n  lastEditedBy___node___avatar___size\n  lastEditedBy___node___avatar___url\n  lastEditedBy___node___avatar___width\n  lastEditedBy___node___blockEditorPreviews___nodes\n  lastEditedBy___node___capKey\n  lastEditedBy___node___capabilities\n  lastEditedBy___node___children\n  lastEditedBy___node___children___children\n  lastEditedBy___node___children___id\n  lastEditedBy___node___comments___nodes\n  lastEditedBy___node___databaseId\n  lastEditedBy___node___description\n  lastEditedBy___node___email\n  lastEditedBy___node___extraCapabilities\n  lastEditedBy___node___firstName\n  lastEditedBy___node___id\n  lastEditedBy___node___internal___content\n  lastEditedBy___node___internal___contentDigest\n  lastEditedBy___node___internal___description\n  lastEditedBy___node___internal___fieldOwners\n  lastEditedBy___node___internal___ignoreType\n  lastEditedBy___node___internal___mediaType\n  lastEditedBy___node___internal___owner\n  lastEditedBy___node___internal___type\n  lastEditedBy___node___isContentNode\n  lastEditedBy___node___isTermNode\n  lastEditedBy___node___lastName\n  lastEditedBy___node___locale\n  lastEditedBy___node___name\n  lastEditedBy___node___nicename\n  lastEditedBy___node___nickname\n  lastEditedBy___node___nodeType\n  lastEditedBy___node___pages___nodes\n  lastEditedBy___node___parent___children\n  lastEditedBy___node___parent___id\n  lastEditedBy___node___posts___nodes\n  lastEditedBy___node___registeredDate\n  lastEditedBy___node___roles___nodes\n  lastEditedBy___node___slug\n  lastEditedBy___node___uri\n  lastEditedBy___node___url\n  lastEditedBy___node___username\n  link\n  modified\n  modifiedGmt\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  slug\n  status\n  template___templateName\n  uri\n}\n\ninput WpContentNodeFilterInput {\n  children: NodeFilterListInput\n  contentType: WpContentNodeToContentTypeConnectionEdgeFilterInput\n  contentTypeName: StringQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  date: DateQueryOperatorInput\n  dateGmt: DateQueryOperatorInput\n  desiredSlug: StringQueryOperatorInput\n  enclosure: StringQueryOperatorInput\n  guid: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  isContentNode: BooleanQueryOperatorInput\n  isTermNode: BooleanQueryOperatorInput\n  lastEditedBy: WpContentNodeToEditLastConnectionEdgeFilterInput\n  link: StringQueryOperatorInput\n  modified: DateQueryOperatorInput\n  modifiedGmt: DateQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  slug: StringQueryOperatorInput\n  status: StringQueryOperatorInput\n  template: WpContentTemplateFilterInput\n  uri: StringQueryOperatorInput\n}\n\ninput WpContentNodeFilterListInput {\n  elemMatch: WpContentNodeFilterInput\n}\n\ntype WpContentNodeGroupConnection {\n  distinct(field: WpContentNodeFieldsEnum!): [String!]!\n  edges: [WpContentNodeEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpContentNodeFieldsEnum!, limit: Int, skip: Int): [WpContentNodeGroupConnection!]!\n  max(field: WpContentNodeFieldsEnum!): Float\n  min(field: WpContentNodeFieldsEnum!): Float\n  nodes: [WpContentNode!]!\n  pageInfo: PageInfo!\n  sum(field: WpContentNodeFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpContentNodeSortInput {\n  fields: [WpContentNodeFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the ContentNode type and the ContentType type\n\"\"\"\ntype WpContentNodeToContentTypeConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpContentType\n}\n\ninput WpContentNodeToContentTypeConnectionEdgeFilterInput {\n  node: WpContentTypeFilterInput\n}\n\n\"\"\"\nConnection between the ContentNode type and the User type\n\"\"\"\ntype WpContentNodeToEditLastConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpUser\n}\n\ninput WpContentNodeToEditLastConnectionEdgeFilterInput {\n  node: WpUserFilterInput\n}\n\n\"\"\"\nConnection between the ContentNode type and the User type\n\"\"\"\ntype WpContentNodeToEditLockConnectionEdge {\n  \"\"\"\n  The timestamp for when the node was last edited\n  \"\"\"\n  lockTimestamp: String\n\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpUser\n}\n\ninterface WpContentTemplate {\n  \"\"\"\n  The name of the template\n  \"\"\"\n  templateName: String\n}\n\ninput WpContentTemplateFilterInput {\n  templateName: StringQueryOperatorInput\n}\n\n\"\"\"\nAn Post Type object\n\"\"\"\ntype WpContentType implements Node & WpNode & WpUniformResourceIdentifiable {\n  \"\"\"\n  The url path of the first page of the archive page for this content type.\n  \"\"\"\n  archivePath: String\n\n  \"\"\"\n  Whether this content type should can be exported.\n  \"\"\"\n  canExport: Boolean\n  children: [Node!]!\n\n  \"\"\"\n  Connection between the ContentType type and the Taxonomy type\n  \"\"\"\n  connectedTaxonomies: WpContentTypeToTaxonomyConnection\n\n  \"\"\"\n  Connection between the ContentType type and the ContentNode type\n  \"\"\"\n  contentNodes: WpContentTypeToContentNodeConnection\n\n  \"\"\"\n  Whether content of this type should be deleted when the author of it is deleted from the system.\n  \"\"\"\n  deleteWithUser: Boolean\n\n  \"\"\"\n  Description of the content type.\n  \"\"\"\n  description: String\n\n  \"\"\"\n  Whether to exclude nodes of this content type from front end search results.\n  \"\"\"\n  excludeFromSearch: Boolean\n\n  \"\"\"\n  The plural name of the content type within the GraphQL Schema.\n  \"\"\"\n  graphqlPluralName: String\n\n  \"\"\"\n  The singular name of the content type within the GraphQL Schema.\n  \"\"\"\n  graphqlSingleName: String\n\n  \"\"\"\n  Whether this content type should have archives. Content archives are generated by type and by date.\n  \"\"\"\n  hasArchive: Boolean\n\n  \"\"\"\n  Whether the content type is hierarchical, for example pages.\n  \"\"\"\n  hierarchical: Boolean\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  Whether this page is set to the static front page.\n  \"\"\"\n  isFrontPage: Boolean!\n\n  \"\"\"\n  Whether this page is set to the blog posts page.\n  \"\"\"\n  isPostsPage: Boolean!\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  Display name of the content type.\n  \"\"\"\n  label: String\n\n  \"\"\"\n  Details about the content type labels.\n  \"\"\"\n  labels: WpPostTypeLabelDetails\n\n  \"\"\"\n  The name of the icon file to display as a menu icon.\n  \"\"\"\n  menuIcon: String\n\n  \"\"\"\n  The position of this post type in the menu. Only applies if show_in_menu is true.\n  \"\"\"\n  menuPosition: Int\n\n  \"\"\"\n  The internal name of the post type. This should not be used for display purposes.\n  \"\"\"\n  name: String\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  Whether a content type is intended for use publicly either via the admin interface or by front-end users. While the default settings of exclude_from_search, publicly_queryable, show_ui, and show_in_nav_menus are inherited from public, each does not rely on this relationship and controls a very specific intention.\n  \"\"\"\n  public: Boolean\n\n  \"\"\"\n  Whether queries can be performed on the front end for the content type as part of parse_request().\n  \"\"\"\n  publiclyQueryable: Boolean\n\n  \"\"\"\n  Name of content type to display in REST API &quot;wp/v2&quot; namespace.\n  \"\"\"\n  restBase: String\n\n  \"\"\"\n  The REST Controller class assigned to handling this content type.\n  \"\"\"\n  restControllerClass: String\n\n  \"\"\"\n  Makes this content type available via the admin bar.\n  \"\"\"\n  showInAdminBar: Boolean\n\n  \"\"\"\n  Whether to add the content type to the GraphQL Schema.\n  \"\"\"\n  showInGraphql: Boolean\n\n  \"\"\"\n  Where to show the content type in the admin menu. To work, $show_ui must be true. If true, the post type is shown in its own top level menu. If false, no menu is shown. If a string of an existing top level menu (eg. &quot;tools.php&quot; or &quot;edit.php?post_type=page&quot;), the post type will be placed as a sub-menu of that.\n  \"\"\"\n  showInMenu: Boolean\n\n  \"\"\"\n  Makes this content type available for selection in navigation menus.\n  \"\"\"\n  showInNavMenus: Boolean\n\n  \"\"\"\n  Whether the content type is associated with a route under the the REST API &quot;wp/v2&quot; namespace.\n  \"\"\"\n  showInRest: Boolean\n\n  \"\"\"\n  Whether to generate and allow a UI for managing this content type in the admin.\n  \"\"\"\n  showUi: Boolean\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n}\n\ntype WpContentTypeConnection {\n  distinct(field: WpContentTypeFieldsEnum!): [String!]!\n  edges: [WpContentTypeEdge!]!\n  group(field: WpContentTypeFieldsEnum!, limit: Int, skip: Int): [WpContentTypeGroupConnection!]!\n  max(field: WpContentTypeFieldsEnum!): Float\n  min(field: WpContentTypeFieldsEnum!): Float\n  nodes: [WpContentType!]!\n  pageInfo: PageInfo!\n  sum(field: WpContentTypeFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpContentTypeEdge {\n  next: WpContentType\n  node: WpContentType!\n  previous: WpContentType\n}\n\nenum WpContentTypeFieldsEnum {\n  archivePath\n  canExport\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  connectedTaxonomies___nodes\n  connectedTaxonomies___nodes___archivePath\n  connectedTaxonomies___nodes___children\n  connectedTaxonomies___nodes___children___children\n  connectedTaxonomies___nodes___children___id\n  connectedTaxonomies___nodes___connectedContentTypes___nodes\n  connectedTaxonomies___nodes___description\n  connectedTaxonomies___nodes___graphqlPluralName\n  connectedTaxonomies___nodes___graphqlSingleName\n  connectedTaxonomies___nodes___hierarchical\n  connectedTaxonomies___nodes___id\n  connectedTaxonomies___nodes___internal___content\n  connectedTaxonomies___nodes___internal___contentDigest\n  connectedTaxonomies___nodes___internal___description\n  connectedTaxonomies___nodes___internal___fieldOwners\n  connectedTaxonomies___nodes___internal___ignoreType\n  connectedTaxonomies___nodes___internal___mediaType\n  connectedTaxonomies___nodes___internal___owner\n  connectedTaxonomies___nodes___internal___type\n  connectedTaxonomies___nodes___label\n  connectedTaxonomies___nodes___name\n  connectedTaxonomies___nodes___nodeType\n  connectedTaxonomies___nodes___parent___children\n  connectedTaxonomies___nodes___parent___id\n  connectedTaxonomies___nodes___public\n  connectedTaxonomies___nodes___restBase\n  connectedTaxonomies___nodes___restControllerClass\n  connectedTaxonomies___nodes___showCloud\n  connectedTaxonomies___nodes___showInAdminColumn\n  connectedTaxonomies___nodes___showInGraphql\n  connectedTaxonomies___nodes___showInMenu\n  connectedTaxonomies___nodes___showInNavMenus\n  connectedTaxonomies___nodes___showInQuickEdit\n  connectedTaxonomies___nodes___showInRest\n  connectedTaxonomies___nodes___showUi\n  contentNodes___nodes\n  contentNodes___nodes___children\n  contentNodes___nodes___children___children\n  contentNodes___nodes___children___id\n  contentNodes___nodes___contentTypeName\n  contentNodes___nodes___databaseId\n  contentNodes___nodes___date\n  contentNodes___nodes___dateGmt\n  contentNodes___nodes___desiredSlug\n  contentNodes___nodes___enclosure\n  contentNodes___nodes___guid\n  contentNodes___nodes___id\n  contentNodes___nodes___internal___content\n  contentNodes___nodes___internal___contentDigest\n  contentNodes___nodes___internal___description\n  contentNodes___nodes___internal___fieldOwners\n  contentNodes___nodes___internal___ignoreType\n  contentNodes___nodes___internal___mediaType\n  contentNodes___nodes___internal___owner\n  contentNodes___nodes___internal___type\n  contentNodes___nodes___isContentNode\n  contentNodes___nodes___isTermNode\n  contentNodes___nodes___link\n  contentNodes___nodes___modified\n  contentNodes___nodes___modifiedGmt\n  contentNodes___nodes___nodeType\n  contentNodes___nodes___parent___children\n  contentNodes___nodes___parent___id\n  contentNodes___nodes___slug\n  contentNodes___nodes___status\n  contentNodes___nodes___template___templateName\n  contentNodes___nodes___uri\n  deleteWithUser\n  description\n  excludeFromSearch\n  graphqlPluralName\n  graphqlSingleName\n  hasArchive\n  hierarchical\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  isContentNode\n  isFrontPage\n  isPostsPage\n  isTermNode\n  label\n  labels___addNew\n  labels___addNewItem\n  labels___allItems\n  labels___archives\n  labels___attributes\n  labels___editItem\n  labels___featuredImage\n  labels___filterItemsList\n  labels___insertIntoItem\n  labels___itemsList\n  labels___itemsListNavigation\n  labels___menuName\n  labels___name\n  labels___newItem\n  labels___notFound\n  labels___notFoundInTrash\n  labels___parentItemColon\n  labels___removeFeaturedImage\n  labels___searchItems\n  labels___setFeaturedImage\n  labels___singularName\n  labels___uploadedToThisItem\n  labels___useFeaturedImage\n  labels___viewItem\n  labels___viewItems\n  menuIcon\n  menuPosition\n  name\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  public\n  publiclyQueryable\n  restBase\n  restControllerClass\n  showInAdminBar\n  showInGraphql\n  showInMenu\n  showInNavMenus\n  showInRest\n  showUi\n  uri\n}\n\ninput WpContentTypeFilterInput {\n  archivePath: StringQueryOperatorInput\n  canExport: BooleanQueryOperatorInput\n  children: NodeFilterListInput\n  connectedTaxonomies: WpContentTypeToTaxonomyConnectionFilterInput\n  contentNodes: WpContentTypeToContentNodeConnectionFilterInput\n  deleteWithUser: BooleanQueryOperatorInput\n  description: StringQueryOperatorInput\n  excludeFromSearch: BooleanQueryOperatorInput\n  graphqlPluralName: StringQueryOperatorInput\n  graphqlSingleName: StringQueryOperatorInput\n  hasArchive: BooleanQueryOperatorInput\n  hierarchical: BooleanQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  isContentNode: BooleanQueryOperatorInput\n  isFrontPage: BooleanQueryOperatorInput\n  isPostsPage: BooleanQueryOperatorInput\n  isTermNode: BooleanQueryOperatorInput\n  label: StringQueryOperatorInput\n  labels: WpPostTypeLabelDetailsFilterInput\n  menuIcon: StringQueryOperatorInput\n  menuPosition: IntQueryOperatorInput\n  name: StringQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  public: BooleanQueryOperatorInput\n  publiclyQueryable: BooleanQueryOperatorInput\n  restBase: StringQueryOperatorInput\n  restControllerClass: StringQueryOperatorInput\n  showInAdminBar: BooleanQueryOperatorInput\n  showInGraphql: BooleanQueryOperatorInput\n  showInMenu: BooleanQueryOperatorInput\n  showInNavMenus: BooleanQueryOperatorInput\n  showInRest: BooleanQueryOperatorInput\n  showUi: BooleanQueryOperatorInput\n  uri: StringQueryOperatorInput\n}\n\ninput WpContentTypeFilterListInput {\n  elemMatch: WpContentTypeFilterInput\n}\n\ntype WpContentTypeGroupConnection {\n  distinct(field: WpContentTypeFieldsEnum!): [String!]!\n  edges: [WpContentTypeEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpContentTypeFieldsEnum!, limit: Int, skip: Int): [WpContentTypeGroupConnection!]!\n  max(field: WpContentTypeFieldsEnum!): Float\n  min(field: WpContentTypeFieldsEnum!): Float\n  nodes: [WpContentType!]!\n  pageInfo: PageInfo!\n  sum(field: WpContentTypeFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpContentTypeSortInput {\n  fields: [WpContentTypeFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the ContentType type and the ContentNode type\n\"\"\"\ntype WpContentTypeToContentNodeConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpContentNode]\n}\n\ninput WpContentTypeToContentNodeConnectionFilterInput {\n  nodes: WpContentNodeFilterListInput\n}\n\n\"\"\"\nConnection between the ContentType type and the Taxonomy type\n\"\"\"\ntype WpContentTypeToTaxonomyConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpTaxonomy]\n}\n\ninput WpContentTypeToTaxonomyConnectionFilterInput {\n  nodes: WpTaxonomyFilterListInput\n}\n\n\"\"\"\ncore/archives block\n\"\"\"\ntype WpCoreArchivesBlock implements WpBlock {\n  attributes: WpCoreArchivesBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreArchivesBlockAttributes {\n  align: String\n  className: String\n  displayAsDropdown: Boolean!\n  lock: JSON\n  showPostCounts: Boolean!\n}\n\n\"\"\"\ncore/audio block\n\"\"\"\ntype WpCoreAudioBlock implements WpBlock {\n  attributes: WpCoreAudioBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreAudioBlockAttributes {\n  align: String\n  anchor: String\n  autoplay: Boolean\n  caption: String\n  className: String\n  id: Float\n  lock: JSON\n  loop: Boolean\n  preload: String\n  src: String\n}\n\nunion WpCoreAudioBlockAttributesUnion = WpCoreAudioBlockAttributes | WpCoreAudioBlockDeprecatedV1Attributes\n\ntype WpCoreAudioBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  autoplay: Boolean\n  caption: String\n  className: String\n  id: Float\n  lock: JSON\n  loop: Boolean\n  preload: String\n  src: String\n}\n\n\"\"\"\ncore/block block\n\"\"\"\ntype WpCoreBlock implements WpBlock {\n  attributes: WpCoreBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n  reusableBlock: WpNode!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreBlockAttributes {\n  lock: JSON\n  ref: Float\n}\n\n\"\"\"\ncore/button block\n\"\"\"\ntype WpCoreButtonBlock implements WpBlock {\n  attributes: WpCoreButtonBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreButtonBlockAttributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  linkTarget: String\n  lock: JSON\n  placeholder: String\n  rel: String\n  style: JSON\n  text: String\n  textColor: String\n  title: String\n  url: String\n  width: Float\n}\n\nunion WpCoreButtonBlockAttributesUnion =\n    WpCoreButtonBlockAttributes\n  | WpCoreButtonBlockDeprecatedV1Attributes\n  | WpCoreButtonBlockDeprecatedV2Attributes\n  | WpCoreButtonBlockDeprecatedV3Attributes\n  | WpCoreButtonBlockDeprecatedV4Attributes\n  | WpCoreButtonBlockDeprecatedV5Attributes\n  | WpCoreButtonBlockDeprecatedV6Attributes\n  | WpCoreButtonBlockDeprecatedV7Attributes\n  | WpCoreButtonBlockDeprecatedV8Attributes\n  | WpCoreButtonBlockDeprecatedV9Attributes\n  | WpCoreButtonBlockDeprecatedV10Attributes\n\ntype WpCoreButtonBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  linkTarget: String\n  lock: JSON\n  placeholder: String\n  rel: String\n  style: JSON\n  text: String\n  textColor: String\n  title: String\n  url: String\n  width: Float\n}\n\ntype WpCoreButtonBlockDeprecatedV2Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  linkTarget: String\n  lock: JSON\n  placeholder: String\n  rel: String\n  style: JSON\n  text: String\n  textColor: String\n  title: String\n  url: String\n  width: Float\n}\n\ntype WpCoreButtonBlockDeprecatedV3Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  linkTarget: String\n  lock: JSON\n  placeholder: String\n  rel: String\n  style: JSON\n  text: String\n  textColor: String\n  title: String\n  url: String\n  width: Float\n}\n\ntype WpCoreButtonBlockDeprecatedV4Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  linkTarget: String\n  lock: JSON\n  placeholder: String\n  rel: String\n  style: JSON\n  text: String\n  textColor: String\n  title: String\n  url: String\n  width: Float\n}\n\ntype WpCoreButtonBlockDeprecatedV5Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  linkTarget: String\n  lock: JSON\n  placeholder: String\n  rel: String\n  style: JSON\n  text: String\n  textColor: String\n  title: String\n  url: String\n  width: Float\n}\n\ntype WpCoreButtonBlockDeprecatedV6Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  linkTarget: String\n  lock: JSON\n  placeholder: String\n  rel: String\n  style: JSON\n  text: String\n  textColor: String\n  title: String\n  url: String\n  width: Float\n}\n\ntype WpCoreButtonBlockDeprecatedV7Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  linkTarget: String\n  lock: JSON\n  placeholder: String\n  rel: String\n  style: JSON\n  text: String\n  textColor: String\n  title: String\n  url: String\n  width: Float\n}\n\ntype WpCoreButtonBlockDeprecatedV8Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  linkTarget: String\n  lock: JSON\n  placeholder: String\n  rel: String\n  style: JSON\n  text: String\n  textColor: String\n  title: String\n  url: String\n  width: Float\n}\n\ntype WpCoreButtonBlockDeprecatedV9Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  linkTarget: String\n  lock: JSON\n  placeholder: String\n  rel: String\n  style: JSON\n  text: String\n  textColor: String\n  title: String\n  url: String\n  width: Float\n}\n\ntype WpCoreButtonBlockDeprecatedV10Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  linkTarget: String\n  lock: JSON\n  placeholder: String\n  rel: String\n  style: JSON\n  text: String\n  textColor: String\n  title: String\n  url: String\n  width: Float\n}\n\n\"\"\"\ncore/buttons block\n\"\"\"\ntype WpCoreButtonsBlock implements WpBlock {\n  attributes: WpCoreButtonsBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreButtonsBlockAttributes {\n  align: String\n  anchor: String\n  className: String\n  layout: JSON\n  lock: JSON\n  style: JSON\n}\n\nunion WpCoreButtonsBlockAttributesUnion =\n    WpCoreButtonsBlockAttributes\n  | WpCoreButtonsBlockDeprecatedV1Attributes\n  | WpCoreButtonsBlockDeprecatedV2Attributes\n\ntype WpCoreButtonsBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  className: String\n  layout: JSON\n  lock: JSON\n  style: JSON\n}\n\ntype WpCoreButtonsBlockDeprecatedV2Attributes {\n  align: String\n  anchor: String\n  className: String\n  layout: JSON\n  lock: JSON\n  style: JSON\n}\n\n\"\"\"\ncore/calendar block\n\"\"\"\ntype WpCoreCalendarBlock implements WpBlock {\n  attributes: WpCoreCalendarBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreCalendarBlockAttributes {\n  align: String\n  className: String\n  lock: JSON\n  month: Int\n  year: Int\n}\n\n\"\"\"\ncore/categories block\n\"\"\"\ntype WpCoreCategoriesBlock implements WpBlock {\n  attributes: WpCoreCategoriesBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreCategoriesBlockAttributes {\n  align: String\n  className: String\n  displayAsDropdown: Boolean!\n  lock: JSON\n  showHierarchy: Boolean!\n  showOnlyTopLevel: Boolean!\n  showPostCounts: Boolean!\n}\n\n\"\"\"\ncore/code block\n\"\"\"\ntype WpCoreCodeBlock implements WpBlock {\n  attributes: WpCoreCodeBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreCodeBlockAttributes {\n  anchor: String\n  backgroundColor: String\n  borderColor: String\n  className: String\n  content: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textColor: String\n}\n\n\"\"\"\ncore/column block\n\"\"\"\ntype WpCoreColumnBlock implements WpBlock {\n  attributes: WpCoreColumnBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreColumnBlockAttributes {\n  allowedBlocks: JSON\n  anchor: String\n  backgroundColor: String\n  className: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textColor: String\n  verticalAlignment: String\n  width: String\n}\n\nunion WpCoreColumnBlockAttributesUnion = WpCoreColumnBlockAttributes | WpCoreColumnBlockDeprecatedV1Attributes\n\ntype WpCoreColumnBlockDeprecatedV1Attributes {\n  allowedBlocks: JSON\n  anchor: String\n  backgroundColor: String\n  className: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textColor: String\n  verticalAlignment: String\n  width: String\n}\n\n\"\"\"\ncore/columns block\n\"\"\"\ntype WpCoreColumnsBlock implements WpBlock {\n  attributes: WpCoreColumnsBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreColumnsBlockAttributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  gradient: String\n  isStackedOnMobile: Boolean!\n  lock: JSON\n  style: JSON\n  textColor: String\n  verticalAlignment: String\n}\n\nunion WpCoreColumnsBlockAttributesUnion =\n    WpCoreColumnsBlockAttributes\n  | WpCoreColumnsBlockDeprecatedV1Attributes\n  | WpCoreColumnsBlockDeprecatedV2Attributes\n  | WpCoreColumnsBlockDeprecatedV3Attributes\n\ntype WpCoreColumnsBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  gradient: String\n  isStackedOnMobile: Boolean!\n  lock: JSON\n  style: JSON\n  textColor: String\n  verticalAlignment: String\n}\n\ntype WpCoreColumnsBlockDeprecatedV2Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  gradient: String\n  isStackedOnMobile: Boolean!\n  lock: JSON\n  style: JSON\n  textColor: String\n  verticalAlignment: String\n}\n\ntype WpCoreColumnsBlockDeprecatedV3Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  gradient: String\n  isStackedOnMobile: Boolean!\n  lock: JSON\n  style: JSON\n  textColor: String\n  verticalAlignment: String\n}\n\n\"\"\"\ncore/cover block\n\"\"\"\ntype WpCoreCoverBlock implements WpBlock {\n  attributes: WpCoreCoverBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreCoverBlockAttributes {\n  align: String\n  allowedBlocks: JSON\n  alt: String!\n  anchor: String\n  backgroundType: String!\n  className: String\n  contentPosition: String\n  customGradient: String\n  customOverlayColor: String\n  dimRatio: Float!\n  focalPoint: JSON\n  gradient: String\n  hasParallax: Boolean!\n  id: Float\n  isDark: Boolean!\n  isRepeated: Boolean!\n  lock: JSON\n  minHeight: Float\n  minHeightUnit: String\n  overlayColor: String\n  style: JSON\n  url: String\n}\n\nunion WpCoreCoverBlockAttributesUnion =\n    WpCoreCoverBlockAttributes\n  | WpCoreCoverBlockDeprecatedV1Attributes\n  | WpCoreCoverBlockDeprecatedV2Attributes\n  | WpCoreCoverBlockDeprecatedV3Attributes\n  | WpCoreCoverBlockDeprecatedV4Attributes\n  | WpCoreCoverBlockDeprecatedV5Attributes\n  | WpCoreCoverBlockDeprecatedV6Attributes\n  | WpCoreCoverBlockDeprecatedV7Attributes\n\ntype WpCoreCoverBlockDeprecatedV1Attributes {\n  align: String\n  allowedBlocks: JSON\n  alt: String!\n  anchor: String\n  backgroundType: String!\n  className: String\n  contentPosition: String\n  customGradient: String\n  customOverlayColor: String\n  dimRatio: Float!\n  focalPoint: JSON\n  gradient: String\n  hasParallax: Boolean!\n  id: Float\n  isDark: Boolean!\n  isRepeated: Boolean!\n  lock: JSON\n  minHeight: Float\n  minHeightUnit: String\n  overlayColor: String\n  style: JSON\n  url: String\n}\n\ntype WpCoreCoverBlockDeprecatedV2Attributes {\n  align: String\n  allowedBlocks: JSON\n  alt: String!\n  anchor: String\n  backgroundType: String!\n  className: String\n  contentPosition: String\n  customGradient: String\n  customOverlayColor: String\n  dimRatio: Float!\n  focalPoint: JSON\n  gradient: String\n  hasParallax: Boolean!\n  id: Float\n  isDark: Boolean!\n  isRepeated: Boolean!\n  lock: JSON\n  minHeight: Float\n  minHeightUnit: String\n  overlayColor: String\n  style: JSON\n  url: String\n}\n\ntype WpCoreCoverBlockDeprecatedV3Attributes {\n  align: String\n  allowedBlocks: JSON\n  alt: String!\n  anchor: String\n  backgroundType: String!\n  className: String\n  contentPosition: String\n  customGradient: String\n  customOverlayColor: String\n  dimRatio: Float!\n  focalPoint: JSON\n  gradient: String\n  hasParallax: Boolean!\n  id: Float\n  isDark: Boolean!\n  isRepeated: Boolean!\n  lock: JSON\n  minHeight: Float\n  minHeightUnit: String\n  overlayColor: String\n  style: JSON\n  url: String\n}\n\ntype WpCoreCoverBlockDeprecatedV4Attributes {\n  align: String\n  allowedBlocks: JSON\n  alt: String!\n  anchor: String\n  backgroundType: String!\n  className: String\n  contentPosition: String\n  customGradient: String\n  customOverlayColor: String\n  dimRatio: Float!\n  focalPoint: JSON\n  gradient: String\n  hasParallax: Boolean!\n  id: Float\n  isDark: Boolean!\n  isRepeated: Boolean!\n  lock: JSON\n  minHeight: Float\n  minHeightUnit: String\n  overlayColor: String\n  style: JSON\n  url: String\n}\n\ntype WpCoreCoverBlockDeprecatedV5Attributes {\n  align: String\n  allowedBlocks: JSON\n  alt: String!\n  anchor: String\n  backgroundType: String!\n  className: String\n  contentPosition: String\n  customGradient: String\n  customOverlayColor: String\n  dimRatio: Float!\n  focalPoint: JSON\n  gradient: String\n  hasParallax: Boolean!\n  id: Float\n  isDark: Boolean!\n  isRepeated: Boolean!\n  lock: JSON\n  minHeight: Float\n  minHeightUnit: String\n  overlayColor: String\n  style: JSON\n  url: String\n}\n\ntype WpCoreCoverBlockDeprecatedV6Attributes {\n  align: String\n  allowedBlocks: JSON\n  alt: String!\n  anchor: String\n  backgroundType: String!\n  className: String\n  contentPosition: String\n  customGradient: String\n  customOverlayColor: String\n  dimRatio: Float!\n  focalPoint: JSON\n  gradient: String\n  hasParallax: Boolean!\n  id: Float\n  isDark: Boolean!\n  isRepeated: Boolean!\n  lock: JSON\n  minHeight: Float\n  minHeightUnit: String\n  overlayColor: String\n  style: JSON\n  url: String\n}\n\ntype WpCoreCoverBlockDeprecatedV7Attributes {\n  align: String\n  allowedBlocks: JSON\n  alt: String!\n  anchor: String\n  backgroundType: String!\n  className: String\n  contentPosition: String\n  customGradient: String\n  customOverlayColor: String\n  dimRatio: Float!\n  focalPoint: JSON\n  gradient: String\n  hasParallax: Boolean!\n  id: Float\n  isDark: Boolean!\n  isRepeated: Boolean!\n  lock: JSON\n  minHeight: Float\n  minHeightUnit: String\n  overlayColor: String\n  style: JSON\n  url: String\n}\n\n\"\"\"\ncore/embed block\n\"\"\"\ntype WpCoreEmbedBlock implements WpBlock {\n  attributes: WpCoreEmbedBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreEmbedBlockAttributes {\n  align: String\n  allowResponsive: Boolean!\n  caption: String\n  className: String\n  lock: JSON\n  previewable: Boolean!\n  providerNameSlug: String\n  responsive: Boolean!\n  type: String\n  url: String\n}\n\nunion WpCoreEmbedBlockAttributesUnion = WpCoreEmbedBlockAttributes | WpCoreEmbedBlockDeprecatedV1Attributes\n\ntype WpCoreEmbedBlockDeprecatedV1Attributes {\n  align: String\n  allowResponsive: Boolean!\n  caption: String\n  className: String\n  lock: JSON\n  previewable: Boolean!\n  providerNameSlug: String\n  responsive: Boolean!\n  type: String\n  url: String\n}\n\n\"\"\"\ncore/file block\n\"\"\"\ntype WpCoreFileBlock implements WpBlock {\n  attributes: WpCoreFileBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreFileBlockAttributes {\n  align: String\n  anchor: String\n  className: String\n  displayPreview: Boolean\n  downloadButtonText: String\n  fileId: String\n  fileName: String\n  href: String\n  id: Float\n  lock: JSON\n  previewHeight: Float!\n  showDownloadButton: Boolean!\n  textLinkHref: String\n  textLinkTarget: String\n}\n\nunion WpCoreFileBlockAttributesUnion = WpCoreFileBlockAttributes | WpCoreFileBlockDeprecatedV1Attributes\n\ntype WpCoreFileBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  className: String\n  displayPreview: Boolean\n  downloadButtonText: String\n  fileId: String\n  fileName: String\n  href: String\n  id: Float\n  lock: JSON\n  previewHeight: Float!\n  showDownloadButton: Boolean!\n  textLinkHref: String\n  textLinkTarget: String\n}\n\n\"\"\"\ncore/freeform block\n\"\"\"\ntype WpCoreFreeformBlock implements WpBlock {\n  attributes: WpCoreFreeformBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreFreeformBlockAttributes {\n  content: String\n  lock: JSON\n}\n\n\"\"\"\ncore/gallery block\n\"\"\"\ntype WpCoreGalleryBlock implements WpBlock {\n  attributes: WpCoreGalleryBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreGalleryBlockAttributes {\n  align: String\n  allowResize: Boolean!\n  anchor: String\n  caption: String\n  className: String\n  columns: Float\n  fixedHeight: Boolean!\n  ids: [Float]!\n  imageCrop: Boolean!\n  images: [WpCoreGalleryBlockAttributesImages]!\n  linkTarget: String\n  linkTo: String\n  lock: JSON\n  shortCodeTransforms: [WpBlockAttributesObject]!\n  sizeSlug: String!\n}\n\ntype WpCoreGalleryBlockAttributesImages {\n  alt: String!\n  caption: String\n  fullUrl: String\n  id: String\n  link: String\n  url: String\n}\n\nunion WpCoreGalleryBlockAttributesUnion =\n    WpCoreGalleryBlockAttributes\n  | WpCoreGalleryBlockDeprecatedV1Attributes\n  | WpCoreGalleryBlockDeprecatedV2Attributes\n  | WpCoreGalleryBlockDeprecatedV3Attributes\n  | WpCoreGalleryBlockDeprecatedV4Attributes\n  | WpCoreGalleryBlockDeprecatedV5Attributes\n  | WpCoreGalleryBlockDeprecatedV6Attributes\n\ntype WpCoreGalleryBlockDeprecatedV1Attributes {\n  align: String\n  allowResize: Boolean!\n  anchor: String\n  caption: String\n  className: String\n  columns: Float\n  fixedHeight: Boolean!\n  ids: [Float]!\n  imageCrop: Boolean!\n  images: [WpCoreGalleryBlockDeprecatedV1AttributesImages]!\n  linkTarget: String\n  linkTo: String\n  lock: JSON\n  shortCodeTransforms: [WpBlockAttributesObject]!\n  sizeSlug: String!\n}\n\ntype WpCoreGalleryBlockDeprecatedV1AttributesImages {\n  alt: String!\n  caption: String\n  fullUrl: String\n  id: String\n  link: String\n  url: String\n}\n\ntype WpCoreGalleryBlockDeprecatedV2Attributes {\n  align: String\n  allowResize: Boolean!\n  anchor: String\n  caption: String\n  className: String\n  columns: Float\n  fixedHeight: Boolean!\n  ids: [Float]!\n  imageCrop: Boolean!\n  images: [WpCoreGalleryBlockDeprecatedV2AttributesImages]!\n  linkTarget: String\n  linkTo: String\n  lock: JSON\n  shortCodeTransforms: [WpBlockAttributesObject]!\n  sizeSlug: String!\n}\n\ntype WpCoreGalleryBlockDeprecatedV2AttributesImages {\n  alt: String!\n  caption: String\n  fullUrl: String\n  id: String\n  link: String\n  url: String\n}\n\ntype WpCoreGalleryBlockDeprecatedV3Attributes {\n  align: String\n  allowResize: Boolean!\n  anchor: String\n  caption: String\n  className: String\n  columns: Float\n  fixedHeight: Boolean!\n  ids: [Float]!\n  imageCrop: Boolean!\n  images: [WpCoreGalleryBlockDeprecatedV3AttributesImages]!\n  linkTarget: String\n  linkTo: String\n  lock: JSON\n  shortCodeTransforms: [WpBlockAttributesObject]!\n  sizeSlug: String!\n}\n\ntype WpCoreGalleryBlockDeprecatedV3AttributesImages {\n  alt: String!\n  caption: String\n  fullUrl: String\n  id: String\n  link: String\n  url: String\n}\n\ntype WpCoreGalleryBlockDeprecatedV4Attributes {\n  align: String\n  allowResize: Boolean!\n  anchor: String\n  caption: String\n  className: String\n  columns: Float\n  fixedHeight: Boolean!\n  ids: [Float]!\n  imageCrop: Boolean!\n  images: [WpCoreGalleryBlockDeprecatedV4AttributesImages]!\n  linkTarget: String\n  linkTo: String\n  lock: JSON\n  shortCodeTransforms: [WpBlockAttributesObject]!\n  sizeSlug: String!\n}\n\ntype WpCoreGalleryBlockDeprecatedV4AttributesImages {\n  alt: String!\n  caption: String\n  fullUrl: String\n  id: String\n  link: String\n  url: String\n}\n\ntype WpCoreGalleryBlockDeprecatedV5Attributes {\n  align: String\n  allowResize: Boolean!\n  anchor: String\n  caption: String\n  className: String\n  columns: Float\n  fixedHeight: Boolean!\n  ids: [Float]!\n  imageCrop: Boolean!\n  images: [WpCoreGalleryBlockDeprecatedV5AttributesImages]!\n  linkTarget: String\n  linkTo: String\n  lock: JSON\n  shortCodeTransforms: [WpBlockAttributesObject]!\n  sizeSlug: String!\n}\n\ntype WpCoreGalleryBlockDeprecatedV5AttributesImages {\n  alt: String!\n  caption: String\n  fullUrl: String\n  id: String\n  link: String\n  url: String\n}\n\ntype WpCoreGalleryBlockDeprecatedV6Attributes {\n  align: String\n  allowResize: Boolean!\n  anchor: String\n  caption: String\n  className: String\n  columns: Float\n  fixedHeight: Boolean!\n  ids: [Float]!\n  imageCrop: Boolean!\n  images: [WpCoreGalleryBlockDeprecatedV6AttributesImages]!\n  linkTarget: String\n  linkTo: String\n  lock: JSON\n  shortCodeTransforms: [WpBlockAttributesObject]!\n  sizeSlug: String!\n}\n\ntype WpCoreGalleryBlockDeprecatedV6AttributesImages {\n  alt: String!\n  caption: String\n  fullUrl: String\n  id: String\n  link: String\n  url: String\n}\n\n\"\"\"\ncore/group block\n\"\"\"\ntype WpCoreGroupBlock implements WpBlock {\n  attributes: WpCoreGroupBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreGroupBlockAttributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  borderColor: String\n  className: String\n  gradient: String\n  layout: JSON\n  lock: JSON\n  style: JSON\n  tagName: String!\n  textColor: String\n}\n\nunion WpCoreGroupBlockAttributesUnion =\n    WpCoreGroupBlockAttributes\n  | WpCoreGroupBlockDeprecatedV1Attributes\n  | WpCoreGroupBlockDeprecatedV2Attributes\n  | WpCoreGroupBlockDeprecatedV3Attributes\n  | WpCoreGroupBlockDeprecatedV4Attributes\n\ntype WpCoreGroupBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  borderColor: String\n  className: String\n  gradient: String\n  layout: JSON\n  lock: JSON\n  style: JSON\n  tagName: String!\n  textColor: String\n}\n\ntype WpCoreGroupBlockDeprecatedV2Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  borderColor: String\n  className: String\n  gradient: String\n  layout: JSON\n  lock: JSON\n  style: JSON\n  tagName: String!\n  textColor: String\n}\n\ntype WpCoreGroupBlockDeprecatedV3Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  borderColor: String\n  className: String\n  gradient: String\n  layout: JSON\n  lock: JSON\n  style: JSON\n  tagName: String!\n  textColor: String\n}\n\ntype WpCoreGroupBlockDeprecatedV4Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  borderColor: String\n  className: String\n  gradient: String\n  layout: JSON\n  lock: JSON\n  style: JSON\n  tagName: String!\n  textColor: String\n}\n\n\"\"\"\ncore/heading block\n\"\"\"\ntype WpCoreHeadingBlock implements WpBlock {\n  attributes: WpCoreHeadingBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreHeadingBlockAttributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  fontSize: String\n  level: Float!\n  lock: JSON\n  placeholder: String\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\nunion WpCoreHeadingBlockAttributesUnion =\n    WpCoreHeadingBlockAttributes\n  | WpCoreHeadingBlockDeprecatedV1Attributes\n  | WpCoreHeadingBlockDeprecatedV2Attributes\n  | WpCoreHeadingBlockDeprecatedV3Attributes\n  | WpCoreHeadingBlockDeprecatedV4Attributes\n\ntype WpCoreHeadingBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  fontSize: String\n  level: Float!\n  lock: JSON\n  placeholder: String\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\ntype WpCoreHeadingBlockDeprecatedV2Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  fontSize: String\n  level: Float!\n  lock: JSON\n  placeholder: String\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\ntype WpCoreHeadingBlockDeprecatedV3Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  fontSize: String\n  level: Float!\n  lock: JSON\n  placeholder: String\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\ntype WpCoreHeadingBlockDeprecatedV4Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  fontSize: String\n  level: Float!\n  lock: JSON\n  placeholder: String\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\n\"\"\"\ncore/html block\n\"\"\"\ntype WpCoreHtmlBlock implements WpBlock {\n  attributes: WpCoreHtmlBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreHtmlBlockAttributes {\n  content: String\n  lock: JSON\n}\n\n\"\"\"\ncore/image block\n\"\"\"\ntype WpCoreImageBlock implements WpBlock {\n  attributes: WpCoreImageBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreImageBlockAttributes {\n  align: String\n  alt: String!\n  anchor: String\n  caption: String\n  className: String\n  height: Float\n  href: String\n  id: Float\n  imageFluid: File\n  linkClass: String\n  linkDestination: String\n  linkTarget: String\n  lock: JSON\n  rel: String\n  sizeSlug: String\n  style: JSON\n  title: String\n  url: String\n  width: Float\n}\n\nunion WpCoreImageBlockAttributesUnion =\n    WpCoreImageBlockAttributes\n  | WpCoreImageBlockDeprecatedV1Attributes\n  | WpCoreImageBlockDeprecatedV2Attributes\n  | WpCoreImageBlockDeprecatedV3Attributes\n\ntype WpCoreImageBlockDeprecatedV1Attributes {\n  align: String\n  alt: String!\n  anchor: String\n  caption: String\n  className: String\n  height: Float\n  href: String\n  id: Float\n  linkClass: String\n  linkDestination: String\n  linkTarget: String\n  lock: JSON\n  rel: String\n  sizeSlug: String\n  style: JSON\n  title: String\n  url: String\n  width: Float\n}\n\ntype WpCoreImageBlockDeprecatedV2Attributes {\n  align: String\n  alt: String!\n  anchor: String\n  caption: String\n  className: String\n  height: Float\n  href: String\n  id: Float\n  linkClass: String\n  linkDestination: String\n  linkTarget: String\n  lock: JSON\n  rel: String\n  sizeSlug: String\n  style: JSON\n  title: String\n  url: String\n  width: Float\n}\n\ntype WpCoreImageBlockDeprecatedV3Attributes {\n  align: String\n  alt: String!\n  anchor: String\n  caption: String\n  className: String\n  height: Float\n  href: String\n  id: Float\n  linkClass: String\n  linkDestination: String\n  linkTarget: String\n  lock: JSON\n  rel: String\n  sizeSlug: String\n  style: JSON\n  title: String\n  url: String\n  width: Float\n}\n\n\"\"\"\ncore/latest-comments block\n\"\"\"\ntype WpCoreLatestCommentsBlock implements WpBlock {\n  attributes: WpCoreLatestCommentsBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreLatestCommentsBlockAttributes {\n  align: String\n  className: String\n  commentsToShow: Float!\n  displayAvatar: Boolean!\n  displayDate: Boolean!\n  displayExcerpt: Boolean!\n  lock: JSON\n}\n\n\"\"\"\ncore/latest-posts block\n\"\"\"\ntype WpCoreLatestPostsBlock implements WpBlock {\n  attributes: WpCoreLatestPostsBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreLatestPostsBlockAttributes {\n  addLinkToFeaturedImage: Boolean!\n  align: String\n  categories: [JSON]\n  className: String\n  columns: Float!\n  displayAuthor: Boolean!\n  displayFeaturedImage: Boolean!\n  displayPostContent: Boolean!\n  displayPostContentRadio: String!\n  displayPostDate: Boolean!\n  excerptLength: Float!\n  featuredImageAlign: String\n  featuredImageSizeHeight: Float\n  featuredImageSizeSlug: String!\n  featuredImageSizeWidth: Float\n  lock: JSON\n  order: String!\n  orderBy: String!\n  postLayout: String!\n  postsToShow: Float!\n  selectedAuthor: Float\n}\n\nunion WpCoreLatestPostsBlockAttributesUnion =\n    WpCoreLatestPostsBlockAttributes\n  | WpCoreLatestPostsBlockDeprecatedV1Attributes\n\ntype WpCoreLatestPostsBlockDeprecatedV1Attributes {\n  addLinkToFeaturedImage: Boolean!\n  align: String\n  categories: [JSON]\n  className: String\n  columns: Float!\n  displayAuthor: Boolean!\n  displayFeaturedImage: Boolean!\n  displayPostContent: Boolean!\n  displayPostContentRadio: String!\n  displayPostDate: Boolean!\n  excerptLength: Float!\n  featuredImageAlign: String\n  featuredImageSizeHeight: Float\n  featuredImageSizeSlug: String!\n  featuredImageSizeWidth: Float\n  lock: JSON\n  order: String!\n  orderBy: String!\n  postLayout: String!\n  postsToShow: Float!\n  selectedAuthor: Float\n}\n\n\"\"\"\ncore/legacy-widget block\n\"\"\"\ntype WpCoreLegacyWidgetBlock implements WpBlock {\n  attributes: WpCoreLegacyWidgetBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreLegacyWidgetBlockAttributes {\n  id: String\n  idBase: String\n  instance: JSON\n  lock: JSON\n}\n\n\"\"\"\ncore/list block\n\"\"\"\ntype WpCoreListBlock implements WpBlock {\n  attributes: WpCoreListBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreListBlockAttributes {\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  ordered: Boolean!\n  placeholder: String\n  reversed: Boolean\n  start: Float\n  style: JSON\n  textColor: String\n  type: String\n  values: String!\n}\n\nunion WpCoreListBlockAttributesUnion = WpCoreListBlockAttributes | WpCoreListBlockDeprecatedV1Attributes\n\ntype WpCoreListBlockDeprecatedV1Attributes {\n  anchor: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  ordered: Boolean!\n  placeholder: String\n  reversed: Boolean\n  start: Float\n  style: JSON\n  textColor: String\n  type: String\n  values: String!\n}\n\n\"\"\"\ncore/loginout block\n\"\"\"\ntype WpCoreLoginoutBlock implements WpBlock {\n  attributes: WpCoreLoginoutBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreLoginoutBlockAttributes {\n  className: String\n  displayLoginAsForm: Boolean!\n  lock: JSON\n  redirectToCurrent: Boolean!\n}\n\n\"\"\"\ncore/media-text block\n\"\"\"\ntype WpCoreMediaTextBlock implements WpBlock {\n  attributes: WpCoreMediaTextBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreMediaTextBlockAttributes {\n  align: String!\n  anchor: String\n  backgroundColor: String\n  className: String\n  focalPoint: JSON\n  gradient: String\n  href: String\n  imageFill: Boolean\n  isStackedOnMobile: Boolean!\n  linkClass: String\n  linkDestination: String\n  linkTarget: String\n  lock: JSON\n  mediaAlt: String!\n  mediaId: Float\n  mediaLink: String\n  mediaPosition: String!\n  mediaSizeSlug: String\n  mediaType: String\n  mediaUrl: String\n  mediaWidth: Float!\n  rel: String\n  style: JSON\n  textColor: String\n  verticalAlignment: String\n}\n\nunion WpCoreMediaTextBlockAttributesUnion =\n    WpCoreMediaTextBlockAttributes\n  | WpCoreMediaTextBlockDeprecatedV1Attributes\n  | WpCoreMediaTextBlockDeprecatedV2Attributes\n  | WpCoreMediaTextBlockDeprecatedV3Attributes\n\ntype WpCoreMediaTextBlockDeprecatedV1Attributes {\n  align: String!\n  anchor: String\n  backgroundColor: String\n  className: String\n  focalPoint: JSON\n  gradient: String\n  href: String\n  imageFill: Boolean\n  isStackedOnMobile: Boolean!\n  linkClass: String\n  linkDestination: String\n  linkTarget: String\n  lock: JSON\n  mediaAlt: String!\n  mediaId: Float\n  mediaLink: String\n  mediaPosition: String!\n  mediaSizeSlug: String\n  mediaType: String\n  mediaUrl: String\n  mediaWidth: Float!\n  rel: String\n  style: JSON\n  textColor: String\n  verticalAlignment: String\n}\n\ntype WpCoreMediaTextBlockDeprecatedV2Attributes {\n  align: String!\n  anchor: String\n  backgroundColor: String\n  className: String\n  focalPoint: JSON\n  gradient: String\n  href: String\n  imageFill: Boolean\n  isStackedOnMobile: Boolean!\n  linkClass: String\n  linkDestination: String\n  linkTarget: String\n  lock: JSON\n  mediaAlt: String!\n  mediaId: Float\n  mediaLink: String\n  mediaPosition: String!\n  mediaSizeSlug: String\n  mediaType: String\n  mediaUrl: String\n  mediaWidth: Float!\n  rel: String\n  style: JSON\n  textColor: String\n  verticalAlignment: String\n}\n\ntype WpCoreMediaTextBlockDeprecatedV3Attributes {\n  align: String!\n  anchor: String\n  backgroundColor: String\n  className: String\n  focalPoint: JSON\n  gradient: String\n  href: String\n  imageFill: Boolean\n  isStackedOnMobile: Boolean!\n  linkClass: String\n  linkDestination: String\n  linkTarget: String\n  lock: JSON\n  mediaAlt: String!\n  mediaId: Float\n  mediaLink: String\n  mediaPosition: String!\n  mediaSizeSlug: String\n  mediaType: String\n  mediaUrl: String\n  mediaWidth: Float!\n  rel: String\n  style: JSON\n  textColor: String\n  verticalAlignment: String\n}\n\n\"\"\"\ncore/missing block\n\"\"\"\ntype WpCoreMissingBlock implements WpBlock {\n  attributes: WpCoreMissingBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreMissingBlockAttributes {\n  lock: JSON\n  originalContent: String\n  originalName: String\n  originalUndelimitedContent: String\n}\n\n\"\"\"\ncore/more block\n\"\"\"\ntype WpCoreMoreBlock implements WpBlock {\n  attributes: WpCoreMoreBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreMoreBlockAttributes {\n  customText: String\n  lock: JSON\n  noTeaser: Boolean!\n}\n\n\"\"\"\ncore/navigation block\n\"\"\"\ntype WpCoreNavigationBlock implements WpBlock {\n  attributes: WpCoreNavigationBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreNavigationBlockAttributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  customBackgroundColor: String\n  customOverlayBackgroundColor: String\n  customOverlayTextColor: String\n  customTextColor: String\n  fontFamily: String\n  fontSize: String\n  layout: JSON\n  lock: JSON\n  openSubmenusOnClick: Boolean!\n  overlayBackgroundColor: String\n  overlayMenu: String!\n  overlayTextColor: String\n  ref: Float\n  rgbBackgroundColor: String\n  rgbTextColor: String\n  showSubmenuIcon: Boolean!\n  style: JSON\n  textColor: String\n  unstableLocation: String\n}\n\nunion WpCoreNavigationBlockAttributesUnion =\n    WpCoreNavigationBlockAttributes\n  | WpCoreNavigationBlockDeprecatedV1Attributes\n  | WpCoreNavigationBlockDeprecatedV2Attributes\n  | WpCoreNavigationBlockDeprecatedV3Attributes\n  | WpCoreNavigationBlockDeprecatedV4Attributes\n  | WpCoreNavigationBlockDeprecatedV5Attributes\n  | WpCoreNavigationBlockDeprecatedV6Attributes\n\ntype WpCoreNavigationBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  customBackgroundColor: String\n  customOverlayBackgroundColor: String\n  customOverlayTextColor: String\n  customTextColor: String\n  fontFamily: String\n  fontSize: String\n  layout: JSON\n  lock: JSON\n  openSubmenusOnClick: Boolean!\n  overlayBackgroundColor: String\n  overlayMenu: String!\n  overlayTextColor: String\n  ref: Float\n  rgbBackgroundColor: String\n  rgbTextColor: String\n  showSubmenuIcon: Boolean!\n  style: JSON\n  textColor: String\n  unstableLocation: String\n}\n\ntype WpCoreNavigationBlockDeprecatedV2Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  customBackgroundColor: String\n  customOverlayBackgroundColor: String\n  customOverlayTextColor: String\n  customTextColor: String\n  fontFamily: String\n  fontSize: String\n  layout: JSON\n  lock: JSON\n  openSubmenusOnClick: Boolean!\n  overlayBackgroundColor: String\n  overlayMenu: String!\n  overlayTextColor: String\n  ref: Float\n  rgbBackgroundColor: String\n  rgbTextColor: String\n  showSubmenuIcon: Boolean!\n  style: JSON\n  textColor: String\n  unstableLocation: String\n}\n\ntype WpCoreNavigationBlockDeprecatedV3Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  customBackgroundColor: String\n  customOverlayBackgroundColor: String\n  customOverlayTextColor: String\n  customTextColor: String\n  fontFamily: String\n  fontSize: String\n  layout: JSON\n  lock: JSON\n  openSubmenusOnClick: Boolean!\n  overlayBackgroundColor: String\n  overlayMenu: String!\n  overlayTextColor: String\n  ref: Float\n  rgbBackgroundColor: String\n  rgbTextColor: String\n  showSubmenuIcon: Boolean!\n  style: JSON\n  textColor: String\n  unstableLocation: String\n}\n\ntype WpCoreNavigationBlockDeprecatedV4Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  customBackgroundColor: String\n  customOverlayBackgroundColor: String\n  customOverlayTextColor: String\n  customTextColor: String\n  fontFamily: String\n  fontSize: String\n  layout: JSON\n  lock: JSON\n  openSubmenusOnClick: Boolean!\n  overlayBackgroundColor: String\n  overlayMenu: String!\n  overlayTextColor: String\n  ref: Float\n  rgbBackgroundColor: String\n  rgbTextColor: String\n  showSubmenuIcon: Boolean!\n  style: JSON\n  textColor: String\n  unstableLocation: String\n}\n\ntype WpCoreNavigationBlockDeprecatedV5Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  customBackgroundColor: String\n  customOverlayBackgroundColor: String\n  customOverlayTextColor: String\n  customTextColor: String\n  fontFamily: String\n  fontSize: String\n  layout: JSON\n  lock: JSON\n  openSubmenusOnClick: Boolean!\n  overlayBackgroundColor: String\n  overlayMenu: String!\n  overlayTextColor: String\n  ref: Float\n  rgbBackgroundColor: String\n  rgbTextColor: String\n  showSubmenuIcon: Boolean!\n  style: JSON\n  textColor: String\n  unstableLocation: String\n}\n\ntype WpCoreNavigationBlockDeprecatedV6Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  customBackgroundColor: String\n  customOverlayBackgroundColor: String\n  customOverlayTextColor: String\n  customTextColor: String\n  fontFamily: String\n  fontSize: String\n  layout: JSON\n  lock: JSON\n  openSubmenusOnClick: Boolean!\n  overlayBackgroundColor: String\n  overlayMenu: String!\n  overlayTextColor: String\n  ref: Float\n  rgbBackgroundColor: String\n  rgbTextColor: String\n  showSubmenuIcon: Boolean!\n  style: JSON\n  textColor: String\n  unstableLocation: String\n}\n\n\"\"\"\ncore/navigation-link block\n\"\"\"\ntype WpCoreNavigationLinkBlock implements WpBlock {\n  attributes: WpCoreNavigationLinkBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreNavigationLinkBlockAttributes {\n  className: String\n  description: String\n  id: Float\n  isTopLevelLink: Boolean\n  kind: String\n  label: String\n  lock: JSON\n  opensInNewTab: Boolean!\n  rel: String\n  title: String\n  type: String\n  url: String\n}\n\nunion WpCoreNavigationLinkBlockAttributesUnion =\n    WpCoreNavigationLinkBlockAttributes\n  | WpCoreNavigationLinkBlockDeprecatedV1Attributes\n\ntype WpCoreNavigationLinkBlockDeprecatedV1Attributes {\n  className: String\n  description: String\n  id: Float\n  isTopLevelLink: Boolean\n  kind: String\n  label: String\n  lock: JSON\n  opensInNewTab: Boolean!\n  rel: String\n  title: String\n  type: String\n  url: String\n}\n\n\"\"\"\ncore/navigation-submenu block\n\"\"\"\ntype WpCoreNavigationSubmenuBlock implements WpBlock {\n  attributes: WpCoreNavigationSubmenuBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreNavigationSubmenuBlockAttributes {\n  className: String\n  description: String\n  id: Float\n  isTopLevelItem: Boolean\n  kind: String\n  label: String\n  lock: JSON\n  opensInNewTab: Boolean!\n  rel: String\n  title: String\n  type: String\n  url: String\n}\n\n\"\"\"\ncore/nextpage block\n\"\"\"\ntype WpCoreNextpageBlock implements WpBlock {\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreNextpageBlockAttributes {\n  lock: JSON\n}\n\n\"\"\"\ncore/page-list block\n\"\"\"\ntype WpCorePageListBlock implements WpBlock {\n  attributes: WpCorePageListBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePageListBlockAttributes {\n  className: String\n  lock: JSON\n}\n\n\"\"\"\ncore/paragraph block\n\"\"\"\ntype WpCoreParagraphBlock implements WpBlock {\n  attributes: WpCoreParagraphBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreParagraphBlockAttributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  direction: String\n  dropCap: Boolean!\n  fontSize: String\n  lock: JSON\n  placeholder: String\n  style: JSON\n  textColor: String\n}\n\nunion WpCoreParagraphBlockAttributesUnion =\n    WpCoreParagraphBlockAttributes\n  | WpCoreParagraphBlockDeprecatedV1Attributes\n  | WpCoreParagraphBlockDeprecatedV2Attributes\n  | WpCoreParagraphBlockDeprecatedV3Attributes\n  | WpCoreParagraphBlockDeprecatedV4Attributes\n  | WpCoreParagraphBlockDeprecatedV5Attributes\n\ntype WpCoreParagraphBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  direction: String\n  dropCap: Boolean!\n  fontSize: String\n  lock: JSON\n  placeholder: String\n  style: JSON\n  textColor: String\n}\n\ntype WpCoreParagraphBlockDeprecatedV2Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  direction: String\n  dropCap: Boolean!\n  fontSize: String\n  lock: JSON\n  placeholder: String\n  style: JSON\n  textColor: String\n}\n\ntype WpCoreParagraphBlockDeprecatedV3Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  direction: String\n  dropCap: Boolean!\n  fontSize: String\n  lock: JSON\n  placeholder: String\n  style: JSON\n  textColor: String\n}\n\ntype WpCoreParagraphBlockDeprecatedV4Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  direction: String\n  dropCap: Boolean!\n  fontSize: String\n  lock: JSON\n  placeholder: String\n  style: JSON\n  textColor: String\n}\n\ntype WpCoreParagraphBlockDeprecatedV5Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  direction: String\n  dropCap: Boolean!\n  fontSize: String\n  lock: JSON\n  placeholder: String\n  style: JSON\n  textColor: String\n}\n\n\"\"\"\ncore/pattern block\n\"\"\"\ntype WpCorePatternBlock implements WpBlock {\n  attributes: WpCorePatternBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePatternBlockAttributes {\n  className: String\n  lock: JSON\n  slug: String\n}\n\n\"\"\"\ncore/post-author block\n\"\"\"\ntype WpCorePostAuthorBlock implements WpBlock {\n  attributes: WpCorePostAuthorBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePostAuthorBlockAttributes {\n  avatarSize: Float!\n  backgroundColor: String\n  byline: String\n  className: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  showAvatar: Boolean!\n  showBio: Boolean\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\n\"\"\"\ncore/post-comments block\n\"\"\"\ntype WpCorePostCommentsBlock implements WpBlock {\n  attributes: WpCorePostCommentsBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePostCommentsBlockAttributes {\n  align: String\n  backgroundColor: String\n  className: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\n\"\"\"\ncore/post-content block\n\"\"\"\ntype WpCorePostContentBlock implements WpBlock {\n  attributes: WpCorePostContentBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePostContentBlockAttributes {\n  align: String\n  className: String\n  layout: JSON\n  lock: JSON\n}\n\n\"\"\"\ncore/post-date block\n\"\"\"\ntype WpCorePostDateBlock implements WpBlock {\n  attributes: WpCorePostDateBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePostDateBlockAttributes {\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  format: String\n  gradient: String\n  isLink: Boolean!\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\nunion WpCorePostDateBlockAttributesUnion = WpCorePostDateBlockAttributes | WpCorePostDateBlockDeprecatedV1Attributes\n\ntype WpCorePostDateBlockDeprecatedV1Attributes {\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  format: String\n  gradient: String\n  isLink: Boolean!\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\n\"\"\"\ncore/post-excerpt block\n\"\"\"\ntype WpCorePostExcerptBlock implements WpBlock {\n  attributes: WpCorePostExcerptBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePostExcerptBlockAttributes {\n  backgroundColor: String\n  className: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  moreText: String\n  showMoreOnNewLine: Boolean!\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\n\"\"\"\ncore/post-featured-image block\n\"\"\"\ntype WpCorePostFeaturedImageBlock implements WpBlock {\n  attributes: WpCorePostFeaturedImageBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePostFeaturedImageBlockAttributes {\n  align: String\n  className: String\n  height: String\n  isLink: Boolean!\n  lock: JSON\n  scale: String!\n  style: JSON\n  width: String\n}\n\n\"\"\"\ncore/post-navigation-link block\n\"\"\"\ntype WpCorePostNavigationLinkBlock implements WpBlock {\n  attributes: WpCorePostNavigationLinkBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePostNavigationLinkBlockAttributes {\n  className: String\n  fontSize: String\n  label: String\n  linkLabel: Boolean!\n  lock: JSON\n  showTitle: Boolean!\n  style: JSON\n  textAlign: String\n  type: String!\n}\n\n\"\"\"\ncore/post-template block\n\"\"\"\ntype WpCorePostTemplateBlock implements WpBlock {\n  attributes: WpCorePostTemplateBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePostTemplateBlockAttributes {\n  align: String\n  className: String\n  layout: JSON\n  lock: JSON\n}\n\n\"\"\"\ncore/post-terms block\n\"\"\"\ntype WpCorePostTermsBlock implements WpBlock {\n  attributes: WpCorePostTermsBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePostTermsBlockAttributes {\n  backgroundColor: String\n  className: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  separator: String!\n  style: JSON\n  term: String\n  textAlign: String\n  textColor: String\n}\n\n\"\"\"\ncore/post-title block\n\"\"\"\ntype WpCorePostTitleBlock implements WpBlock {\n  attributes: WpCorePostTitleBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePostTitleBlockAttributes {\n  align: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  isLink: Boolean!\n  level: Float!\n  linkTarget: String!\n  lock: JSON\n  rel: String!\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\nunion WpCorePostTitleBlockAttributesUnion = WpCorePostTitleBlockAttributes | WpCorePostTitleBlockDeprecatedV1Attributes\n\ntype WpCorePostTitleBlockDeprecatedV1Attributes {\n  align: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  isLink: Boolean!\n  level: Float!\n  linkTarget: String!\n  lock: JSON\n  rel: String!\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\n\"\"\"\ncore/preformatted block\n\"\"\"\ntype WpCorePreformattedBlock implements WpBlock {\n  attributes: WpCorePreformattedBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePreformattedBlockAttributes {\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textColor: String\n}\n\n\"\"\"\ncore/pullquote block\n\"\"\"\ntype WpCorePullquoteBlock implements WpBlock {\n  attributes: WpCorePullquoteBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCorePullquoteBlockAttributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  borderColor: String\n  citation: String!\n  className: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n  value: String\n}\n\nunion WpCorePullquoteBlockAttributesUnion =\n    WpCorePullquoteBlockAttributes\n  | WpCorePullquoteBlockDeprecatedV1Attributes\n  | WpCorePullquoteBlockDeprecatedV2Attributes\n  | WpCorePullquoteBlockDeprecatedV3Attributes\n  | WpCorePullquoteBlockDeprecatedV4Attributes\n  | WpCorePullquoteBlockDeprecatedV5Attributes\n\ntype WpCorePullquoteBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  borderColor: String\n  citation: String!\n  className: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n  value: String\n}\n\ntype WpCorePullquoteBlockDeprecatedV2Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  borderColor: String\n  citation: String!\n  className: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n  value: String\n}\n\ntype WpCorePullquoteBlockDeprecatedV3Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  borderColor: String\n  citation: String!\n  className: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n  value: String\n}\n\ntype WpCorePullquoteBlockDeprecatedV4Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  borderColor: String\n  citation: String!\n  className: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n  value: String\n}\n\ntype WpCorePullquoteBlockDeprecatedV5Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  borderColor: String\n  citation: String!\n  className: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n  value: String\n}\n\n\"\"\"\ncore/query block\n\"\"\"\ntype WpCoreQueryBlock implements WpBlock {\n  attributes: WpCoreQueryBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreQueryBlockAttributes {\n  align: String\n  backgroundColor: String\n  className: String\n  displayLayout: JSON!\n  gradient: String\n  layout: JSON\n  lock: JSON\n  query: JSON!\n  queryId: Float\n  style: JSON\n  tagName: String!\n  textColor: String\n}\n\nunion WpCoreQueryBlockAttributesUnion = WpCoreQueryBlockAttributes | WpCoreQueryBlockDeprecatedV1Attributes\n\ntype WpCoreQueryBlockDeprecatedV1Attributes {\n  align: String\n  backgroundColor: String\n  className: String\n  displayLayout: JSON!\n  gradient: String\n  layout: JSON\n  lock: JSON\n  query: JSON!\n  queryId: Float\n  style: JSON\n  tagName: String!\n  textColor: String\n}\n\n\"\"\"\ncore/query-pagination block\n\"\"\"\ntype WpCoreQueryPaginationBlock implements WpBlock {\n  attributes: WpCoreQueryPaginationBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreQueryPaginationBlockAttributes {\n  align: String\n  backgroundColor: String\n  className: String\n  gradient: String\n  layout: JSON\n  lock: JSON\n  paginationArrow: String!\n  style: JSON\n  textColor: String\n}\n\nunion WpCoreQueryPaginationBlockAttributesUnion =\n    WpCoreQueryPaginationBlockAttributes\n  | WpCoreQueryPaginationBlockDeprecatedV1Attributes\n\ntype WpCoreQueryPaginationBlockDeprecatedV1Attributes {\n  align: String\n  backgroundColor: String\n  className: String\n  gradient: String\n  layout: JSON\n  lock: JSON\n  paginationArrow: String!\n  style: JSON\n  textColor: String\n}\n\n\"\"\"\ncore/query-pagination-next block\n\"\"\"\ntype WpCoreQueryPaginationNextBlock implements WpBlock {\n  attributes: WpCoreQueryPaginationNextBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreQueryPaginationNextBlockAttributes {\n  backgroundColor: String\n  className: String\n  fontSize: String\n  gradient: String\n  label: String\n  lock: JSON\n  style: JSON\n  textColor: String\n}\n\n\"\"\"\ncore/query-pagination-numbers block\n\"\"\"\ntype WpCoreQueryPaginationNumbersBlock implements WpBlock {\n  attributes: WpCoreQueryPaginationNumbersBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreQueryPaginationNumbersBlockAttributes {\n  className: String\n  lock: JSON\n}\n\n\"\"\"\ncore/query-pagination-previous block\n\"\"\"\ntype WpCoreQueryPaginationPreviousBlock implements WpBlock {\n  attributes: WpCoreQueryPaginationPreviousBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreQueryPaginationPreviousBlockAttributes {\n  backgroundColor: String\n  className: String\n  fontSize: String\n  gradient: String\n  label: String\n  lock: JSON\n  style: JSON\n  textColor: String\n}\n\n\"\"\"\ncore/query-title block\n\"\"\"\ntype WpCoreQueryTitleBlock implements WpBlock {\n  attributes: WpCoreQueryTitleBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreQueryTitleBlockAttributes {\n  align: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  level: Float!\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n  type: String\n}\n\nunion WpCoreQueryTitleBlockAttributesUnion =\n    WpCoreQueryTitleBlockAttributes\n  | WpCoreQueryTitleBlockDeprecatedV1Attributes\n\ntype WpCoreQueryTitleBlockDeprecatedV1Attributes {\n  align: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  level: Float!\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n  type: String\n}\n\n\"\"\"\ncore/quote block\n\"\"\"\ntype WpCoreQuoteBlock implements WpBlock {\n  attributes: WpCoreQuoteBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreQuoteBlockAttributes {\n  align: String\n  anchor: String\n  citation: String!\n  className: String\n  fontSize: String\n  lock: JSON\n  style: JSON\n  value: String!\n}\n\nunion WpCoreQuoteBlockAttributesUnion =\n    WpCoreQuoteBlockAttributes\n  | WpCoreQuoteBlockDeprecatedV1Attributes\n  | WpCoreQuoteBlockDeprecatedV2Attributes\n  | WpCoreQuoteBlockDeprecatedV3Attributes\n\ntype WpCoreQuoteBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  citation: String!\n  className: String\n  fontSize: String\n  lock: JSON\n  style: JSON\n  value: String!\n}\n\ntype WpCoreQuoteBlockDeprecatedV2Attributes {\n  align: String\n  anchor: String\n  citation: String!\n  className: String\n  fontSize: String\n  lock: JSON\n  style: JSON\n  value: String!\n}\n\ntype WpCoreQuoteBlockDeprecatedV3Attributes {\n  align: String\n  anchor: String\n  citation: String!\n  className: String\n  fontSize: String\n  lock: JSON\n  style: JSON\n  value: String!\n}\n\n\"\"\"\ncore/rss block\n\"\"\"\ntype WpCoreRssBlock implements WpBlock {\n  attributes: WpCoreRssBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreRssBlockAttributes {\n  align: String\n  blockLayout: String!\n  className: String\n  columns: Float!\n  displayAuthor: Boolean!\n  displayDate: Boolean!\n  displayExcerpt: Boolean!\n  excerptLength: Float!\n  feedURL: String!\n  itemsToShow: Float!\n  lock: JSON\n}\n\n\"\"\"\ncore/search block\n\"\"\"\ntype WpCoreSearchBlock implements WpBlock {\n  attributes: WpCoreSearchBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreSearchBlockAttributes {\n  align: String\n  backgroundColor: String\n  borderColor: String\n  buttonPosition: String!\n  buttonText: String\n  buttonUseIcon: Boolean!\n  className: String\n  gradient: String\n  label: String\n  lock: JSON\n  placeholder: String!\n  showLabel: Boolean!\n  style: JSON\n  textColor: String\n  width: Float\n  widthUnit: String\n}\n\n\"\"\"\ncore/separator block\n\"\"\"\ntype WpCoreSeparatorBlock implements WpBlock {\n  attributes: WpCoreSeparatorBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreSeparatorBlockAttributes {\n  align: String\n  anchor: String\n  className: String\n  color: String\n  customColor: String\n  lock: JSON\n}\n\n\"\"\"\ncore/shortcode block\n\"\"\"\ntype WpCoreShortcodeBlock implements WpBlock {\n  attributes: WpCoreShortcodeBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreShortcodeBlockAttributes {\n  lock: JSON\n  text: String\n}\n\n\"\"\"\ncore/site-logo block\n\"\"\"\ntype WpCoreSiteLogoBlock implements WpBlock {\n  attributes: WpCoreSiteLogoBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreSiteLogoBlockAttributes {\n  align: String\n  className: String\n  isLink: Boolean!\n  linkTarget: String!\n  lock: JSON\n  shouldSyncIcon: Boolean\n  style: JSON\n  width: Float\n}\n\n\"\"\"\ncore/site-tagline block\n\"\"\"\ntype WpCoreSiteTaglineBlock implements WpBlock {\n  attributes: WpCoreSiteTaglineBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreSiteTaglineBlockAttributes {\n  align: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\nunion WpCoreSiteTaglineBlockAttributesUnion =\n    WpCoreSiteTaglineBlockAttributes\n  | WpCoreSiteTaglineBlockDeprecatedV1Attributes\n\ntype WpCoreSiteTaglineBlockDeprecatedV1Attributes {\n  align: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\n\"\"\"\ncore/site-title block\n\"\"\"\ntype WpCoreSiteTitleBlock implements WpBlock {\n  attributes: WpCoreSiteTitleBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreSiteTitleBlockAttributes {\n  align: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  isLink: Boolean!\n  level: Float!\n  linkTarget: String!\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\nunion WpCoreSiteTitleBlockAttributesUnion = WpCoreSiteTitleBlockAttributes | WpCoreSiteTitleBlockDeprecatedV1Attributes\n\ntype WpCoreSiteTitleBlockDeprecatedV1Attributes {\n  align: String\n  backgroundColor: String\n  className: String\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  isLink: Boolean!\n  level: Float!\n  linkTarget: String!\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\n\"\"\"\ncore/social-link block\n\"\"\"\ntype WpCoreSocialLinkBlock implements WpBlock {\n  attributes: WpCoreSocialLinkBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreSocialLinkBlockAttributes {\n  className: String\n  label: String\n  lock: JSON\n  service: String\n  url: String\n}\n\n\"\"\"\ncore/social-links block\n\"\"\"\ntype WpCoreSocialLinksBlock implements WpBlock {\n  attributes: WpCoreSocialLinksBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreSocialLinksBlockAttributes {\n  align: String\n  anchor: String\n  className: String\n  customIconBackgroundColor: String\n  customIconColor: String\n  iconBackgroundColor: String\n  iconBackgroundColorValue: String\n  iconColor: String\n  iconColorValue: String\n  layout: JSON\n  lock: JSON\n  openInNewTab: Boolean!\n  size: String\n  style: JSON\n}\n\nunion WpCoreSocialLinksBlockAttributesUnion =\n    WpCoreSocialLinksBlockAttributes\n  | WpCoreSocialLinksBlockDeprecatedV1Attributes\n\ntype WpCoreSocialLinksBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  className: String\n  customIconBackgroundColor: String\n  customIconColor: String\n  iconBackgroundColor: String\n  iconBackgroundColorValue: String\n  iconColor: String\n  iconColorValue: String\n  layout: JSON\n  lock: JSON\n  openInNewTab: Boolean!\n  size: String\n  style: JSON\n}\n\n\"\"\"\ncore/spacer block\n\"\"\"\ntype WpCoreSpacerBlock implements WpBlock {\n  attributes: WpCoreSpacerBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreSpacerBlockAttributes {\n  anchor: String\n  className: String\n  height: String!\n  lock: JSON\n  width: String\n}\n\nunion WpCoreSpacerBlockAttributesUnion = WpCoreSpacerBlockAttributes | WpCoreSpacerBlockDeprecatedV1Attributes\n\ntype WpCoreSpacerBlockDeprecatedV1Attributes {\n  anchor: String\n  className: String\n  height: String!\n  lock: JSON\n  width: String\n}\n\n\"\"\"\ncore/table block\n\"\"\"\ntype WpCoreTableBlock implements WpBlock {\n  attributes: WpCoreTableBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreTableBlockAttributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  body: [WpCoreTableBlockAttributesBody]!\n  borderColor: String\n  caption: String!\n  className: String\n  fontSize: String\n  foot: [WpCoreTableBlockAttributesFoot]!\n  gradient: String\n  hasFixedLayout: Boolean!\n  head: [WpCoreTableBlockAttributesHead]!\n  lock: JSON\n  style: JSON\n  textColor: String\n}\n\ntype WpCoreTableBlockAttributesBody {\n  cells: [WpCoreTableBlockAttributesBodyCells]!\n}\n\ntype WpCoreTableBlockAttributesBodyCells {\n  align: String\n  content: String\n  scope: String\n  tag: String!\n}\n\ntype WpCoreTableBlockAttributesFoot {\n  cells: [WpCoreTableBlockAttributesFootCells]!\n}\n\ntype WpCoreTableBlockAttributesFootCells {\n  align: String\n  content: String\n  scope: String\n  tag: String!\n}\n\ntype WpCoreTableBlockAttributesHead {\n  cells: [WpCoreTableBlockAttributesHeadCells]!\n}\n\ntype WpCoreTableBlockAttributesHeadCells {\n  align: String\n  content: String\n  scope: String\n  tag: String!\n}\n\nunion WpCoreTableBlockAttributesUnion =\n    WpCoreTableBlockAttributes\n  | WpCoreTableBlockDeprecatedV1Attributes\n  | WpCoreTableBlockDeprecatedV2Attributes\n\ntype WpCoreTableBlockDeprecatedV1Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  body: [WpCoreTableBlockDeprecatedV1AttributesBody]!\n  borderColor: String\n  caption: String!\n  className: String\n  fontSize: String\n  foot: [WpCoreTableBlockDeprecatedV1AttributesFoot]!\n  gradient: String\n  hasFixedLayout: Boolean!\n  head: [WpCoreTableBlockDeprecatedV1AttributesHead]!\n  lock: JSON\n  style: JSON\n  textColor: String\n}\n\ntype WpCoreTableBlockDeprecatedV1AttributesBody {\n  cells: [WpCoreTableBlockDeprecatedV1AttributesBodyCells]!\n}\n\ntype WpCoreTableBlockDeprecatedV1AttributesBodyCells {\n  align: String\n  content: String\n  scope: String\n  tag: String!\n}\n\ntype WpCoreTableBlockDeprecatedV1AttributesFoot {\n  cells: [WpCoreTableBlockDeprecatedV1AttributesFootCells]!\n}\n\ntype WpCoreTableBlockDeprecatedV1AttributesFootCells {\n  align: String\n  content: String\n  scope: String\n  tag: String!\n}\n\ntype WpCoreTableBlockDeprecatedV1AttributesHead {\n  cells: [WpCoreTableBlockDeprecatedV1AttributesHeadCells]!\n}\n\ntype WpCoreTableBlockDeprecatedV1AttributesHeadCells {\n  align: String\n  content: String\n  scope: String\n  tag: String!\n}\n\ntype WpCoreTableBlockDeprecatedV2Attributes {\n  align: String\n  anchor: String\n  backgroundColor: String\n  body: [WpCoreTableBlockDeprecatedV2AttributesBody]!\n  borderColor: String\n  caption: String!\n  className: String\n  fontSize: String\n  foot: [WpCoreTableBlockDeprecatedV2AttributesFoot]!\n  gradient: String\n  hasFixedLayout: Boolean!\n  head: [WpCoreTableBlockDeprecatedV2AttributesHead]!\n  lock: JSON\n  style: JSON\n  textColor: String\n}\n\ntype WpCoreTableBlockDeprecatedV2AttributesBody {\n  cells: [WpCoreTableBlockDeprecatedV2AttributesBodyCells]!\n}\n\ntype WpCoreTableBlockDeprecatedV2AttributesBodyCells {\n  align: String\n  content: String\n  scope: String\n  tag: String!\n}\n\ntype WpCoreTableBlockDeprecatedV2AttributesFoot {\n  cells: [WpCoreTableBlockDeprecatedV2AttributesFootCells]!\n}\n\ntype WpCoreTableBlockDeprecatedV2AttributesFootCells {\n  align: String\n  content: String\n  scope: String\n  tag: String!\n}\n\ntype WpCoreTableBlockDeprecatedV2AttributesHead {\n  cells: [WpCoreTableBlockDeprecatedV2AttributesHeadCells]!\n}\n\ntype WpCoreTableBlockDeprecatedV2AttributesHeadCells {\n  align: String\n  content: String\n  scope: String\n  tag: String!\n}\n\n\"\"\"\ncore/tag-cloud block\n\"\"\"\ntype WpCoreTagCloudBlock implements WpBlock {\n  attributes: WpCoreTagCloudBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreTagCloudBlockAttributes {\n  align: String\n  className: String\n  lock: JSON\n  numberOfTags: Float!\n  showTagCounts: Boolean!\n  taxonomy: String!\n}\n\n\"\"\"\ncore/template-part block\n\"\"\"\ntype WpCoreTemplatePartBlock implements WpBlock {\n  attributes: WpCoreTemplatePartBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreTemplatePartBlockAttributes {\n  align: String\n  area: String\n  className: String\n  lock: JSON\n  slug: String\n  tagName: String\n  theme: String\n}\n\n\"\"\"\ncore/term-description block\n\"\"\"\ntype WpCoreTermDescriptionBlock implements WpBlock {\n  attributes: WpCoreTermDescriptionBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreTermDescriptionBlockAttributes {\n  align: String\n  backgroundColor: String\n  className: String\n  fontSize: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\n\"\"\"\ncore/text-columns block\n\"\"\"\ntype WpCoreTextColumnsBlock implements WpBlock {\n  attributes: WpCoreTextColumnsBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreTextColumnsBlockAttributes {\n  className: String\n  columns: Float!\n  content: [WpCoreTextColumnsBlockAttributesContent]!\n  lock: JSON\n  width: String\n}\n\ntype WpCoreTextColumnsBlockAttributesContent {\n  wpChildren: String\n}\n\n\"\"\"\ncore/verse block\n\"\"\"\ntype WpCoreVerseBlock implements WpBlock {\n  attributes: WpCoreVerseBlockAttributesUnion\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreVerseBlockAttributes {\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\nunion WpCoreVerseBlockAttributesUnion =\n    WpCoreVerseBlockAttributes\n  | WpCoreVerseBlockDeprecatedV1Attributes\n  | WpCoreVerseBlockDeprecatedV2Attributes\n\ntype WpCoreVerseBlockDeprecatedV1Attributes {\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\ntype WpCoreVerseBlockDeprecatedV2Attributes {\n  anchor: String\n  backgroundColor: String\n  className: String\n  content: String!\n  fontFamily: String\n  fontSize: String\n  gradient: String\n  lock: JSON\n  style: JSON\n  textAlign: String\n  textColor: String\n}\n\n\"\"\"\ncore/video block\n\"\"\"\ntype WpCoreVideoBlock implements WpBlock {\n  attributes: WpCoreVideoBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpCoreVideoBlockAttributes {\n  align: String\n  anchor: String\n  autoplay: Boolean\n  caption: String\n  className: String\n  controls: Boolean!\n  id: Float\n  lock: JSON\n  loop: Boolean\n  muted: Boolean\n  playsInline: Boolean\n  poster: String\n  preload: String!\n  src: String\n  tracks: [WpBlockAttributesObject]!\n}\n\ninterface WpDatabaseIdentifier {\n  \"\"\"\n  The unique identifier stored in the database\n  \"\"\"\n  databaseId: Int!\n}\n\n\"\"\"\nThe template assigned to the node\n\"\"\"\ntype WpDefaultTemplate implements WpContentTemplate {\n  \"\"\"\n  The name of the template\n  \"\"\"\n  templateName: String\n}\n\n\"\"\"\nThe discussion setting type\n\"\"\"\ntype WpDiscussionSettings {\n  \"\"\"\n  Erlaube Besuchern, neue Beiträge zu kommentieren.\n  \"\"\"\n  defaultCommentStatus: String\n\n  \"\"\"\n  Link-Benachrichtigungen von anderen Blogs (Pingbacks und Trackbacks) zu neuen Beiträgen erlauben.\n  \"\"\"\n  defaultPingStatus: String\n}\n\ninput WpDiscussionSettingsFilterInput {\n  defaultCommentStatus: StringQueryOperatorInput\n  defaultPingStatus: StringQueryOperatorInput\n}\n\ntype WpEdge {\n  next: Wp\n  node: Wp!\n  previous: Wp\n}\n\nenum WpFieldsEnum {\n  allSettings___discussionSettingsDefaultCommentStatus\n  allSettings___discussionSettingsDefaultPingStatus\n  allSettings___generalSettingsDateFormat\n  allSettings___generalSettingsDescription\n  allSettings___generalSettingsEmail\n  allSettings___generalSettingsLanguage\n  allSettings___generalSettingsStartOfWeek\n  allSettings___generalSettingsTimeFormat\n  allSettings___generalSettingsTimezone\n  allSettings___generalSettingsTitle\n  allSettings___generalSettingsUrl\n  allSettings___readingSettingsPostsPerPage\n  allSettings___writingSettingsDefaultCategory\n  allSettings___writingSettingsDefaultPostFormat\n  allSettings___writingSettingsUseSmilies\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  discussionSettings___defaultCommentStatus\n  discussionSettings___defaultPingStatus\n  generalSettings___dateFormat\n  generalSettings___description\n  generalSettings___email\n  generalSettings___language\n  generalSettings___startOfWeek\n  generalSettings___timeFormat\n  generalSettings___timezone\n  generalSettings___title\n  generalSettings___url\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  readingSettings___postsPerPage\n  wpGatsby___arePrettyPermalinksEnabled\n  wpGatsby___isPreviewFrontendOnline\n  writingSettings___defaultCategory\n  writingSettings___defaultPostFormat\n  writingSettings___useSmilies\n}\n\ninput WpFilterInput {\n  allSettings: WpSettingsFilterInput\n  children: NodeFilterListInput\n  discussionSettings: WpDiscussionSettingsFilterInput\n  generalSettings: WpGeneralSettingsFilterInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  readingSettings: WpReadingSettingsFilterInput\n  wpGatsby: WpWPGatsbyFilterInput\n  writingSettings: WpWritingSettingsFilterInput\n}\n\n\"\"\"\nThe general setting type\n\"\"\"\ntype WpGeneralSettings {\n  \"\"\"\n  Ein Zeitformat für alle datumsbasierten Zeichenfolgen.\n  \"\"\"\n  dateFormat: String\n\n  \"\"\"\n  Website-Untertitel.\n  \"\"\"\n  description: String\n\n  \"\"\"\n  Diese Adresse wird für administrative Zwecke verwendet, wie Benachrichtigungen über neue Benutzer.\n  \"\"\"\n  email: String\n\n  \"\"\"\n  WordPress-Ländercode.\n  \"\"\"\n  language: String\n\n  \"\"\"\n  Die Zahl eines Wochentages, mit dem die Woche beginnen sollte.\n  \"\"\"\n  startOfWeek: Int\n\n  \"\"\"\n  Ein Zeitformat für alle zeitbasierten Zeichenfolgen.\n  \"\"\"\n  timeFormat: String\n\n  \"\"\"\n  Eine Stadt in deiner Zeitzone.\n  \"\"\"\n  timezone: String\n\n  \"\"\"\n  Website-Titel.\n  \"\"\"\n  title: String\n\n  \"\"\"\n  Website-URL.\n  \"\"\"\n  url: String\n}\n\ninput WpGeneralSettingsFilterInput {\n  dateFormat: StringQueryOperatorInput\n  description: StringQueryOperatorInput\n  email: StringQueryOperatorInput\n  language: StringQueryOperatorInput\n  startOfWeek: IntQueryOperatorInput\n  timeFormat: StringQueryOperatorInput\n  timezone: StringQueryOperatorInput\n  title: StringQueryOperatorInput\n  url: StringQueryOperatorInput\n}\n\ntype WpGroupConnection {\n  distinct(field: WpFieldsEnum!): [String!]!\n  edges: [WpEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpFieldsEnum!, limit: Int, skip: Int): [WpGroupConnection!]!\n  max(field: WpFieldsEnum!): Float\n  min(field: WpFieldsEnum!): Float\n  nodes: [Wp!]!\n  pageInfo: PageInfo!\n  sum(field: WpFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninterface WpHierarchicalContentNode {\n  \"\"\"\n  Returns ancestors of the node. Default ordered as lowest (closest to the child) to highest (closest to the root).\n  \"\"\"\n  ancestors: WpHierarchicalContentNodeToContentNodeAncestorsConnection\n\n  \"\"\"\n  Database id of the parent node\n  \"\"\"\n  parentDatabaseId: Int\n\n  \"\"\"\n  The globally unique identifier of the parent node.\n  \"\"\"\n  parentId: ID\n\n  \"\"\"\n  Connection between the HierarchicalContentNode type and the ContentNode type\n  \"\"\"\n  wpChildren: WpHierarchicalContentNodeToContentNodeChildrenConnection\n\n  \"\"\"\n  The parent of the node. The parent object can be of various types\n  \"\"\"\n  wpParent: WpHierarchicalContentNodeToParentContentNodeConnectionEdge\n}\n\n\"\"\"\nConnection between the HierarchicalContentNode type and the ContentNode type\n\"\"\"\ntype WpHierarchicalContentNodeToContentNodeAncestorsConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpContentNode]\n}\n\ninput WpHierarchicalContentNodeToContentNodeAncestorsConnectionFilterInput {\n  nodes: WpContentNodeFilterListInput\n}\n\n\"\"\"\nConnection between the HierarchicalContentNode type and the ContentNode type\n\"\"\"\ntype WpHierarchicalContentNodeToContentNodeChildrenConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpContentNode]\n}\n\ninput WpHierarchicalContentNodeToContentNodeChildrenConnectionFilterInput {\n  nodes: WpContentNodeFilterListInput\n}\n\n\"\"\"\nConnection between the HierarchicalContentNode type and the ContentNode type\n\"\"\"\ntype WpHierarchicalContentNodeToParentContentNodeConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpContentNode\n}\n\ninput WpHierarchicalContentNodeToParentContentNodeConnectionEdgeFilterInput {\n  node: WpContentNodeFilterInput\n}\n\ninterface WpHierarchicalTermNode {\n  \"\"\"\n  Database id of the parent node\n  \"\"\"\n  parentDatabaseId: Int\n\n  \"\"\"\n  The globally unique identifier of the parent node.\n  \"\"\"\n  parentId: ID\n}\n\n\"\"\"\nlazyblock-core/free block\n\"\"\"\ntype WpLazyblockCoreFreeBlock implements WpBlock {\n  attributes: WpLazyblockCoreFreeBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpLazyblockCoreFreeBlockAttributes {\n  className: String\n  lock: JSON\n}\n\n\"\"\"\nlazyblock/image-repeater block\n\"\"\"\ntype WpLazyblockImageRepeaterBlock implements WpBlock {\n  attributes: WpLazyblockImageRepeaterBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpLazyblockImageRepeaterBlockAttributes {\n  align: String!\n  anchor: String!\n  blockId: String!\n  blockUniqueClass: String!\n  className: String\n  ghostkitSR: String!\n  ghostkitSpacings: JSON!\n  images: String!\n  innerBlock: String!\n  lazyblock: JSON!\n  lock: JSON\n}\n\n\"\"\"\nlazyblock/lightbox-image block\n\"\"\"\ntype WpLazyblockLightboxImageBlock implements WpBlock {\n  attributes: WpLazyblockLightboxImageBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpLazyblockLightboxImageBlockAttributes {\n  align: String!\n  anchor: String!\n  blockId: String!\n  blockUniqueClass: String!\n  className: String\n  ghostkitSR: String!\n  ghostkitSpacings: JSON!\n  image: String!\n  lazyblock: JSON!\n  lock: JSON\n}\n\n\"\"\"\nlazyblock/project-highlight block\n\"\"\"\ntype WpLazyblockProjectHighlightBlock implements WpBlock {\n  attributes: WpLazyblockProjectHighlightBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpLazyblockProjectHighlightBlockAttributes {\n  align: String!\n  anchor: String!\n  blockId: String!\n  blockUniqueClass: String!\n  className: String\n  ghostkitSR: String!\n  ghostkitSpacings: JSON!\n  highlights: String!\n  images: String!\n  lazyblock: JSON!\n  lock: JSON\n  title: String!\n}\n\n\"\"\"\nlazyblock/projectecho block\n\"\"\"\ntype WpLazyblockProjectechoBlock implements WpBlock {\n  attributes: WpLazyblockProjectechoBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpLazyblockProjectechoBlockAttributes {\n  align: String!\n  anchor: String!\n  blockId: String!\n  blockUniqueClass: String!\n  className: String\n  gallery: String!\n  ghostkitSR: String!\n  ghostkitSpacings: JSON!\n  lazyblock: JSON!\n  lock: JSON\n}\n\n\"\"\"\nFile details for a Media Item\n\"\"\"\ntype WpMediaDetails {\n  \"\"\"\n  The filename of the mediaItem\n  \"\"\"\n  file: String\n\n  \"\"\"\n  The height of the mediaItem\n  \"\"\"\n  height: Int\n\n  \"\"\"\n  Meta information associated with the mediaItem\n  \"\"\"\n  meta: WpMediaItemMeta\n\n  \"\"\"\n  The available sizes of the mediaItem\n  \"\"\"\n  sizes: [WpMediaSize]\n\n  \"\"\"\n  The width of the mediaItem\n  \"\"\"\n  width: Int\n}\n\ninput WpMediaDetailsFilterInput {\n  file: StringQueryOperatorInput\n  height: IntQueryOperatorInput\n  meta: WpMediaItemMetaFilterInput\n  sizes: WpMediaSizeFilterListInput\n  width: IntQueryOperatorInput\n}\n\n\"\"\"\nThe mediaItem type\n\"\"\"\ntype WpMediaItem implements Node & RemoteFile & WpContentNode & WpDatabaseIdentifier & WpHierarchicalContentNode & WpNode & WpNodeWithAuthor & WpNodeWithComments & WpNodeWithTemplate & WpNodeWithTitle & WpUniformResourceIdentifiable {\n  \"\"\"\n  Alternative text to display when resource is not displayed\n  \"\"\"\n  altText: String\n\n  \"\"\"\n  Returns ancestors of the node. Default ordered as lowest (closest to the child) to highest (closest to the root).\n  \"\"\"\n  ancestors: WpHierarchicalContentNodeToContentNodeAncestorsConnection\n\n  \"\"\"\n  Connection between the NodeWithAuthor type and the User type\n  \"\"\"\n  author: WpNodeWithAuthorToUserConnectionEdge\n\n  \"\"\"\n  The database identifier of the author of the node\n  \"\"\"\n  authorDatabaseId: Int\n\n  \"\"\"\n  The globally unique identifier of the author of the node\n  \"\"\"\n  authorId: ID\n\n  \"\"\"\n  The caption for the resource\n  \"\"\"\n  caption: String\n  children: [Node!]!\n\n  \"\"\"\n  The number of comments. Even though WPGraphQL denotes this field as an integer, in WordPress this field should be saved as a numeric string for compatibility.\n  \"\"\"\n  commentCount: Int\n\n  \"\"\"\n  Whether the comments are open or closed for this particular post.\n  \"\"\"\n  commentStatus: String\n\n  \"\"\"\n  Connection between the mediaItem type and the Comment type\n  \"\"\"\n  comments: WpMediaItemToCommentConnection\n\n  \"\"\"\n  Connection between the ContentNode type and the ContentType type\n  \"\"\"\n  contentType: WpContentNodeToContentTypeConnectionEdge\n\n  \"\"\"\n  The name of the Content Type the node belongs to\n  \"\"\"\n  contentTypeName: String!\n\n  \"\"\"\n  The unique identifier stored in the database\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  Post publishing date.\n  \"\"\"\n  date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The publishing date set in GMT.\n  \"\"\"\n  dateGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  Description of the image (stored as post_content)\n  \"\"\"\n  description: String\n\n  \"\"\"\n  The desired slug of the post\n  \"\"\"\n  desiredSlug: String\n\n  \"\"\"\n  The RSS enclosure for the object\n  \"\"\"\n  enclosure: String\n\n  \"\"\"\n  The filesize in bytes of the resource\n  \"\"\"\n  fileSize: Int\n  filename: String!\n  filesize: Int\n\n  \"\"\"\n  Data used in the <GatsbyImage /> component. See https://gatsby.dev/img for more info.\n  \"\"\"\n  gatsbyImage(\n    \"\"\"\n    If set along with width or height, this will set the value of the other dimension to match the provided aspect ratio, cropping the image if needed.\n    If neither width or height is provided, height will be set based on the intrinsic width of the source image.\n    \"\"\"\n    aspectRatio: Float\n\n    \"\"\"\n    Background color applied to the wrapper, or when \"letterboxing\" an image to another aspect ratio.\n    \"\"\"\n    backgroundColor: String\n\n    \"\"\"\n    Specifies the image widths to generate. You should rarely need to change this. For FIXED and CONSTRAINED images it is better to allow these to be determined automatically,\n    based on the image size. For FULL_WIDTH images this can be used to override the default, which is [750, 1080, 1366, 1920].\n    It will never generate any images larger than the source.\n    \"\"\"\n    breakpoints: [Int] = [750, 1080, 1366, 1920]\n    cropFocus: [RemoteFileCropFocus]\n    fit: RemoteFileFit = COVER\n\n    \"\"\"\n    The image formats to generate. Valid values are AUTO (meaning the same format as the source image), JPG, PNG, WEBP and AVIF.\n    The default value is [AUTO, WEBP, AVIF], and you should rarely need to change this. Take care if you specify JPG or PNG when you do\n    not know the formats of the source images, as this could lead to unwanted results such as converting JPEGs to PNGs. Specifying\n    both PNG and JPG is not supported and will be ignored.\n    \"\"\"\n    formats: [RemoteFileFormat!] = [AUTO, WEBP, AVIF]\n\n    \"\"\"\n    If set, the height of the generated image. If omitted, it is calculated from the supplied width, matching the aspect ratio of the source image.\n    \"\"\"\n    height: Int\n\n    \"\"\"\n    The layout for the image.\n    FIXED: A static image sized, that does not resize according to the screen width\n    FULL_WIDTH: The image resizes to fit its container. Pass a \"sizes\" option if it isn't going to be the full width of the screen.\n    CONSTRAINED: Resizes to fit its container, up to a maximum width, at which point it will remain fixed in size.\n    \"\"\"\n    layout: RemoteFileLayout = CONSTRAINED\n\n    \"\"\"\n    A list of image pixel densities to generate for FIXED and CONSTRAINED images. You should rarely need to change this. It will never generate images larger than the source, and will always include a 1x image.\n    Default is [ 1, 2 ] for fixed images, meaning 1x, 2x, and [0.25, 0.5, 1, 2] for fluid. In this case, an image with a fluid layout and width = 400 would generate images at 100, 200, 400 and 800px wide.\n    \"\"\"\n    outputPixelDensities: [Float] = [0.25, 0.5, 1, 2]\n\n    \"\"\"\n    Format of generated placeholder image, displayed while the main image loads.\n    BLURRED: a blurred, low resolution image, encoded as a base64 data URI (default)\n    DOMINANT_COLOR: a solid color, calculated from the dominant color of the image.\n    TRACED_SVG: a low-resolution traced SVG of the image.\n    NONE: no placeholder. Set the argument \"backgroundColor\" to use a fixed background color.\n    \"\"\"\n    placeholder: RemoteFilePlaceholder = DOMINANT_COLOR\n    quality: Int = 75\n\n    \"\"\"\n    The \"sizes\" property, passed to the img tag. This describes the display size of the image.\n    This does not affect the generated images, but is used by the browser to decide which images to download. You can leave this blank for fixed images, or if the responsive image\n    container will be the full width of the screen. In these cases we will generate an appropriate value.\n    \"\"\"\n    sizes: String\n\n    \"\"\"\n    The display width of the generated image for layout = FIXED, and the display width of the largest image for layout = CONSTRAINED.\n    The actual largest image resolution will be this value multiplied by the largest value in outputPixelDensities\n    Ignored if layout = FLUID.\n    \"\"\"\n    width: Int\n  ): JSON\n\n  \"\"\"\n  The global unique identifier for this post. This currently matches the value stored in WP_Post-&gt;guid and the guid column in the &quot;post_objects&quot; database table.\n  \"\"\"\n  guid: String\n  height: Int\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  The user that most recently edited the node\n  \"\"\"\n  lastEditedBy: WpContentNodeToEditLastConnectionEdge\n\n  \"\"\"\n  The permalink of the post\n  \"\"\"\n  link: String\n  localFile: File\n\n  \"\"\"\n  Details about the mediaItem\n  \"\"\"\n  mediaDetails: WpMediaDetails\n\n  \"\"\"\n  Url of the mediaItem\n  \"\"\"\n  mediaItemUrl: String\n\n  \"\"\"\n  Type of resource\n  \"\"\"\n  mediaType: String\n  mimeType: String!\n\n  \"\"\"\n  The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time.\n  \"\"\"\n  modified(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT.\n  \"\"\"\n  modifiedGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  Database id of the parent node\n  \"\"\"\n  parentDatabaseId: Int\n\n  \"\"\"\n  The globally unique identifier of the parent node.\n  \"\"\"\n  parentId: ID\n  publicUrl: String!\n  remoteFile: File @deprecated(reason: \"MediaItem.remoteFile was renamed to localFile\")\n  resize(\n    cropFocus: [RemoteFileCropFocus]\n    fit: RemoteFileFit = COVER\n\n    \"\"\"\n    The image formats to generate. Valid values are AUTO (meaning the same format as the source image), JPG, PNG, WEBP and AVIF.\n    The default value is [AUTO, WEBP, AVIF], and you should rarely need to change this. Take care if you specify JPG or PNG when you do\n    not know the formats of the source images, as this could lead to unwanted results such as converting JPEGs to PNGs. Specifying\n    both PNG and JPG is not supported and will be ignored.\n    \"\"\"\n    format: RemoteFileFormat = AUTO\n    height: Int\n    quality: Int = 75\n    width: Int\n  ): RemoteFileResize\n\n  \"\"\"\n  The sizes attribute value for an image.\n  \"\"\"\n  sizes: String\n\n  \"\"\"\n  The uri slug for the post. This is equivalent to the WP_Post-&gt;post_name field and the post_name column in the database for the &quot;post_objects&quot; table.\n  \"\"\"\n  slug: String\n\n  \"\"\"\n  Url of the mediaItem\n  \"\"\"\n  sourceUrl: String\n\n  \"\"\"\n  The srcset attribute specifies the URL of the image to use in different situations. It is a comma separated string of urls and their widths.\n  \"\"\"\n  srcSet: String\n\n  \"\"\"\n  The current status of the object\n  \"\"\"\n  status: String\n\n  \"\"\"\n  The template assigned to the node\n  \"\"\"\n  template: WpContentTemplate\n\n  \"\"\"\n  The title of the post. This is currently just the raw title. An amendment to support rendered title needs to be made.\n  \"\"\"\n  title: String\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n  width: Int\n\n  \"\"\"\n  Connection between the HierarchicalContentNode type and the ContentNode type\n  \"\"\"\n  wpChildren: WpHierarchicalContentNodeToContentNodeChildrenConnection\n\n  \"\"\"\n  The parent of the node. The parent object can be of various types\n  \"\"\"\n  wpParent: WpHierarchicalContentNodeToParentContentNodeConnectionEdge\n}\n\ntype WpMediaItemConnection {\n  distinct(field: WpMediaItemFieldsEnum!): [String!]!\n  edges: [WpMediaItemEdge!]!\n  group(field: WpMediaItemFieldsEnum!, limit: Int, skip: Int): [WpMediaItemGroupConnection!]!\n  max(field: WpMediaItemFieldsEnum!): Float\n  min(field: WpMediaItemFieldsEnum!): Float\n  nodes: [WpMediaItem!]!\n  pageInfo: PageInfo!\n  sum(field: WpMediaItemFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpMediaItemEdge {\n  next: WpMediaItem\n  node: WpMediaItem!\n  previous: WpMediaItem\n}\n\nenum WpMediaItemFieldsEnum {\n  altText\n  ancestors___nodes\n  ancestors___nodes___children\n  ancestors___nodes___children___children\n  ancestors___nodes___children___id\n  ancestors___nodes___contentTypeName\n  ancestors___nodes___databaseId\n  ancestors___nodes___date\n  ancestors___nodes___dateGmt\n  ancestors___nodes___desiredSlug\n  ancestors___nodes___enclosure\n  ancestors___nodes___guid\n  ancestors___nodes___id\n  ancestors___nodes___internal___content\n  ancestors___nodes___internal___contentDigest\n  ancestors___nodes___internal___description\n  ancestors___nodes___internal___fieldOwners\n  ancestors___nodes___internal___ignoreType\n  ancestors___nodes___internal___mediaType\n  ancestors___nodes___internal___owner\n  ancestors___nodes___internal___type\n  ancestors___nodes___isContentNode\n  ancestors___nodes___isTermNode\n  ancestors___nodes___link\n  ancestors___nodes___modified\n  ancestors___nodes___modifiedGmt\n  ancestors___nodes___nodeType\n  ancestors___nodes___parent___children\n  ancestors___nodes___parent___id\n  ancestors___nodes___slug\n  ancestors___nodes___status\n  ancestors___nodes___template___templateName\n  ancestors___nodes___uri\n  authorDatabaseId\n  authorId\n  author___node___avatar___default\n  author___node___avatar___extraAttr\n  author___node___avatar___forceDefault\n  author___node___avatar___foundAvatar\n  author___node___avatar___height\n  author___node___avatar___rating\n  author___node___avatar___scheme\n  author___node___avatar___size\n  author___node___avatar___url\n  author___node___avatar___width\n  author___node___blockEditorPreviews___nodes\n  author___node___capKey\n  author___node___capabilities\n  author___node___children\n  author___node___children___children\n  author___node___children___id\n  author___node___comments___nodes\n  author___node___databaseId\n  author___node___description\n  author___node___email\n  author___node___extraCapabilities\n  author___node___firstName\n  author___node___id\n  author___node___internal___content\n  author___node___internal___contentDigest\n  author___node___internal___description\n  author___node___internal___fieldOwners\n  author___node___internal___ignoreType\n  author___node___internal___mediaType\n  author___node___internal___owner\n  author___node___internal___type\n  author___node___isContentNode\n  author___node___isTermNode\n  author___node___lastName\n  author___node___locale\n  author___node___name\n  author___node___nicename\n  author___node___nickname\n  author___node___nodeType\n  author___node___pages___nodes\n  author___node___parent___children\n  author___node___parent___id\n  author___node___posts___nodes\n  author___node___registeredDate\n  author___node___roles___nodes\n  author___node___slug\n  author___node___uri\n  author___node___url\n  author___node___username\n  caption\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  commentCount\n  commentStatus\n  comments___nodes\n  comments___nodes___agent\n  comments___nodes___approved\n  comments___nodes___authorIp\n  comments___nodes___children\n  comments___nodes___children___children\n  comments___nodes___children___id\n  comments___nodes___content\n  comments___nodes___databaseId\n  comments___nodes___date\n  comments___nodes___dateGmt\n  comments___nodes___id\n  comments___nodes___internal___content\n  comments___nodes___internal___contentDigest\n  comments___nodes___internal___description\n  comments___nodes___internal___fieldOwners\n  comments___nodes___internal___ignoreType\n  comments___nodes___internal___mediaType\n  comments___nodes___internal___owner\n  comments___nodes___internal___type\n  comments___nodes___karma\n  comments___nodes___nodeType\n  comments___nodes___parentDatabaseId\n  comments___nodes___parentId\n  comments___nodes___parent___children\n  comments___nodes___parent___id\n  comments___nodes___replies___nodes\n  comments___nodes___type\n  contentTypeName\n  contentType___node___archivePath\n  contentType___node___canExport\n  contentType___node___children\n  contentType___node___children___children\n  contentType___node___children___id\n  contentType___node___connectedTaxonomies___nodes\n  contentType___node___contentNodes___nodes\n  contentType___node___deleteWithUser\n  contentType___node___description\n  contentType___node___excludeFromSearch\n  contentType___node___graphqlPluralName\n  contentType___node___graphqlSingleName\n  contentType___node___hasArchive\n  contentType___node___hierarchical\n  contentType___node___id\n  contentType___node___internal___content\n  contentType___node___internal___contentDigest\n  contentType___node___internal___description\n  contentType___node___internal___fieldOwners\n  contentType___node___internal___ignoreType\n  contentType___node___internal___mediaType\n  contentType___node___internal___owner\n  contentType___node___internal___type\n  contentType___node___isContentNode\n  contentType___node___isFrontPage\n  contentType___node___isPostsPage\n  contentType___node___isTermNode\n  contentType___node___label\n  contentType___node___labels___addNew\n  contentType___node___labels___addNewItem\n  contentType___node___labels___allItems\n  contentType___node___labels___archives\n  contentType___node___labels___attributes\n  contentType___node___labels___editItem\n  contentType___node___labels___featuredImage\n  contentType___node___labels___filterItemsList\n  contentType___node___labels___insertIntoItem\n  contentType___node___labels___itemsList\n  contentType___node___labels___itemsListNavigation\n  contentType___node___labels___menuName\n  contentType___node___labels___name\n  contentType___node___labels___newItem\n  contentType___node___labels___notFound\n  contentType___node___labels___notFoundInTrash\n  contentType___node___labels___parentItemColon\n  contentType___node___labels___removeFeaturedImage\n  contentType___node___labels___searchItems\n  contentType___node___labels___setFeaturedImage\n  contentType___node___labels___singularName\n  contentType___node___labels___uploadedToThisItem\n  contentType___node___labels___useFeaturedImage\n  contentType___node___labels___viewItem\n  contentType___node___labels___viewItems\n  contentType___node___menuIcon\n  contentType___node___menuPosition\n  contentType___node___name\n  contentType___node___nodeType\n  contentType___node___parent___children\n  contentType___node___parent___id\n  contentType___node___public\n  contentType___node___publiclyQueryable\n  contentType___node___restBase\n  contentType___node___restControllerClass\n  contentType___node___showInAdminBar\n  contentType___node___showInGraphql\n  contentType___node___showInMenu\n  contentType___node___showInNavMenus\n  contentType___node___showInRest\n  contentType___node___showUi\n  contentType___node___uri\n  databaseId\n  date\n  dateGmt\n  description\n  desiredSlug\n  enclosure\n  fileSize\n  filename\n  filesize\n  gatsbyImage\n  guid\n  height\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  isContentNode\n  isTermNode\n  lastEditedBy___node___avatar___default\n  lastEditedBy___node___avatar___extraAttr\n  lastEditedBy___node___avatar___forceDefault\n  lastEditedBy___node___avatar___foundAvatar\n  lastEditedBy___node___avatar___height\n  lastEditedBy___node___avatar___rating\n  lastEditedBy___node___avatar___scheme\n  lastEditedBy___node___avatar___size\n  lastEditedBy___node___avatar___url\n  lastEditedBy___node___avatar___width\n  lastEditedBy___node___blockEditorPreviews___nodes\n  lastEditedBy___node___capKey\n  lastEditedBy___node___capabilities\n  lastEditedBy___node___children\n  lastEditedBy___node___children___children\n  lastEditedBy___node___children___id\n  lastEditedBy___node___comments___nodes\n  lastEditedBy___node___databaseId\n  lastEditedBy___node___description\n  lastEditedBy___node___email\n  lastEditedBy___node___extraCapabilities\n  lastEditedBy___node___firstName\n  lastEditedBy___node___id\n  lastEditedBy___node___internal___content\n  lastEditedBy___node___internal___contentDigest\n  lastEditedBy___node___internal___description\n  lastEditedBy___node___internal___fieldOwners\n  lastEditedBy___node___internal___ignoreType\n  lastEditedBy___node___internal___mediaType\n  lastEditedBy___node___internal___owner\n  lastEditedBy___node___internal___type\n  lastEditedBy___node___isContentNode\n  lastEditedBy___node___isTermNode\n  lastEditedBy___node___lastName\n  lastEditedBy___node___locale\n  lastEditedBy___node___name\n  lastEditedBy___node___nicename\n  lastEditedBy___node___nickname\n  lastEditedBy___node___nodeType\n  lastEditedBy___node___pages___nodes\n  lastEditedBy___node___parent___children\n  lastEditedBy___node___parent___id\n  lastEditedBy___node___posts___nodes\n  lastEditedBy___node___registeredDate\n  lastEditedBy___node___roles___nodes\n  lastEditedBy___node___slug\n  lastEditedBy___node___uri\n  lastEditedBy___node___url\n  lastEditedBy___node___username\n  link\n  localFile___absolutePath\n  localFile___accessTime\n  localFile___atime\n  localFile___atimeMs\n  localFile___base\n  localFile___birthTime\n  localFile___birthtime\n  localFile___birthtimeMs\n  localFile___blksize\n  localFile___blocks\n  localFile___changeTime\n  localFile___childImageSharp___children\n  localFile___childImageSharp___children___children\n  localFile___childImageSharp___children___id\n  localFile___childImageSharp___fixed___aspectRatio\n  localFile___childImageSharp___fixed___base64\n  localFile___childImageSharp___fixed___height\n  localFile___childImageSharp___fixed___originalName\n  localFile___childImageSharp___fixed___src\n  localFile___childImageSharp___fixed___srcSet\n  localFile___childImageSharp___fixed___srcSetWebp\n  localFile___childImageSharp___fixed___srcWebp\n  localFile___childImageSharp___fixed___tracedSVG\n  localFile___childImageSharp___fixed___width\n  localFile___childImageSharp___fluid___aspectRatio\n  localFile___childImageSharp___fluid___base64\n  localFile___childImageSharp___fluid___originalImg\n  localFile___childImageSharp___fluid___originalName\n  localFile___childImageSharp___fluid___presentationHeight\n  localFile___childImageSharp___fluid___presentationWidth\n  localFile___childImageSharp___fluid___sizes\n  localFile___childImageSharp___fluid___src\n  localFile___childImageSharp___fluid___srcSet\n  localFile___childImageSharp___fluid___srcSetWebp\n  localFile___childImageSharp___fluid___srcWebp\n  localFile___childImageSharp___fluid___tracedSVG\n  localFile___childImageSharp___gatsbyImageData\n  localFile___childImageSharp___id\n  localFile___childImageSharp___internal___content\n  localFile___childImageSharp___internal___contentDigest\n  localFile___childImageSharp___internal___description\n  localFile___childImageSharp___internal___fieldOwners\n  localFile___childImageSharp___internal___ignoreType\n  localFile___childImageSharp___internal___mediaType\n  localFile___childImageSharp___internal___owner\n  localFile___childImageSharp___internal___type\n  localFile___childImageSharp___original___height\n  localFile___childImageSharp___original___src\n  localFile___childImageSharp___original___width\n  localFile___childImageSharp___parent___children\n  localFile___childImageSharp___parent___id\n  localFile___childImageSharp___resize___aspectRatio\n  localFile___childImageSharp___resize___height\n  localFile___childImageSharp___resize___originalName\n  localFile___childImageSharp___resize___src\n  localFile___childImageSharp___resize___tracedSVG\n  localFile___childImageSharp___resize___width\n  localFile___children\n  localFile___childrenImageSharp\n  localFile___childrenImageSharp___children\n  localFile___childrenImageSharp___children___children\n  localFile___childrenImageSharp___children___id\n  localFile___childrenImageSharp___fixed___aspectRatio\n  localFile___childrenImageSharp___fixed___base64\n  localFile___childrenImageSharp___fixed___height\n  localFile___childrenImageSharp___fixed___originalName\n  localFile___childrenImageSharp___fixed___src\n  localFile___childrenImageSharp___fixed___srcSet\n  localFile___childrenImageSharp___fixed___srcSetWebp\n  localFile___childrenImageSharp___fixed___srcWebp\n  localFile___childrenImageSharp___fixed___tracedSVG\n  localFile___childrenImageSharp___fixed___width\n  localFile___childrenImageSharp___fluid___aspectRatio\n  localFile___childrenImageSharp___fluid___base64\n  localFile___childrenImageSharp___fluid___originalImg\n  localFile___childrenImageSharp___fluid___originalName\n  localFile___childrenImageSharp___fluid___presentationHeight\n  localFile___childrenImageSharp___fluid___presentationWidth\n  localFile___childrenImageSharp___fluid___sizes\n  localFile___childrenImageSharp___fluid___src\n  localFile___childrenImageSharp___fluid___srcSet\n  localFile___childrenImageSharp___fluid___srcSetWebp\n  localFile___childrenImageSharp___fluid___srcWebp\n  localFile___childrenImageSharp___fluid___tracedSVG\n  localFile___childrenImageSharp___gatsbyImageData\n  localFile___childrenImageSharp___id\n  localFile___childrenImageSharp___internal___content\n  localFile___childrenImageSharp___internal___contentDigest\n  localFile___childrenImageSharp___internal___description\n  localFile___childrenImageSharp___internal___fieldOwners\n  localFile___childrenImageSharp___internal___ignoreType\n  localFile___childrenImageSharp___internal___mediaType\n  localFile___childrenImageSharp___internal___owner\n  localFile___childrenImageSharp___internal___type\n  localFile___childrenImageSharp___original___height\n  localFile___childrenImageSharp___original___src\n  localFile___childrenImageSharp___original___width\n  localFile___childrenImageSharp___parent___children\n  localFile___childrenImageSharp___parent___id\n  localFile___childrenImageSharp___resize___aspectRatio\n  localFile___childrenImageSharp___resize___height\n  localFile___childrenImageSharp___resize___originalName\n  localFile___childrenImageSharp___resize___src\n  localFile___childrenImageSharp___resize___tracedSVG\n  localFile___childrenImageSharp___resize___width\n  localFile___children___children\n  localFile___children___children___children\n  localFile___children___children___id\n  localFile___children___id\n  localFile___children___internal___content\n  localFile___children___internal___contentDigest\n  localFile___children___internal___description\n  localFile___children___internal___fieldOwners\n  localFile___children___internal___ignoreType\n  localFile___children___internal___mediaType\n  localFile___children___internal___owner\n  localFile___children___internal___type\n  localFile___children___parent___children\n  localFile___children___parent___id\n  localFile___ctime\n  localFile___ctimeMs\n  localFile___dev\n  localFile___dir\n  localFile___ext\n  localFile___extension\n  localFile___gid\n  localFile___hash\n  localFile___id\n  localFile___ino\n  localFile___internal___content\n  localFile___internal___contentDigest\n  localFile___internal___description\n  localFile___internal___fieldOwners\n  localFile___internal___ignoreType\n  localFile___internal___mediaType\n  localFile___internal___owner\n  localFile___internal___type\n  localFile___mode\n  localFile___modifiedTime\n  localFile___mtime\n  localFile___mtimeMs\n  localFile___name\n  localFile___nlink\n  localFile___parent___children\n  localFile___parent___children___children\n  localFile___parent___children___id\n  localFile___parent___id\n  localFile___parent___internal___content\n  localFile___parent___internal___contentDigest\n  localFile___parent___internal___description\n  localFile___parent___internal___fieldOwners\n  localFile___parent___internal___ignoreType\n  localFile___parent___internal___mediaType\n  localFile___parent___internal___owner\n  localFile___parent___internal___type\n  localFile___parent___parent___children\n  localFile___parent___parent___id\n  localFile___prettySize\n  localFile___publicURL\n  localFile___rdev\n  localFile___relativeDirectory\n  localFile___relativePath\n  localFile___root\n  localFile___size\n  localFile___sourceInstanceName\n  localFile___uid\n  mediaDetails___file\n  mediaDetails___height\n  mediaDetails___meta___aperture\n  mediaDetails___meta___camera\n  mediaDetails___meta___caption\n  mediaDetails___meta___copyright\n  mediaDetails___meta___createdTimestamp\n  mediaDetails___meta___credit\n  mediaDetails___meta___focalLength\n  mediaDetails___meta___iso\n  mediaDetails___meta___keywords\n  mediaDetails___meta___orientation\n  mediaDetails___meta___shutterSpeed\n  mediaDetails___meta___title\n  mediaDetails___sizes\n  mediaDetails___sizes___file\n  mediaDetails___sizes___fileSize\n  mediaDetails___sizes___height\n  mediaDetails___sizes___mimeType\n  mediaDetails___sizes___name\n  mediaDetails___sizes___sourceUrl\n  mediaDetails___sizes___width\n  mediaDetails___width\n  mediaItemUrl\n  mediaType\n  mimeType\n  modified\n  modifiedGmt\n  nodeType\n  parentDatabaseId\n  parentId\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  publicUrl\n  remoteFile___absolutePath\n  remoteFile___accessTime\n  remoteFile___atime\n  remoteFile___atimeMs\n  remoteFile___base\n  remoteFile___birthTime\n  remoteFile___birthtime\n  remoteFile___birthtimeMs\n  remoteFile___blksize\n  remoteFile___blocks\n  remoteFile___changeTime\n  remoteFile___childImageSharp___children\n  remoteFile___childImageSharp___children___children\n  remoteFile___childImageSharp___children___id\n  remoteFile___childImageSharp___fixed___aspectRatio\n  remoteFile___childImageSharp___fixed___base64\n  remoteFile___childImageSharp___fixed___height\n  remoteFile___childImageSharp___fixed___originalName\n  remoteFile___childImageSharp___fixed___src\n  remoteFile___childImageSharp___fixed___srcSet\n  remoteFile___childImageSharp___fixed___srcSetWebp\n  remoteFile___childImageSharp___fixed___srcWebp\n  remoteFile___childImageSharp___fixed___tracedSVG\n  remoteFile___childImageSharp___fixed___width\n  remoteFile___childImageSharp___fluid___aspectRatio\n  remoteFile___childImageSharp___fluid___base64\n  remoteFile___childImageSharp___fluid___originalImg\n  remoteFile___childImageSharp___fluid___originalName\n  remoteFile___childImageSharp___fluid___presentationHeight\n  remoteFile___childImageSharp___fluid___presentationWidth\n  remoteFile___childImageSharp___fluid___sizes\n  remoteFile___childImageSharp___fluid___src\n  remoteFile___childImageSharp___fluid___srcSet\n  remoteFile___childImageSharp___fluid___srcSetWebp\n  remoteFile___childImageSharp___fluid___srcWebp\n  remoteFile___childImageSharp___fluid___tracedSVG\n  remoteFile___childImageSharp___gatsbyImageData\n  remoteFile___childImageSharp___id\n  remoteFile___childImageSharp___internal___content\n  remoteFile___childImageSharp___internal___contentDigest\n  remoteFile___childImageSharp___internal___description\n  remoteFile___childImageSharp___internal___fieldOwners\n  remoteFile___childImageSharp___internal___ignoreType\n  remoteFile___childImageSharp___internal___mediaType\n  remoteFile___childImageSharp___internal___owner\n  remoteFile___childImageSharp___internal___type\n  remoteFile___childImageSharp___original___height\n  remoteFile___childImageSharp___original___src\n  remoteFile___childImageSharp___original___width\n  remoteFile___childImageSharp___parent___children\n  remoteFile___childImageSharp___parent___id\n  remoteFile___childImageSharp___resize___aspectRatio\n  remoteFile___childImageSharp___resize___height\n  remoteFile___childImageSharp___resize___originalName\n  remoteFile___childImageSharp___resize___src\n  remoteFile___childImageSharp___resize___tracedSVG\n  remoteFile___childImageSharp___resize___width\n  remoteFile___children\n  remoteFile___childrenImageSharp\n  remoteFile___childrenImageSharp___children\n  remoteFile___childrenImageSharp___children___children\n  remoteFile___childrenImageSharp___children___id\n  remoteFile___childrenImageSharp___fixed___aspectRatio\n  remoteFile___childrenImageSharp___fixed___base64\n  remoteFile___childrenImageSharp___fixed___height\n  remoteFile___childrenImageSharp___fixed___originalName\n  remoteFile___childrenImageSharp___fixed___src\n  remoteFile___childrenImageSharp___fixed___srcSet\n  remoteFile___childrenImageSharp___fixed___srcSetWebp\n  remoteFile___childrenImageSharp___fixed___srcWebp\n  remoteFile___childrenImageSharp___fixed___tracedSVG\n  remoteFile___childrenImageSharp___fixed___width\n  remoteFile___childrenImageSharp___fluid___aspectRatio\n  remoteFile___childrenImageSharp___fluid___base64\n  remoteFile___childrenImageSharp___fluid___originalImg\n  remoteFile___childrenImageSharp___fluid___originalName\n  remoteFile___childrenImageSharp___fluid___presentationHeight\n  remoteFile___childrenImageSharp___fluid___presentationWidth\n  remoteFile___childrenImageSharp___fluid___sizes\n  remoteFile___childrenImageSharp___fluid___src\n  remoteFile___childrenImageSharp___fluid___srcSet\n  remoteFile___childrenImageSharp___fluid___srcSetWebp\n  remoteFile___childrenImageSharp___fluid___srcWebp\n  remoteFile___childrenImageSharp___fluid___tracedSVG\n  remoteFile___childrenImageSharp___gatsbyImageData\n  remoteFile___childrenImageSharp___id\n  remoteFile___childrenImageSharp___internal___content\n  remoteFile___childrenImageSharp___internal___contentDigest\n  remoteFile___childrenImageSharp___internal___description\n  remoteFile___childrenImageSharp___internal___fieldOwners\n  remoteFile___childrenImageSharp___internal___ignoreType\n  remoteFile___childrenImageSharp___internal___mediaType\n  remoteFile___childrenImageSharp___internal___owner\n  remoteFile___childrenImageSharp___internal___type\n  remoteFile___childrenImageSharp___original___height\n  remoteFile___childrenImageSharp___original___src\n  remoteFile___childrenImageSharp___original___width\n  remoteFile___childrenImageSharp___parent___children\n  remoteFile___childrenImageSharp___parent___id\n  remoteFile___childrenImageSharp___resize___aspectRatio\n  remoteFile___childrenImageSharp___resize___height\n  remoteFile___childrenImageSharp___resize___originalName\n  remoteFile___childrenImageSharp___resize___src\n  remoteFile___childrenImageSharp___resize___tracedSVG\n  remoteFile___childrenImageSharp___resize___width\n  remoteFile___children___children\n  remoteFile___children___children___children\n  remoteFile___children___children___id\n  remoteFile___children___id\n  remoteFile___children___internal___content\n  remoteFile___children___internal___contentDigest\n  remoteFile___children___internal___description\n  remoteFile___children___internal___fieldOwners\n  remoteFile___children___internal___ignoreType\n  remoteFile___children___internal___mediaType\n  remoteFile___children___internal___owner\n  remoteFile___children___internal___type\n  remoteFile___children___parent___children\n  remoteFile___children___parent___id\n  remoteFile___ctime\n  remoteFile___ctimeMs\n  remoteFile___dev\n  remoteFile___dir\n  remoteFile___ext\n  remoteFile___extension\n  remoteFile___gid\n  remoteFile___hash\n  remoteFile___id\n  remoteFile___ino\n  remoteFile___internal___content\n  remoteFile___internal___contentDigest\n  remoteFile___internal___description\n  remoteFile___internal___fieldOwners\n  remoteFile___internal___ignoreType\n  remoteFile___internal___mediaType\n  remoteFile___internal___owner\n  remoteFile___internal___type\n  remoteFile___mode\n  remoteFile___modifiedTime\n  remoteFile___mtime\n  remoteFile___mtimeMs\n  remoteFile___name\n  remoteFile___nlink\n  remoteFile___parent___children\n  remoteFile___parent___children___children\n  remoteFile___parent___children___id\n  remoteFile___parent___id\n  remoteFile___parent___internal___content\n  remoteFile___parent___internal___contentDigest\n  remoteFile___parent___internal___description\n  remoteFile___parent___internal___fieldOwners\n  remoteFile___parent___internal___ignoreType\n  remoteFile___parent___internal___mediaType\n  remoteFile___parent___internal___owner\n  remoteFile___parent___internal___type\n  remoteFile___parent___parent___children\n  remoteFile___parent___parent___id\n  remoteFile___prettySize\n  remoteFile___publicURL\n  remoteFile___rdev\n  remoteFile___relativeDirectory\n  remoteFile___relativePath\n  remoteFile___root\n  remoteFile___size\n  remoteFile___sourceInstanceName\n  remoteFile___uid\n  resize___height\n  resize___src\n  resize___width\n  sizes\n  slug\n  sourceUrl\n  srcSet\n  status\n  template___templateName\n  title\n  uri\n  width\n  wpChildren___nodes\n  wpChildren___nodes___children\n  wpChildren___nodes___children___children\n  wpChildren___nodes___children___id\n  wpChildren___nodes___contentTypeName\n  wpChildren___nodes___databaseId\n  wpChildren___nodes___date\n  wpChildren___nodes___dateGmt\n  wpChildren___nodes___desiredSlug\n  wpChildren___nodes___enclosure\n  wpChildren___nodes___guid\n  wpChildren___nodes___id\n  wpChildren___nodes___internal___content\n  wpChildren___nodes___internal___contentDigest\n  wpChildren___nodes___internal___description\n  wpChildren___nodes___internal___fieldOwners\n  wpChildren___nodes___internal___ignoreType\n  wpChildren___nodes___internal___mediaType\n  wpChildren___nodes___internal___owner\n  wpChildren___nodes___internal___type\n  wpChildren___nodes___isContentNode\n  wpChildren___nodes___isTermNode\n  wpChildren___nodes___link\n  wpChildren___nodes___modified\n  wpChildren___nodes___modifiedGmt\n  wpChildren___nodes___nodeType\n  wpChildren___nodes___parent___children\n  wpChildren___nodes___parent___id\n  wpChildren___nodes___slug\n  wpChildren___nodes___status\n  wpChildren___nodes___template___templateName\n  wpChildren___nodes___uri\n  wpParent___node___children\n  wpParent___node___children___children\n  wpParent___node___children___id\n  wpParent___node___contentTypeName\n  wpParent___node___databaseId\n  wpParent___node___date\n  wpParent___node___dateGmt\n  wpParent___node___desiredSlug\n  wpParent___node___enclosure\n  wpParent___node___guid\n  wpParent___node___id\n  wpParent___node___internal___content\n  wpParent___node___internal___contentDigest\n  wpParent___node___internal___description\n  wpParent___node___internal___fieldOwners\n  wpParent___node___internal___ignoreType\n  wpParent___node___internal___mediaType\n  wpParent___node___internal___owner\n  wpParent___node___internal___type\n  wpParent___node___isContentNode\n  wpParent___node___isTermNode\n  wpParent___node___link\n  wpParent___node___modified\n  wpParent___node___modifiedGmt\n  wpParent___node___nodeType\n  wpParent___node___parent___children\n  wpParent___node___parent___id\n  wpParent___node___slug\n  wpParent___node___status\n  wpParent___node___template___templateName\n  wpParent___node___uri\n}\n\ninput WpMediaItemFilterInput {\n  altText: StringQueryOperatorInput\n  ancestors: WpHierarchicalContentNodeToContentNodeAncestorsConnectionFilterInput\n  author: WpNodeWithAuthorToUserConnectionEdgeFilterInput\n  authorDatabaseId: IntQueryOperatorInput\n  authorId: IDQueryOperatorInput\n  caption: StringQueryOperatorInput\n  children: NodeFilterListInput\n  commentCount: IntQueryOperatorInput\n  commentStatus: StringQueryOperatorInput\n  comments: WpMediaItemToCommentConnectionFilterInput\n  contentType: WpContentNodeToContentTypeConnectionEdgeFilterInput\n  contentTypeName: StringQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  date: DateQueryOperatorInput\n  dateGmt: DateQueryOperatorInput\n  description: StringQueryOperatorInput\n  desiredSlug: StringQueryOperatorInput\n  enclosure: StringQueryOperatorInput\n  fileSize: IntQueryOperatorInput\n  filename: StringQueryOperatorInput\n  filesize: IntQueryOperatorInput\n  gatsbyImage: JSONQueryOperatorInput\n  guid: StringQueryOperatorInput\n  height: IntQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  isContentNode: BooleanQueryOperatorInput\n  isTermNode: BooleanQueryOperatorInput\n  lastEditedBy: WpContentNodeToEditLastConnectionEdgeFilterInput\n  link: StringQueryOperatorInput\n  localFile: FileFilterInput\n  mediaDetails: WpMediaDetailsFilterInput\n  mediaItemUrl: StringQueryOperatorInput\n  mediaType: StringQueryOperatorInput\n  mimeType: StringQueryOperatorInput\n  modified: DateQueryOperatorInput\n  modifiedGmt: DateQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  parentDatabaseId: IntQueryOperatorInput\n  parentId: IDQueryOperatorInput\n  publicUrl: StringQueryOperatorInput\n  remoteFile: FileFilterInput\n  resize: RemoteFileResizeFilterInput\n  sizes: StringQueryOperatorInput\n  slug: StringQueryOperatorInput\n  sourceUrl: StringQueryOperatorInput\n  srcSet: StringQueryOperatorInput\n  status: StringQueryOperatorInput\n  template: WpContentTemplateFilterInput\n  title: StringQueryOperatorInput\n  uri: StringQueryOperatorInput\n  width: IntQueryOperatorInput\n  wpChildren: WpHierarchicalContentNodeToContentNodeChildrenConnectionFilterInput\n  wpParent: WpHierarchicalContentNodeToParentContentNodeConnectionEdgeFilterInput\n}\n\ntype WpMediaItemGroupConnection {\n  distinct(field: WpMediaItemFieldsEnum!): [String!]!\n  edges: [WpMediaItemEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpMediaItemFieldsEnum!, limit: Int, skip: Int): [WpMediaItemGroupConnection!]!\n  max(field: WpMediaItemFieldsEnum!): Float\n  min(field: WpMediaItemFieldsEnum!): Float\n  nodes: [WpMediaItem!]!\n  pageInfo: PageInfo!\n  sum(field: WpMediaItemFieldsEnum!): Float\n  totalCount: Int!\n}\n\n\"\"\"\nMeta connected to a MediaItem\n\"\"\"\ntype WpMediaItemMeta {\n  \"\"\"\n  Aperture measurement of the media item.\n  \"\"\"\n  aperture: Float\n\n  \"\"\"\n  Information about the camera used to create the media item.\n  \"\"\"\n  camera: String\n\n  \"\"\"\n  The text string description associated with the media item.\n  \"\"\"\n  caption: String\n\n  \"\"\"\n  Copyright information associated with the media item.\n  \"\"\"\n  copyright: String\n\n  \"\"\"\n  The date/time when the media was created.\n  \"\"\"\n  createdTimestamp: Int\n\n  \"\"\"\n  The original creator of the media item.\n  \"\"\"\n  credit: String\n\n  \"\"\"\n  The focal length value of the media item.\n  \"\"\"\n  focalLength: Float\n\n  \"\"\"\n  The ISO (International Organization for Standardization) value of the media item.\n  \"\"\"\n  iso: Int\n\n  \"\"\"\n  List of keywords used to describe or identfy the media item.\n  \"\"\"\n  keywords: [String]\n\n  \"\"\"\n  The vertical or horizontal aspect of the media item.\n  \"\"\"\n  orientation: String\n\n  \"\"\"\n  The shutter speed information of the media item.\n  \"\"\"\n  shutterSpeed: Float\n\n  \"\"\"\n  A useful title for the media item.\n  \"\"\"\n  title: String\n}\n\ninput WpMediaItemMetaFilterInput {\n  aperture: FloatQueryOperatorInput\n  camera: StringQueryOperatorInput\n  caption: StringQueryOperatorInput\n  copyright: StringQueryOperatorInput\n  createdTimestamp: IntQueryOperatorInput\n  credit: StringQueryOperatorInput\n  focalLength: FloatQueryOperatorInput\n  iso: IntQueryOperatorInput\n  keywords: StringQueryOperatorInput\n  orientation: StringQueryOperatorInput\n  shutterSpeed: FloatQueryOperatorInput\n  title: StringQueryOperatorInput\n}\n\ninput WpMediaItemSortInput {\n  fields: [WpMediaItemFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the mediaItem type and the Comment type\n\"\"\"\ntype WpMediaItemToCommentConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpComment]\n}\n\ninput WpMediaItemToCommentConnectionFilterInput {\n  nodes: WpCommentFilterListInput\n}\n\n\"\"\"\nDetails of an available size for a media item\n\"\"\"\ntype WpMediaSize {\n  \"\"\"\n  The filename of the referenced size\n  \"\"\"\n  file: String\n\n  \"\"\"\n  The filesize of the resource\n  \"\"\"\n  fileSize: Int\n\n  \"\"\"\n  The height of the referenced size\n  \"\"\"\n  height: String\n\n  \"\"\"\n  The mime type of the referenced size\n  \"\"\"\n  mimeType: String\n\n  \"\"\"\n  The referenced size name\n  \"\"\"\n  name: String\n\n  \"\"\"\n  The url of the referenced size\n  \"\"\"\n  sourceUrl: String\n\n  \"\"\"\n  The width of the referenced size\n  \"\"\"\n  width: String\n}\n\ninput WpMediaSizeFilterInput {\n  file: StringQueryOperatorInput\n  fileSize: IntQueryOperatorInput\n  height: StringQueryOperatorInput\n  mimeType: StringQueryOperatorInput\n  name: StringQueryOperatorInput\n  sourceUrl: StringQueryOperatorInput\n  width: StringQueryOperatorInput\n}\n\ninput WpMediaSizeFilterListInput {\n  elemMatch: WpMediaSizeFilterInput\n}\n\n\"\"\"\nMenus are the containers for navigation items. Menus can be assigned to menu locations, which are typically registered by the active theme.\n\"\"\"\ntype WpMenu implements Node & WpDatabaseIdentifier & WpNode {\n  children: [Node!]!\n\n  \"\"\"\n  The number of items in the menu\n  \"\"\"\n  count: Int\n\n  \"\"\"\n  The unique identifier stored in the database\n  \"\"\"\n  databaseId: Int!\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  The locations a menu is assigned to\n  \"\"\"\n  locations: [WpMenuLocationEnum]\n\n  \"\"\"\n  Connection between the Menu type and the MenuItem type\n  \"\"\"\n  menuItems: WpMenuToMenuItemConnection\n\n  \"\"\"\n  Display name of the menu. Equivalent to WP_Term-&gt;name.\n  \"\"\"\n  name: String\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  The url friendly name of the menu. Equivalent to WP_Term-&gt;slug\n  \"\"\"\n  slug: String\n}\n\ntype WpMenuConnection {\n  distinct(field: WpMenuFieldsEnum!): [String!]!\n  edges: [WpMenuEdge!]!\n  group(field: WpMenuFieldsEnum!, limit: Int, skip: Int): [WpMenuGroupConnection!]!\n  max(field: WpMenuFieldsEnum!): Float\n  min(field: WpMenuFieldsEnum!): Float\n  nodes: [WpMenu!]!\n  pageInfo: PageInfo!\n  sum(field: WpMenuFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpMenuEdge {\n  next: WpMenu\n  node: WpMenu!\n  previous: WpMenu\n}\n\nenum WpMenuFieldsEnum {\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  count\n  databaseId\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  locations\n  menuItems___nodes\n  menuItems___nodes___childItems___nodes\n  menuItems___nodes___children\n  menuItems___nodes___children___children\n  menuItems___nodes___children___id\n  menuItems___nodes___cssClasses\n  menuItems___nodes___databaseId\n  menuItems___nodes___description\n  menuItems___nodes___id\n  menuItems___nodes___internal___content\n  menuItems___nodes___internal___contentDigest\n  menuItems___nodes___internal___description\n  menuItems___nodes___internal___fieldOwners\n  menuItems___nodes___internal___ignoreType\n  menuItems___nodes___internal___mediaType\n  menuItems___nodes___internal___owner\n  menuItems___nodes___internal___type\n  menuItems___nodes___label\n  menuItems___nodes___linkRelationship\n  menuItems___nodes___locations\n  menuItems___nodes___nodeType\n  menuItems___nodes___order\n  menuItems___nodes___parentDatabaseId\n  menuItems___nodes___parentId\n  menuItems___nodes___parent___children\n  menuItems___nodes___parent___id\n  menuItems___nodes___path\n  menuItems___nodes___target\n  menuItems___nodes___title\n  menuItems___nodes___url\n  name\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  slug\n}\n\ninput WpMenuFilterInput {\n  children: NodeFilterListInput\n  count: IntQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  locations: WpMenuLocationEnumQueryOperatorInput\n  menuItems: WpMenuToMenuItemConnectionFilterInput\n  name: StringQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  slug: StringQueryOperatorInput\n}\n\ntype WpMenuGroupConnection {\n  distinct(field: WpMenuFieldsEnum!): [String!]!\n  edges: [WpMenuEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpMenuFieldsEnum!, limit: Int, skip: Int): [WpMenuGroupConnection!]!\n  max(field: WpMenuFieldsEnum!): Float\n  min(field: WpMenuFieldsEnum!): Float\n  nodes: [WpMenu!]!\n  pageInfo: PageInfo!\n  sum(field: WpMenuFieldsEnum!): Float\n  totalCount: Int!\n}\n\n\"\"\"\nNavigation menu items are the individual items assigned to a menu. These are rendered as the links in a navigation menu.\n\"\"\"\ntype WpMenuItem implements Node & WpDatabaseIdentifier & WpNode {\n  \"\"\"\n  Connection between the MenuItem type and the MenuItem type\n  \"\"\"\n  childItems: WpMenuItemToMenuItemConnection\n  children: [Node!]!\n\n  \"\"\"\n  Connection from MenuItem to it&#039;s connected node\n  \"\"\"\n  connectedNode: WpMenuItemToMenuItemLinkableConnectionEdge\n\n  \"\"\"\n  Class attribute for the menu item link\n  \"\"\"\n  cssClasses: [String]\n\n  \"\"\"\n  The unique identifier stored in the database\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  Description of the menu item.\n  \"\"\"\n  description: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Label or title of the menu item.\n  \"\"\"\n  label: String\n\n  \"\"\"\n  Link relationship (XFN) of the menu item.\n  \"\"\"\n  linkRelationship: String\n\n  \"\"\"\n  The locations the menu item&#039;s Menu is assigned to\n  \"\"\"\n  locations: [WpMenuLocationEnum]\n\n  \"\"\"\n  The Menu a MenuItem is part of\n  \"\"\"\n  menu: WpMenuItemToMenuConnectionEdge\n  nodeType: String\n\n  \"\"\"\n  Menu item order\n  \"\"\"\n  order: Int\n  parent: Node\n\n  \"\"\"\n  The database id of the parent menu item or null if it is the root\n  \"\"\"\n  parentDatabaseId: Int\n\n  \"\"\"\n  The globally unique identifier of the parent nav menu item object.\n  \"\"\"\n  parentId: ID\n\n  \"\"\"\n  Path for the resource. Relative path for internal resources. Absolute path for external resources.\n  \"\"\"\n  path: String\n\n  \"\"\"\n  Target attribute for the menu item link.\n  \"\"\"\n  target: String\n\n  \"\"\"\n  Title attribute for the menu item link\n  \"\"\"\n  title: String\n\n  \"\"\"\n  URL or destination of the menu item.\n  \"\"\"\n  url: String\n}\n\ntype WpMenuItemConnection {\n  distinct(field: WpMenuItemFieldsEnum!): [String!]!\n  edges: [WpMenuItemEdge!]!\n  group(field: WpMenuItemFieldsEnum!, limit: Int, skip: Int): [WpMenuItemGroupConnection!]!\n  max(field: WpMenuItemFieldsEnum!): Float\n  min(field: WpMenuItemFieldsEnum!): Float\n  nodes: [WpMenuItem!]!\n  pageInfo: PageInfo!\n  sum(field: WpMenuItemFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpMenuItemEdge {\n  next: WpMenuItem\n  node: WpMenuItem!\n  previous: WpMenuItem\n}\n\nenum WpMenuItemFieldsEnum {\n  childItems___nodes\n  childItems___nodes___childItems___nodes\n  childItems___nodes___children\n  childItems___nodes___children___children\n  childItems___nodes___children___id\n  childItems___nodes___cssClasses\n  childItems___nodes___databaseId\n  childItems___nodes___description\n  childItems___nodes___id\n  childItems___nodes___internal___content\n  childItems___nodes___internal___contentDigest\n  childItems___nodes___internal___description\n  childItems___nodes___internal___fieldOwners\n  childItems___nodes___internal___ignoreType\n  childItems___nodes___internal___mediaType\n  childItems___nodes___internal___owner\n  childItems___nodes___internal___type\n  childItems___nodes___label\n  childItems___nodes___linkRelationship\n  childItems___nodes___locations\n  childItems___nodes___nodeType\n  childItems___nodes___order\n  childItems___nodes___parentDatabaseId\n  childItems___nodes___parentId\n  childItems___nodes___parent___children\n  childItems___nodes___parent___id\n  childItems___nodes___path\n  childItems___nodes___target\n  childItems___nodes___title\n  childItems___nodes___url\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  connectedNode___node___databaseId\n  connectedNode___node___id\n  connectedNode___node___uri\n  cssClasses\n  databaseId\n  description\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  label\n  linkRelationship\n  locations\n  menu___node___children\n  menu___node___children___children\n  menu___node___children___id\n  menu___node___count\n  menu___node___databaseId\n  menu___node___id\n  menu___node___internal___content\n  menu___node___internal___contentDigest\n  menu___node___internal___description\n  menu___node___internal___fieldOwners\n  menu___node___internal___ignoreType\n  menu___node___internal___mediaType\n  menu___node___internal___owner\n  menu___node___internal___type\n  menu___node___locations\n  menu___node___menuItems___nodes\n  menu___node___name\n  menu___node___nodeType\n  menu___node___parent___children\n  menu___node___parent___id\n  menu___node___slug\n  nodeType\n  order\n  parentDatabaseId\n  parentId\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  path\n  target\n  title\n  url\n}\n\ninput WpMenuItemFilterInput {\n  childItems: WpMenuItemToMenuItemConnectionFilterInput\n  children: NodeFilterListInput\n  connectedNode: WpMenuItemToMenuItemLinkableConnectionEdgeFilterInput\n  cssClasses: StringQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  description: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  label: StringQueryOperatorInput\n  linkRelationship: StringQueryOperatorInput\n  locations: WpMenuLocationEnumQueryOperatorInput\n  menu: WpMenuItemToMenuConnectionEdgeFilterInput\n  nodeType: StringQueryOperatorInput\n  order: IntQueryOperatorInput\n  parent: NodeFilterInput\n  parentDatabaseId: IntQueryOperatorInput\n  parentId: IDQueryOperatorInput\n  path: StringQueryOperatorInput\n  target: StringQueryOperatorInput\n  title: StringQueryOperatorInput\n  url: StringQueryOperatorInput\n}\n\ninput WpMenuItemFilterListInput {\n  elemMatch: WpMenuItemFilterInput\n}\n\ntype WpMenuItemGroupConnection {\n  distinct(field: WpMenuItemFieldsEnum!): [String!]!\n  edges: [WpMenuItemEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpMenuItemFieldsEnum!, limit: Int, skip: Int): [WpMenuItemGroupConnection!]!\n  max(field: WpMenuItemFieldsEnum!): Float\n  min(field: WpMenuItemFieldsEnum!): Float\n  nodes: [WpMenuItem!]!\n  pageInfo: PageInfo!\n  sum(field: WpMenuItemFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninterface WpMenuItemLinkable {\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  id: ID!\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n}\n\ninput WpMenuItemLinkableFilterInput {\n  databaseId: IntQueryOperatorInput\n  id: IDQueryOperatorInput\n  uri: StringQueryOperatorInput\n}\n\ninput WpMenuItemSortInput {\n  fields: [WpMenuItemFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the MenuItem type and the Menu type\n\"\"\"\ntype WpMenuItemToMenuConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpMenu\n}\n\ninput WpMenuItemToMenuConnectionEdgeFilterInput {\n  node: WpMenuFilterInput\n}\n\n\"\"\"\nConnection between the MenuItem type and the MenuItem type\n\"\"\"\ntype WpMenuItemToMenuItemConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpMenuItem]\n}\n\ninput WpMenuItemToMenuItemConnectionFilterInput {\n  nodes: WpMenuItemFilterListInput\n}\n\n\"\"\"\nConnection between the MenuItem type and the MenuItemLinkable type\n\"\"\"\ntype WpMenuItemToMenuItemLinkableConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpMenuItemLinkable\n}\n\ninput WpMenuItemToMenuItemLinkableConnectionEdgeFilterInput {\n  node: WpMenuItemLinkableFilterInput\n}\n\n\"\"\"\nRegistered menu locations\n\"\"\"\nenum WpMenuLocationEnum {\n  EMPTY\n}\n\ninput WpMenuLocationEnumQueryOperatorInput {\n  eq: WpMenuLocationEnum\n  in: [WpMenuLocationEnum]\n  ne: WpMenuLocationEnum\n  nin: [WpMenuLocationEnum]\n}\n\ninput WpMenuSortInput {\n  fields: [WpMenuFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the Menu type and the MenuItem type\n\"\"\"\ntype WpMenuToMenuItemConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpMenuItem]\n}\n\ninput WpMenuToMenuItemConnectionFilterInput {\n  nodes: WpMenuItemFilterListInput\n}\n\ninterface WpNode {\n  \"\"\"\n  The globally unique ID for the object\n  \"\"\"\n  id: ID!\n}\n\ninput WpNodeFilterInput {\n  id: IDQueryOperatorInput\n}\n\ninterface WpNodeWithAuthor {\n  \"\"\"\n  Connection between the NodeWithAuthor type and the User type\n  \"\"\"\n  author: WpNodeWithAuthorToUserConnectionEdge\n\n  \"\"\"\n  The database identifier of the author of the node\n  \"\"\"\n  authorDatabaseId: Int\n\n  \"\"\"\n  The globally unique identifier of the author of the node\n  \"\"\"\n  authorId: ID\n}\n\n\"\"\"\nConnection between the NodeWithAuthor type and the User type\n\"\"\"\ntype WpNodeWithAuthorToUserConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpUser\n}\n\ninput WpNodeWithAuthorToUserConnectionEdgeFilterInput {\n  node: WpUserFilterInput\n}\n\ninterface WpNodeWithComments {\n  \"\"\"\n  The number of comments. Even though WPGraphQL denotes this field as an integer, in WordPress this field should be saved as a numeric string for compatibility.\n  \"\"\"\n  commentCount: Int\n\n  \"\"\"\n  Whether the comments are open or closed for this particular post.\n  \"\"\"\n  commentStatus: String\n}\n\ninterface WpNodeWithContentEditor {\n  \"\"\"\n  The content of the post.\n  \"\"\"\n  content: String\n}\n\ninterface WpNodeWithExcerpt {\n  \"\"\"\n  The excerpt of the post.\n  \"\"\"\n  excerpt: String\n}\n\ninterface WpNodeWithFeaturedImage {\n  \"\"\"\n  Connection between the ContentNode type and the ContentType type\n  \"\"\"\n  contentType: WpContentNodeToContentTypeConnectionEdge\n\n  \"\"\"\n  The name of the Content Type the node belongs to\n  \"\"\"\n  contentTypeName: String!\n\n  \"\"\"\n  The unique identifier stored in the database\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  Post publishing date.\n  \"\"\"\n  date: Date\n\n  \"\"\"\n  The publishing date set in GMT.\n  \"\"\"\n  dateGmt: Date\n\n  \"\"\"\n  The desired slug of the post\n  \"\"\"\n  desiredSlug: String\n\n  \"\"\"\n  The RSS enclosure for the object\n  \"\"\"\n  enclosure: String\n\n  \"\"\"\n  Connection between the NodeWithFeaturedImage type and the MediaItem type\n  \"\"\"\n  featuredImage: WpNodeWithFeaturedImageToMediaItemConnectionEdge\n\n  \"\"\"\n  The database identifier for the featured image node assigned to the content node\n  \"\"\"\n  featuredImageDatabaseId: Int\n\n  \"\"\"\n  Globally unique ID of the featured image assigned to the node\n  \"\"\"\n  featuredImageId: ID\n\n  \"\"\"\n  The global unique identifier for this post. This currently matches the value stored in WP_Post-&gt;guid and the guid column in the &quot;post_objects&quot; database table.\n  \"\"\"\n  guid: String\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  id: ID!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  The user that most recently edited the node\n  \"\"\"\n  lastEditedBy: WpContentNodeToEditLastConnectionEdge\n\n  \"\"\"\n  The permalink of the post\n  \"\"\"\n  link: String\n\n  \"\"\"\n  The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time.\n  \"\"\"\n  modified: Date\n\n  \"\"\"\n  The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT.\n  \"\"\"\n  modifiedGmt: Date\n\n  \"\"\"\n  The uri slug for the post. This is equivalent to the WP_Post-&gt;post_name field and the post_name column in the database for the &quot;post_objects&quot; table.\n  \"\"\"\n  slug: String\n\n  \"\"\"\n  The current status of the object\n  \"\"\"\n  status: String\n\n  \"\"\"\n  The template assigned to a node of content\n  \"\"\"\n  template: WpContentTemplate\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n}\n\n\"\"\"\nConnection between the NodeWithFeaturedImage type and the MediaItem type\n\"\"\"\ntype WpNodeWithFeaturedImageToMediaItemConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpMediaItem\n}\n\ninput WpNodeWithFeaturedImageToMediaItemConnectionEdgeFilterInput {\n  node: WpMediaItemFilterInput\n}\n\ninterface WpNodeWithPageAttributes {\n  \"\"\"\n  A field used for ordering posts. This is typically used with nav menu items or for special ordering of hierarchical content types.\n  \"\"\"\n  menuOrder: Int\n}\n\ninterface WpNodeWithRevisions {\n  \"\"\"\n  True if the node is a revision of another node\n  \"\"\"\n  isRevision: Boolean\n}\n\n\"\"\"\nConnection between the NodeWithRevisions type and the ContentNode type\n\"\"\"\ntype WpNodeWithRevisionsToContentNodeConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpContentNode\n}\n\ninterface WpNodeWithTemplate {\n  \"\"\"\n  The template assigned to the node\n  \"\"\"\n  template: WpContentTemplate\n}\n\ninterface WpNodeWithTitle {\n  \"\"\"\n  The title of the post. This is currently just the raw title. An amendment to support rendered title needs to be made.\n  \"\"\"\n  title: String\n}\n\ninterface WpNodeWithTrackbacks {\n  \"\"\"\n  Whether the pings are open or closed for this particular post.\n  \"\"\"\n  pingStatus: String\n\n  \"\"\"\n  URLs that have been pinged.\n  \"\"\"\n  pinged: [String]\n\n  \"\"\"\n  URLs queued to be pinged.\n  \"\"\"\n  toPing: [String]\n}\n\n\"\"\"\nThe page type\n\"\"\"\ntype WpPage implements Node & WpBlockEditorContentNode & WpContentNode & WpDatabaseIdentifier & WpHierarchicalContentNode & WpMenuItemLinkable & WpNode & WpNodeWithAuthor & WpNodeWithComments & WpNodeWithContentEditor & WpNodeWithFeaturedImage & WpNodeWithPageAttributes & WpNodeWithRevisions & WpNodeWithTemplate & WpNodeWithTitle & WpUniformResourceIdentifiable {\n  \"\"\"\n  Returns ancestors of the node. Default ordered as lowest (closest to the child) to highest (closest to the root).\n  \"\"\"\n  ancestors: WpHierarchicalContentNodeToContentNodeAncestorsConnection\n\n  \"\"\"\n  Connection between the NodeWithAuthor type and the User type\n  \"\"\"\n  author: WpNodeWithAuthorToUserConnectionEdge\n\n  \"\"\"\n  The database identifier of the author of the node\n  \"\"\"\n  authorDatabaseId: Int\n\n  \"\"\"\n  The globally unique identifier of the author of the node\n  \"\"\"\n  authorId: ID\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  blocks: [WpBlock!]\n\n  \"\"\"\n  Gutenberg blocks as json string\n  \"\"\"\n  blocksJSON: String\n  children: [Node!]!\n\n  \"\"\"\n  The number of comments. Even though WPGraphQL denotes this field as an integer, in WordPress this field should be saved as a numeric string for compatibility.\n  \"\"\"\n  commentCount: Int\n\n  \"\"\"\n  Whether the comments are open or closed for this particular post.\n  \"\"\"\n  commentStatus: String\n\n  \"\"\"\n  Connection between the page type and the Comment type\n  \"\"\"\n  comments: WpPageToCommentConnection\n\n  \"\"\"\n  The content of the post.\n  \"\"\"\n  content: String\n\n  \"\"\"\n  Connection between the ContentNode type and the ContentType type\n  \"\"\"\n  contentType: WpContentNodeToContentTypeConnectionEdge\n\n  \"\"\"\n  The name of the Content Type the node belongs to\n  \"\"\"\n  contentTypeName: String!\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  Post publishing date.\n  \"\"\"\n  date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The publishing date set in GMT.\n  \"\"\"\n  dateGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The desired slug of the post\n  \"\"\"\n  desiredSlug: String\n\n  \"\"\"\n  The RSS enclosure for the object\n  \"\"\"\n  enclosure: String\n\n  \"\"\"\n  Connection between the NodeWithFeaturedImage type and the MediaItem type\n  \"\"\"\n  featuredImage: WpNodeWithFeaturedImageToMediaItemConnectionEdge\n\n  \"\"\"\n  The database identifier for the featured image node assigned to the content node\n  \"\"\"\n  featuredImageDatabaseId: Int\n\n  \"\"\"\n  Globally unique ID of the featured image assigned to the node\n  \"\"\"\n  featuredImageId: ID\n\n  \"\"\"\n  The global unique identifier for this post. This currently matches the value stored in WP_Post-&gt;guid and the guid column in the &quot;post_objects&quot; database table.\n  \"\"\"\n  guid: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  Whether this page is set to the static front page.\n  \"\"\"\n  isFrontPage: Boolean!\n\n  \"\"\"\n  Whether this page is set to the blog posts page.\n  \"\"\"\n  isPostsPage: Boolean!\n\n  \"\"\"\n  Whether this page is set to the privacy page.\n  \"\"\"\n  isPrivacyPage: Boolean!\n\n  \"\"\"\n  True if the node is a revision of another node\n  \"\"\"\n  isRevision: Boolean\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  The user that most recently edited the node\n  \"\"\"\n  lastEditedBy: WpContentNodeToEditLastConnectionEdge\n\n  \"\"\"\n  The permalink of the post\n  \"\"\"\n  link: String\n\n  \"\"\"\n  A field used for ordering posts. This is typically used with nav menu items or for special ordering of hierarchical content types.\n  \"\"\"\n  menuOrder: Int\n\n  \"\"\"\n  The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time.\n  \"\"\"\n  modified(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT.\n  \"\"\"\n  modifiedGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  Database id of the parent node\n  \"\"\"\n  parentDatabaseId: Int\n\n  \"\"\"\n  The globally unique identifier of the parent node.\n  \"\"\"\n  parentId: ID\n\n  \"\"\"\n  Previewed gutenberg blocks\n  \"\"\"\n  previewBlocks: [WpBlock!]\n\n  \"\"\"\n  Previewed Gutenberg blocks as json string\n  \"\"\"\n  previewBlocksJSON: String\n\n  \"\"\"\n  The uri slug for the post. This is equivalent to the WP_Post-&gt;post_name field and the post_name column in the database for the &quot;post_objects&quot; table.\n  \"\"\"\n  slug: String\n\n  \"\"\"\n  The current status of the object\n  \"\"\"\n  status: String\n\n  \"\"\"\n  The template assigned to a node of content\n  \"\"\"\n  template: WpContentTemplate\n\n  \"\"\"\n  The title of the post. This is currently just the raw title. An amendment to support rendered title needs to be made.\n  \"\"\"\n  title: String\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n\n  \"\"\"\n  Connection between the HierarchicalContentNode type and the ContentNode type\n  \"\"\"\n  wpChildren: WpHierarchicalContentNodeToContentNodeChildrenConnection\n\n  \"\"\"\n  The parent of the node. The parent object can be of various types\n  \"\"\"\n  wpParent: WpHierarchicalContentNodeToParentContentNodeConnectionEdge\n}\n\ntype WpPageConnection {\n  distinct(field: WpPageFieldsEnum!): [String!]!\n  edges: [WpPageEdge!]!\n  group(field: WpPageFieldsEnum!, limit: Int, skip: Int): [WpPageGroupConnection!]!\n  max(field: WpPageFieldsEnum!): Float\n  min(field: WpPageFieldsEnum!): Float\n  nodes: [WpPage!]!\n  pageInfo: PageInfo!\n  sum(field: WpPageFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpPageEdge {\n  next: WpPage\n  node: WpPage!\n  previous: WpPage\n}\n\nenum WpPageFieldsEnum {\n  ancestors___nodes\n  ancestors___nodes___children\n  ancestors___nodes___children___children\n  ancestors___nodes___children___id\n  ancestors___nodes___contentTypeName\n  ancestors___nodes___databaseId\n  ancestors___nodes___date\n  ancestors___nodes___dateGmt\n  ancestors___nodes___desiredSlug\n  ancestors___nodes___enclosure\n  ancestors___nodes___guid\n  ancestors___nodes___id\n  ancestors___nodes___internal___content\n  ancestors___nodes___internal___contentDigest\n  ancestors___nodes___internal___description\n  ancestors___nodes___internal___fieldOwners\n  ancestors___nodes___internal___ignoreType\n  ancestors___nodes___internal___mediaType\n  ancestors___nodes___internal___owner\n  ancestors___nodes___internal___type\n  ancestors___nodes___isContentNode\n  ancestors___nodes___isTermNode\n  ancestors___nodes___link\n  ancestors___nodes___modified\n  ancestors___nodes___modifiedGmt\n  ancestors___nodes___nodeType\n  ancestors___nodes___parent___children\n  ancestors___nodes___parent___id\n  ancestors___nodes___slug\n  ancestors___nodes___status\n  ancestors___nodes___template___templateName\n  ancestors___nodes___uri\n  authorDatabaseId\n  authorId\n  author___node___avatar___default\n  author___node___avatar___extraAttr\n  author___node___avatar___forceDefault\n  author___node___avatar___foundAvatar\n  author___node___avatar___height\n  author___node___avatar___rating\n  author___node___avatar___scheme\n  author___node___avatar___size\n  author___node___avatar___url\n  author___node___avatar___width\n  author___node___blockEditorPreviews___nodes\n  author___node___capKey\n  author___node___capabilities\n  author___node___children\n  author___node___children___children\n  author___node___children___id\n  author___node___comments___nodes\n  author___node___databaseId\n  author___node___description\n  author___node___email\n  author___node___extraCapabilities\n  author___node___firstName\n  author___node___id\n  author___node___internal___content\n  author___node___internal___contentDigest\n  author___node___internal___description\n  author___node___internal___fieldOwners\n  author___node___internal___ignoreType\n  author___node___internal___mediaType\n  author___node___internal___owner\n  author___node___internal___type\n  author___node___isContentNode\n  author___node___isTermNode\n  author___node___lastName\n  author___node___locale\n  author___node___name\n  author___node___nicename\n  author___node___nickname\n  author___node___nodeType\n  author___node___pages___nodes\n  author___node___parent___children\n  author___node___parent___id\n  author___node___posts___nodes\n  author___node___registeredDate\n  author___node___roles___nodes\n  author___node___slug\n  author___node___uri\n  author___node___url\n  author___node___username\n  blocks\n  blocksJSON\n  blocks___attributesJSON\n  blocks___dynamicContent\n  blocks___innerBlocks\n  blocks___innerBlocks___attributesJSON\n  blocks___innerBlocks___dynamicContent\n  blocks___innerBlocks___innerBlocks\n  blocks___innerBlocks___innerBlocks___attributesJSON\n  blocks___innerBlocks___innerBlocks___dynamicContent\n  blocks___innerBlocks___innerBlocks___innerBlocks\n  blocks___innerBlocks___innerBlocks___isDynamic\n  blocks___innerBlocks___innerBlocks___name\n  blocks___innerBlocks___innerBlocks___order\n  blocks___innerBlocks___innerBlocks___originalContent\n  blocks___innerBlocks___innerBlocks___parentNodeDatabaseId\n  blocks___innerBlocks___innerBlocks___saveContent\n  blocks___innerBlocks___isDynamic\n  blocks___innerBlocks___name\n  blocks___innerBlocks___order\n  blocks___innerBlocks___originalContent\n  blocks___innerBlocks___parentNodeDatabaseId\n  blocks___innerBlocks___parentNode___id\n  blocks___innerBlocks___saveContent\n  blocks___isDynamic\n  blocks___name\n  blocks___order\n  blocks___originalContent\n  blocks___parentNodeDatabaseId\n  blocks___parentNode___id\n  blocks___saveContent\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  commentCount\n  commentStatus\n  comments___nodes\n  comments___nodes___agent\n  comments___nodes___approved\n  comments___nodes___authorIp\n  comments___nodes___children\n  comments___nodes___children___children\n  comments___nodes___children___id\n  comments___nodes___content\n  comments___nodes___databaseId\n  comments___nodes___date\n  comments___nodes___dateGmt\n  comments___nodes___id\n  comments___nodes___internal___content\n  comments___nodes___internal___contentDigest\n  comments___nodes___internal___description\n  comments___nodes___internal___fieldOwners\n  comments___nodes___internal___ignoreType\n  comments___nodes___internal___mediaType\n  comments___nodes___internal___owner\n  comments___nodes___internal___type\n  comments___nodes___karma\n  comments___nodes___nodeType\n  comments___nodes___parentDatabaseId\n  comments___nodes___parentId\n  comments___nodes___parent___children\n  comments___nodes___parent___id\n  comments___nodes___replies___nodes\n  comments___nodes___type\n  content\n  contentTypeName\n  contentType___node___archivePath\n  contentType___node___canExport\n  contentType___node___children\n  contentType___node___children___children\n  contentType___node___children___id\n  contentType___node___connectedTaxonomies___nodes\n  contentType___node___contentNodes___nodes\n  contentType___node___deleteWithUser\n  contentType___node___description\n  contentType___node___excludeFromSearch\n  contentType___node___graphqlPluralName\n  contentType___node___graphqlSingleName\n  contentType___node___hasArchive\n  contentType___node___hierarchical\n  contentType___node___id\n  contentType___node___internal___content\n  contentType___node___internal___contentDigest\n  contentType___node___internal___description\n  contentType___node___internal___fieldOwners\n  contentType___node___internal___ignoreType\n  contentType___node___internal___mediaType\n  contentType___node___internal___owner\n  contentType___node___internal___type\n  contentType___node___isContentNode\n  contentType___node___isFrontPage\n  contentType___node___isPostsPage\n  contentType___node___isTermNode\n  contentType___node___label\n  contentType___node___labels___addNew\n  contentType___node___labels___addNewItem\n  contentType___node___labels___allItems\n  contentType___node___labels___archives\n  contentType___node___labels___attributes\n  contentType___node___labels___editItem\n  contentType___node___labels___featuredImage\n  contentType___node___labels___filterItemsList\n  contentType___node___labels___insertIntoItem\n  contentType___node___labels___itemsList\n  contentType___node___labels___itemsListNavigation\n  contentType___node___labels___menuName\n  contentType___node___labels___name\n  contentType___node___labels___newItem\n  contentType___node___labels___notFound\n  contentType___node___labels___notFoundInTrash\n  contentType___node___labels___parentItemColon\n  contentType___node___labels___removeFeaturedImage\n  contentType___node___labels___searchItems\n  contentType___node___labels___setFeaturedImage\n  contentType___node___labels___singularName\n  contentType___node___labels___uploadedToThisItem\n  contentType___node___labels___useFeaturedImage\n  contentType___node___labels___viewItem\n  contentType___node___labels___viewItems\n  contentType___node___menuIcon\n  contentType___node___menuPosition\n  contentType___node___name\n  contentType___node___nodeType\n  contentType___node___parent___children\n  contentType___node___parent___id\n  contentType___node___public\n  contentType___node___publiclyQueryable\n  contentType___node___restBase\n  contentType___node___restControllerClass\n  contentType___node___showInAdminBar\n  contentType___node___showInGraphql\n  contentType___node___showInMenu\n  contentType___node___showInNavMenus\n  contentType___node___showInRest\n  contentType___node___showUi\n  contentType___node___uri\n  databaseId\n  date\n  dateGmt\n  desiredSlug\n  enclosure\n  featuredImageDatabaseId\n  featuredImageId\n  featuredImage___node___altText\n  featuredImage___node___ancestors___nodes\n  featuredImage___node___authorDatabaseId\n  featuredImage___node___authorId\n  featuredImage___node___caption\n  featuredImage___node___children\n  featuredImage___node___children___children\n  featuredImage___node___children___id\n  featuredImage___node___commentCount\n  featuredImage___node___commentStatus\n  featuredImage___node___comments___nodes\n  featuredImage___node___contentTypeName\n  featuredImage___node___databaseId\n  featuredImage___node___date\n  featuredImage___node___dateGmt\n  featuredImage___node___description\n  featuredImage___node___desiredSlug\n  featuredImage___node___enclosure\n  featuredImage___node___fileSize\n  featuredImage___node___filename\n  featuredImage___node___filesize\n  featuredImage___node___gatsbyImage\n  featuredImage___node___guid\n  featuredImage___node___height\n  featuredImage___node___id\n  featuredImage___node___internal___content\n  featuredImage___node___internal___contentDigest\n  featuredImage___node___internal___description\n  featuredImage___node___internal___fieldOwners\n  featuredImage___node___internal___ignoreType\n  featuredImage___node___internal___mediaType\n  featuredImage___node___internal___owner\n  featuredImage___node___internal___type\n  featuredImage___node___isContentNode\n  featuredImage___node___isTermNode\n  featuredImage___node___link\n  featuredImage___node___localFile___absolutePath\n  featuredImage___node___localFile___accessTime\n  featuredImage___node___localFile___atime\n  featuredImage___node___localFile___atimeMs\n  featuredImage___node___localFile___base\n  featuredImage___node___localFile___birthTime\n  featuredImage___node___localFile___birthtime\n  featuredImage___node___localFile___birthtimeMs\n  featuredImage___node___localFile___blksize\n  featuredImage___node___localFile___blocks\n  featuredImage___node___localFile___changeTime\n  featuredImage___node___localFile___children\n  featuredImage___node___localFile___childrenImageSharp\n  featuredImage___node___localFile___ctime\n  featuredImage___node___localFile___ctimeMs\n  featuredImage___node___localFile___dev\n  featuredImage___node___localFile___dir\n  featuredImage___node___localFile___ext\n  featuredImage___node___localFile___extension\n  featuredImage___node___localFile___gid\n  featuredImage___node___localFile___hash\n  featuredImage___node___localFile___id\n  featuredImage___node___localFile___ino\n  featuredImage___node___localFile___mode\n  featuredImage___node___localFile___modifiedTime\n  featuredImage___node___localFile___mtime\n  featuredImage___node___localFile___mtimeMs\n  featuredImage___node___localFile___name\n  featuredImage___node___localFile___nlink\n  featuredImage___node___localFile___prettySize\n  featuredImage___node___localFile___publicURL\n  featuredImage___node___localFile___rdev\n  featuredImage___node___localFile___relativeDirectory\n  featuredImage___node___localFile___relativePath\n  featuredImage___node___localFile___root\n  featuredImage___node___localFile___size\n  featuredImage___node___localFile___sourceInstanceName\n  featuredImage___node___localFile___uid\n  featuredImage___node___mediaDetails___file\n  featuredImage___node___mediaDetails___height\n  featuredImage___node___mediaDetails___sizes\n  featuredImage___node___mediaDetails___width\n  featuredImage___node___mediaItemUrl\n  featuredImage___node___mediaType\n  featuredImage___node___mimeType\n  featuredImage___node___modified\n  featuredImage___node___modifiedGmt\n  featuredImage___node___nodeType\n  featuredImage___node___parentDatabaseId\n  featuredImage___node___parentId\n  featuredImage___node___parent___children\n  featuredImage___node___parent___id\n  featuredImage___node___publicUrl\n  featuredImage___node___remoteFile___absolutePath\n  featuredImage___node___remoteFile___accessTime\n  featuredImage___node___remoteFile___atime\n  featuredImage___node___remoteFile___atimeMs\n  featuredImage___node___remoteFile___base\n  featuredImage___node___remoteFile___birthTime\n  featuredImage___node___remoteFile___birthtime\n  featuredImage___node___remoteFile___birthtimeMs\n  featuredImage___node___remoteFile___blksize\n  featuredImage___node___remoteFile___blocks\n  featuredImage___node___remoteFile___changeTime\n  featuredImage___node___remoteFile___children\n  featuredImage___node___remoteFile___childrenImageSharp\n  featuredImage___node___remoteFile___ctime\n  featuredImage___node___remoteFile___ctimeMs\n  featuredImage___node___remoteFile___dev\n  featuredImage___node___remoteFile___dir\n  featuredImage___node___remoteFile___ext\n  featuredImage___node___remoteFile___extension\n  featuredImage___node___remoteFile___gid\n  featuredImage___node___remoteFile___hash\n  featuredImage___node___remoteFile___id\n  featuredImage___node___remoteFile___ino\n  featuredImage___node___remoteFile___mode\n  featuredImage___node___remoteFile___modifiedTime\n  featuredImage___node___remoteFile___mtime\n  featuredImage___node___remoteFile___mtimeMs\n  featuredImage___node___remoteFile___name\n  featuredImage___node___remoteFile___nlink\n  featuredImage___node___remoteFile___prettySize\n  featuredImage___node___remoteFile___publicURL\n  featuredImage___node___remoteFile___rdev\n  featuredImage___node___remoteFile___relativeDirectory\n  featuredImage___node___remoteFile___relativePath\n  featuredImage___node___remoteFile___root\n  featuredImage___node___remoteFile___size\n  featuredImage___node___remoteFile___sourceInstanceName\n  featuredImage___node___remoteFile___uid\n  featuredImage___node___resize___height\n  featuredImage___node___resize___src\n  featuredImage___node___resize___width\n  featuredImage___node___sizes\n  featuredImage___node___slug\n  featuredImage___node___sourceUrl\n  featuredImage___node___srcSet\n  featuredImage___node___status\n  featuredImage___node___template___templateName\n  featuredImage___node___title\n  featuredImage___node___uri\n  featuredImage___node___width\n  featuredImage___node___wpChildren___nodes\n  guid\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  isContentNode\n  isFrontPage\n  isPostsPage\n  isPrivacyPage\n  isRevision\n  isTermNode\n  lastEditedBy___node___avatar___default\n  lastEditedBy___node___avatar___extraAttr\n  lastEditedBy___node___avatar___forceDefault\n  lastEditedBy___node___avatar___foundAvatar\n  lastEditedBy___node___avatar___height\n  lastEditedBy___node___avatar___rating\n  lastEditedBy___node___avatar___scheme\n  lastEditedBy___node___avatar___size\n  lastEditedBy___node___avatar___url\n  lastEditedBy___node___avatar___width\n  lastEditedBy___node___blockEditorPreviews___nodes\n  lastEditedBy___node___capKey\n  lastEditedBy___node___capabilities\n  lastEditedBy___node___children\n  lastEditedBy___node___children___children\n  lastEditedBy___node___children___id\n  lastEditedBy___node___comments___nodes\n  lastEditedBy___node___databaseId\n  lastEditedBy___node___description\n  lastEditedBy___node___email\n  lastEditedBy___node___extraCapabilities\n  lastEditedBy___node___firstName\n  lastEditedBy___node___id\n  lastEditedBy___node___internal___content\n  lastEditedBy___node___internal___contentDigest\n  lastEditedBy___node___internal___description\n  lastEditedBy___node___internal___fieldOwners\n  lastEditedBy___node___internal___ignoreType\n  lastEditedBy___node___internal___mediaType\n  lastEditedBy___node___internal___owner\n  lastEditedBy___node___internal___type\n  lastEditedBy___node___isContentNode\n  lastEditedBy___node___isTermNode\n  lastEditedBy___node___lastName\n  lastEditedBy___node___locale\n  lastEditedBy___node___name\n  lastEditedBy___node___nicename\n  lastEditedBy___node___nickname\n  lastEditedBy___node___nodeType\n  lastEditedBy___node___pages___nodes\n  lastEditedBy___node___parent___children\n  lastEditedBy___node___parent___id\n  lastEditedBy___node___posts___nodes\n  lastEditedBy___node___registeredDate\n  lastEditedBy___node___roles___nodes\n  lastEditedBy___node___slug\n  lastEditedBy___node___uri\n  lastEditedBy___node___url\n  lastEditedBy___node___username\n  link\n  menuOrder\n  modified\n  modifiedGmt\n  nodeType\n  parentDatabaseId\n  parentId\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  previewBlocks\n  previewBlocksJSON\n  previewBlocks___attributesJSON\n  previewBlocks___dynamicContent\n  previewBlocks___innerBlocks\n  previewBlocks___innerBlocks___attributesJSON\n  previewBlocks___innerBlocks___dynamicContent\n  previewBlocks___innerBlocks___innerBlocks\n  previewBlocks___innerBlocks___innerBlocks___attributesJSON\n  previewBlocks___innerBlocks___innerBlocks___dynamicContent\n  previewBlocks___innerBlocks___innerBlocks___innerBlocks\n  previewBlocks___innerBlocks___innerBlocks___isDynamic\n  previewBlocks___innerBlocks___innerBlocks___name\n  previewBlocks___innerBlocks___innerBlocks___order\n  previewBlocks___innerBlocks___innerBlocks___originalContent\n  previewBlocks___innerBlocks___innerBlocks___parentNodeDatabaseId\n  previewBlocks___innerBlocks___innerBlocks___saveContent\n  previewBlocks___innerBlocks___isDynamic\n  previewBlocks___innerBlocks___name\n  previewBlocks___innerBlocks___order\n  previewBlocks___innerBlocks___originalContent\n  previewBlocks___innerBlocks___parentNodeDatabaseId\n  previewBlocks___innerBlocks___parentNode___id\n  previewBlocks___innerBlocks___saveContent\n  previewBlocks___isDynamic\n  previewBlocks___name\n  previewBlocks___order\n  previewBlocks___originalContent\n  previewBlocks___parentNodeDatabaseId\n  previewBlocks___parentNode___id\n  previewBlocks___saveContent\n  slug\n  status\n  template___templateName\n  title\n  uri\n  wpChildren___nodes\n  wpChildren___nodes___children\n  wpChildren___nodes___children___children\n  wpChildren___nodes___children___id\n  wpChildren___nodes___contentTypeName\n  wpChildren___nodes___databaseId\n  wpChildren___nodes___date\n  wpChildren___nodes___dateGmt\n  wpChildren___nodes___desiredSlug\n  wpChildren___nodes___enclosure\n  wpChildren___nodes___guid\n  wpChildren___nodes___id\n  wpChildren___nodes___internal___content\n  wpChildren___nodes___internal___contentDigest\n  wpChildren___nodes___internal___description\n  wpChildren___nodes___internal___fieldOwners\n  wpChildren___nodes___internal___ignoreType\n  wpChildren___nodes___internal___mediaType\n  wpChildren___nodes___internal___owner\n  wpChildren___nodes___internal___type\n  wpChildren___nodes___isContentNode\n  wpChildren___nodes___isTermNode\n  wpChildren___nodes___link\n  wpChildren___nodes___modified\n  wpChildren___nodes___modifiedGmt\n  wpChildren___nodes___nodeType\n  wpChildren___nodes___parent___children\n  wpChildren___nodes___parent___id\n  wpChildren___nodes___slug\n  wpChildren___nodes___status\n  wpChildren___nodes___template___templateName\n  wpChildren___nodes___uri\n  wpParent___node___children\n  wpParent___node___children___children\n  wpParent___node___children___id\n  wpParent___node___contentTypeName\n  wpParent___node___databaseId\n  wpParent___node___date\n  wpParent___node___dateGmt\n  wpParent___node___desiredSlug\n  wpParent___node___enclosure\n  wpParent___node___guid\n  wpParent___node___id\n  wpParent___node___internal___content\n  wpParent___node___internal___contentDigest\n  wpParent___node___internal___description\n  wpParent___node___internal___fieldOwners\n  wpParent___node___internal___ignoreType\n  wpParent___node___internal___mediaType\n  wpParent___node___internal___owner\n  wpParent___node___internal___type\n  wpParent___node___isContentNode\n  wpParent___node___isTermNode\n  wpParent___node___link\n  wpParent___node___modified\n  wpParent___node___modifiedGmt\n  wpParent___node___nodeType\n  wpParent___node___parent___children\n  wpParent___node___parent___id\n  wpParent___node___slug\n  wpParent___node___status\n  wpParent___node___template___templateName\n  wpParent___node___uri\n}\n\ninput WpPageFilterInput {\n  ancestors: WpHierarchicalContentNodeToContentNodeAncestorsConnectionFilterInput\n  author: WpNodeWithAuthorToUserConnectionEdgeFilterInput\n  authorDatabaseId: IntQueryOperatorInput\n  authorId: IDQueryOperatorInput\n  blocks: WpBlockFilterListInput\n  blocksJSON: StringQueryOperatorInput\n  children: NodeFilterListInput\n  commentCount: IntQueryOperatorInput\n  commentStatus: StringQueryOperatorInput\n  comments: WpPageToCommentConnectionFilterInput\n  content: StringQueryOperatorInput\n  contentType: WpContentNodeToContentTypeConnectionEdgeFilterInput\n  contentTypeName: StringQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  date: DateQueryOperatorInput\n  dateGmt: DateQueryOperatorInput\n  desiredSlug: StringQueryOperatorInput\n  enclosure: StringQueryOperatorInput\n  featuredImage: WpNodeWithFeaturedImageToMediaItemConnectionEdgeFilterInput\n  featuredImageDatabaseId: IntQueryOperatorInput\n  featuredImageId: IDQueryOperatorInput\n  guid: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  isContentNode: BooleanQueryOperatorInput\n  isFrontPage: BooleanQueryOperatorInput\n  isPostsPage: BooleanQueryOperatorInput\n  isPrivacyPage: BooleanQueryOperatorInput\n  isRevision: BooleanQueryOperatorInput\n  isTermNode: BooleanQueryOperatorInput\n  lastEditedBy: WpContentNodeToEditLastConnectionEdgeFilterInput\n  link: StringQueryOperatorInput\n  menuOrder: IntQueryOperatorInput\n  modified: DateQueryOperatorInput\n  modifiedGmt: DateQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  parentDatabaseId: IntQueryOperatorInput\n  parentId: IDQueryOperatorInput\n  previewBlocks: WpBlockFilterListInput\n  previewBlocksJSON: StringQueryOperatorInput\n  slug: StringQueryOperatorInput\n  status: StringQueryOperatorInput\n  template: WpContentTemplateFilterInput\n  title: StringQueryOperatorInput\n  uri: StringQueryOperatorInput\n  wpChildren: WpHierarchicalContentNodeToContentNodeChildrenConnectionFilterInput\n  wpParent: WpHierarchicalContentNodeToParentContentNodeConnectionEdgeFilterInput\n}\n\ninput WpPageFilterListInput {\n  elemMatch: WpPageFilterInput\n}\n\ntype WpPageGroupConnection {\n  distinct(field: WpPageFieldsEnum!): [String!]!\n  edges: [WpPageEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpPageFieldsEnum!, limit: Int, skip: Int): [WpPageGroupConnection!]!\n  max(field: WpPageFieldsEnum!): Float\n  min(field: WpPageFieldsEnum!): Float\n  nodes: [WpPage!]!\n  pageInfo: PageInfo!\n  sum(field: WpPageFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpPageSortInput {\n  fields: [WpPageFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the page type and the Comment type\n\"\"\"\ntype WpPageToCommentConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpComment]\n}\n\ninput WpPageToCommentConnectionFilterInput {\n  nodes: WpCommentFilterListInput\n}\n\n\"\"\"\nThe post type\n\"\"\"\ntype WpPost implements Node & WpBlockEditorContentNode & WpContentNode & WpDatabaseIdentifier & WpMenuItemLinkable & WpNode & WpNodeWithAuthor & WpNodeWithComments & WpNodeWithContentEditor & WpNodeWithExcerpt & WpNodeWithFeaturedImage & WpNodeWithRevisions & WpNodeWithTemplate & WpNodeWithTitle & WpNodeWithTrackbacks & WpUniformResourceIdentifiable {\n  \"\"\"\n  Connection between the NodeWithAuthor type and the User type\n  \"\"\"\n  author: WpNodeWithAuthorToUserConnectionEdge\n\n  \"\"\"\n  The database identifier of the author of the node\n  \"\"\"\n  authorDatabaseId: Int\n\n  \"\"\"\n  The globally unique identifier of the author of the node\n  \"\"\"\n  authorId: ID\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  blocks: [WpBlock!]\n\n  \"\"\"\n  Gutenberg blocks as json string\n  \"\"\"\n  blocksJSON: String\n\n  \"\"\"\n  Connection between the post type and the category type\n  \"\"\"\n  categories: WpPostToCategoryConnection\n  children: [Node!]!\n\n  \"\"\"\n  The number of comments. Even though WPGraphQL denotes this field as an integer, in WordPress this field should be saved as a numeric string for compatibility.\n  \"\"\"\n  commentCount: Int\n\n  \"\"\"\n  Whether the comments are open or closed for this particular post.\n  \"\"\"\n  commentStatus: String\n\n  \"\"\"\n  Connection between the post type and the Comment type\n  \"\"\"\n  comments: WpPostToCommentConnection\n\n  \"\"\"\n  The content of the post.\n  \"\"\"\n  content: String\n\n  \"\"\"\n  Connection between the ContentNode type and the ContentType type\n  \"\"\"\n  contentType: WpContentNodeToContentTypeConnectionEdge\n\n  \"\"\"\n  The name of the Content Type the node belongs to\n  \"\"\"\n  contentTypeName: String!\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  Post publishing date.\n  \"\"\"\n  date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The publishing date set in GMT.\n  \"\"\"\n  dateGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The desired slug of the post\n  \"\"\"\n  desiredSlug: String\n\n  \"\"\"\n  The RSS enclosure for the object\n  \"\"\"\n  enclosure: String\n\n  \"\"\"\n  The excerpt of the post.\n  \"\"\"\n  excerpt: String\n\n  \"\"\"\n  Connection between the NodeWithFeaturedImage type and the MediaItem type\n  \"\"\"\n  featuredImage: WpNodeWithFeaturedImageToMediaItemConnectionEdge\n\n  \"\"\"\n  The database identifier for the featured image node assigned to the content node\n  \"\"\"\n  featuredImageDatabaseId: Int\n\n  \"\"\"\n  Globally unique ID of the featured image assigned to the node\n  \"\"\"\n  featuredImageId: ID\n\n  \"\"\"\n  The global unique identifier for this post. This currently matches the value stored in WP_Post-&gt;guid and the guid column in the &quot;post_objects&quot; database table.\n  \"\"\"\n  guid: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  True if the node is a revision of another node\n  \"\"\"\n  isRevision: Boolean\n\n  \"\"\"\n  Whether this page is sticky\n  \"\"\"\n  isSticky: Boolean!\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  The user that most recently edited the node\n  \"\"\"\n  lastEditedBy: WpContentNodeToEditLastConnectionEdge\n\n  \"\"\"\n  The permalink of the post\n  \"\"\"\n  link: String\n\n  \"\"\"\n  The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time.\n  \"\"\"\n  modified(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT.\n  \"\"\"\n  modifiedGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  Whether the pings are open or closed for this particular post.\n  \"\"\"\n  pingStatus: String\n\n  \"\"\"\n  URLs that have been pinged.\n  \"\"\"\n  pinged: [String]\n\n  \"\"\"\n  Connection between the post type and the postFormat type\n  \"\"\"\n  postFormats: WpPostToPostFormatConnection\n\n  \"\"\"\n  Previewed gutenberg blocks\n  \"\"\"\n  previewBlocks: [WpBlock!]\n\n  \"\"\"\n  Previewed Gutenberg blocks as json string\n  \"\"\"\n  previewBlocksJSON: String\n\n  \"\"\"\n  The uri slug for the post. This is equivalent to the WP_Post-&gt;post_name field and the post_name column in the database for the &quot;post_objects&quot; table.\n  \"\"\"\n  slug: String\n\n  \"\"\"\n  The current status of the object\n  \"\"\"\n  status: String\n\n  \"\"\"\n  Connection between the post type and the tag type\n  \"\"\"\n  tags: WpPostToTagConnection\n\n  \"\"\"\n  The template assigned to a node of content\n  \"\"\"\n  template: WpContentTemplate\n\n  \"\"\"\n  Connection between the post type and the TermNode type\n  \"\"\"\n  terms: WpPostToTermNodeConnection\n\n  \"\"\"\n  The title of the post. This is currently just the raw title. An amendment to support rendered title needs to be made.\n  \"\"\"\n  title: String\n\n  \"\"\"\n  URLs queued to be pinged.\n  \"\"\"\n  toPing: [String]\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n}\n\ntype WpPostConnection {\n  distinct(field: WpPostFieldsEnum!): [String!]!\n  edges: [WpPostEdge!]!\n  group(field: WpPostFieldsEnum!, limit: Int, skip: Int): [WpPostGroupConnection!]!\n  max(field: WpPostFieldsEnum!): Float\n  min(field: WpPostFieldsEnum!): Float\n  nodes: [WpPost!]!\n  pageInfo: PageInfo!\n  sum(field: WpPostFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpPostEdge {\n  next: WpPost\n  node: WpPost!\n  previous: WpPost\n}\n\nenum WpPostFieldsEnum {\n  authorDatabaseId\n  authorId\n  author___node___avatar___default\n  author___node___avatar___extraAttr\n  author___node___avatar___forceDefault\n  author___node___avatar___foundAvatar\n  author___node___avatar___height\n  author___node___avatar___rating\n  author___node___avatar___scheme\n  author___node___avatar___size\n  author___node___avatar___url\n  author___node___avatar___width\n  author___node___blockEditorPreviews___nodes\n  author___node___capKey\n  author___node___capabilities\n  author___node___children\n  author___node___children___children\n  author___node___children___id\n  author___node___comments___nodes\n  author___node___databaseId\n  author___node___description\n  author___node___email\n  author___node___extraCapabilities\n  author___node___firstName\n  author___node___id\n  author___node___internal___content\n  author___node___internal___contentDigest\n  author___node___internal___description\n  author___node___internal___fieldOwners\n  author___node___internal___ignoreType\n  author___node___internal___mediaType\n  author___node___internal___owner\n  author___node___internal___type\n  author___node___isContentNode\n  author___node___isTermNode\n  author___node___lastName\n  author___node___locale\n  author___node___name\n  author___node___nicename\n  author___node___nickname\n  author___node___nodeType\n  author___node___pages___nodes\n  author___node___parent___children\n  author___node___parent___id\n  author___node___posts___nodes\n  author___node___registeredDate\n  author___node___roles___nodes\n  author___node___slug\n  author___node___uri\n  author___node___url\n  author___node___username\n  blocks\n  blocksJSON\n  blocks___attributesJSON\n  blocks___dynamicContent\n  blocks___innerBlocks\n  blocks___innerBlocks___attributesJSON\n  blocks___innerBlocks___dynamicContent\n  blocks___innerBlocks___innerBlocks\n  blocks___innerBlocks___innerBlocks___attributesJSON\n  blocks___innerBlocks___innerBlocks___dynamicContent\n  blocks___innerBlocks___innerBlocks___innerBlocks\n  blocks___innerBlocks___innerBlocks___isDynamic\n  blocks___innerBlocks___innerBlocks___name\n  blocks___innerBlocks___innerBlocks___order\n  blocks___innerBlocks___innerBlocks___originalContent\n  blocks___innerBlocks___innerBlocks___parentNodeDatabaseId\n  blocks___innerBlocks___innerBlocks___saveContent\n  blocks___innerBlocks___isDynamic\n  blocks___innerBlocks___name\n  blocks___innerBlocks___order\n  blocks___innerBlocks___originalContent\n  blocks___innerBlocks___parentNodeDatabaseId\n  blocks___innerBlocks___parentNode___id\n  blocks___innerBlocks___saveContent\n  blocks___isDynamic\n  blocks___name\n  blocks___order\n  blocks___originalContent\n  blocks___parentNodeDatabaseId\n  blocks___parentNode___id\n  blocks___saveContent\n  categories___nodes\n  categories___nodes___ancestors___nodes\n  categories___nodes___children\n  categories___nodes___children___children\n  categories___nodes___children___id\n  categories___nodes___contentNodes___nodes\n  categories___nodes___count\n  categories___nodes___databaseId\n  categories___nodes___description\n  categories___nodes___id\n  categories___nodes___internal___content\n  categories___nodes___internal___contentDigest\n  categories___nodes___internal___description\n  categories___nodes___internal___fieldOwners\n  categories___nodes___internal___ignoreType\n  categories___nodes___internal___mediaType\n  categories___nodes___internal___owner\n  categories___nodes___internal___type\n  categories___nodes___isContentNode\n  categories___nodes___isTermNode\n  categories___nodes___link\n  categories___nodes___name\n  categories___nodes___nodeType\n  categories___nodes___parentDatabaseId\n  categories___nodes___parentId\n  categories___nodes___parent___children\n  categories___nodes___parent___id\n  categories___nodes___posts___nodes\n  categories___nodes___slug\n  categories___nodes___taxonomyName\n  categories___nodes___termGroupId\n  categories___nodes___termTaxonomyId\n  categories___nodes___uri\n  categories___nodes___wpChildren___nodes\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  commentCount\n  commentStatus\n  comments___nodes\n  comments___nodes___agent\n  comments___nodes___approved\n  comments___nodes___authorIp\n  comments___nodes___children\n  comments___nodes___children___children\n  comments___nodes___children___id\n  comments___nodes___content\n  comments___nodes___databaseId\n  comments___nodes___date\n  comments___nodes___dateGmt\n  comments___nodes___id\n  comments___nodes___internal___content\n  comments___nodes___internal___contentDigest\n  comments___nodes___internal___description\n  comments___nodes___internal___fieldOwners\n  comments___nodes___internal___ignoreType\n  comments___nodes___internal___mediaType\n  comments___nodes___internal___owner\n  comments___nodes___internal___type\n  comments___nodes___karma\n  comments___nodes___nodeType\n  comments___nodes___parentDatabaseId\n  comments___nodes___parentId\n  comments___nodes___parent___children\n  comments___nodes___parent___id\n  comments___nodes___replies___nodes\n  comments___nodes___type\n  content\n  contentTypeName\n  contentType___node___archivePath\n  contentType___node___canExport\n  contentType___node___children\n  contentType___node___children___children\n  contentType___node___children___id\n  contentType___node___connectedTaxonomies___nodes\n  contentType___node___contentNodes___nodes\n  contentType___node___deleteWithUser\n  contentType___node___description\n  contentType___node___excludeFromSearch\n  contentType___node___graphqlPluralName\n  contentType___node___graphqlSingleName\n  contentType___node___hasArchive\n  contentType___node___hierarchical\n  contentType___node___id\n  contentType___node___internal___content\n  contentType___node___internal___contentDigest\n  contentType___node___internal___description\n  contentType___node___internal___fieldOwners\n  contentType___node___internal___ignoreType\n  contentType___node___internal___mediaType\n  contentType___node___internal___owner\n  contentType___node___internal___type\n  contentType___node___isContentNode\n  contentType___node___isFrontPage\n  contentType___node___isPostsPage\n  contentType___node___isTermNode\n  contentType___node___label\n  contentType___node___labels___addNew\n  contentType___node___labels___addNewItem\n  contentType___node___labels___allItems\n  contentType___node___labels___archives\n  contentType___node___labels___attributes\n  contentType___node___labels___editItem\n  contentType___node___labels___featuredImage\n  contentType___node___labels___filterItemsList\n  contentType___node___labels___insertIntoItem\n  contentType___node___labels___itemsList\n  contentType___node___labels___itemsListNavigation\n  contentType___node___labels___menuName\n  contentType___node___labels___name\n  contentType___node___labels___newItem\n  contentType___node___labels___notFound\n  contentType___node___labels___notFoundInTrash\n  contentType___node___labels___parentItemColon\n  contentType___node___labels___removeFeaturedImage\n  contentType___node___labels___searchItems\n  contentType___node___labels___setFeaturedImage\n  contentType___node___labels___singularName\n  contentType___node___labels___uploadedToThisItem\n  contentType___node___labels___useFeaturedImage\n  contentType___node___labels___viewItem\n  contentType___node___labels___viewItems\n  contentType___node___menuIcon\n  contentType___node___menuPosition\n  contentType___node___name\n  contentType___node___nodeType\n  contentType___node___parent___children\n  contentType___node___parent___id\n  contentType___node___public\n  contentType___node___publiclyQueryable\n  contentType___node___restBase\n  contentType___node___restControllerClass\n  contentType___node___showInAdminBar\n  contentType___node___showInGraphql\n  contentType___node___showInMenu\n  contentType___node___showInNavMenus\n  contentType___node___showInRest\n  contentType___node___showUi\n  contentType___node___uri\n  databaseId\n  date\n  dateGmt\n  desiredSlug\n  enclosure\n  excerpt\n  featuredImageDatabaseId\n  featuredImageId\n  featuredImage___node___altText\n  featuredImage___node___ancestors___nodes\n  featuredImage___node___authorDatabaseId\n  featuredImage___node___authorId\n  featuredImage___node___caption\n  featuredImage___node___children\n  featuredImage___node___children___children\n  featuredImage___node___children___id\n  featuredImage___node___commentCount\n  featuredImage___node___commentStatus\n  featuredImage___node___comments___nodes\n  featuredImage___node___contentTypeName\n  featuredImage___node___databaseId\n  featuredImage___node___date\n  featuredImage___node___dateGmt\n  featuredImage___node___description\n  featuredImage___node___desiredSlug\n  featuredImage___node___enclosure\n  featuredImage___node___fileSize\n  featuredImage___node___filename\n  featuredImage___node___filesize\n  featuredImage___node___gatsbyImage\n  featuredImage___node___guid\n  featuredImage___node___height\n  featuredImage___node___id\n  featuredImage___node___internal___content\n  featuredImage___node___internal___contentDigest\n  featuredImage___node___internal___description\n  featuredImage___node___internal___fieldOwners\n  featuredImage___node___internal___ignoreType\n  featuredImage___node___internal___mediaType\n  featuredImage___node___internal___owner\n  featuredImage___node___internal___type\n  featuredImage___node___isContentNode\n  featuredImage___node___isTermNode\n  featuredImage___node___link\n  featuredImage___node___localFile___absolutePath\n  featuredImage___node___localFile___accessTime\n  featuredImage___node___localFile___atime\n  featuredImage___node___localFile___atimeMs\n  featuredImage___node___localFile___base\n  featuredImage___node___localFile___birthTime\n  featuredImage___node___localFile___birthtime\n  featuredImage___node___localFile___birthtimeMs\n  featuredImage___node___localFile___blksize\n  featuredImage___node___localFile___blocks\n  featuredImage___node___localFile___changeTime\n  featuredImage___node___localFile___children\n  featuredImage___node___localFile___childrenImageSharp\n  featuredImage___node___localFile___ctime\n  featuredImage___node___localFile___ctimeMs\n  featuredImage___node___localFile___dev\n  featuredImage___node___localFile___dir\n  featuredImage___node___localFile___ext\n  featuredImage___node___localFile___extension\n  featuredImage___node___localFile___gid\n  featuredImage___node___localFile___hash\n  featuredImage___node___localFile___id\n  featuredImage___node___localFile___ino\n  featuredImage___node___localFile___mode\n  featuredImage___node___localFile___modifiedTime\n  featuredImage___node___localFile___mtime\n  featuredImage___node___localFile___mtimeMs\n  featuredImage___node___localFile___name\n  featuredImage___node___localFile___nlink\n  featuredImage___node___localFile___prettySize\n  featuredImage___node___localFile___publicURL\n  featuredImage___node___localFile___rdev\n  featuredImage___node___localFile___relativeDirectory\n  featuredImage___node___localFile___relativePath\n  featuredImage___node___localFile___root\n  featuredImage___node___localFile___size\n  featuredImage___node___localFile___sourceInstanceName\n  featuredImage___node___localFile___uid\n  featuredImage___node___mediaDetails___file\n  featuredImage___node___mediaDetails___height\n  featuredImage___node___mediaDetails___sizes\n  featuredImage___node___mediaDetails___width\n  featuredImage___node___mediaItemUrl\n  featuredImage___node___mediaType\n  featuredImage___node___mimeType\n  featuredImage___node___modified\n  featuredImage___node___modifiedGmt\n  featuredImage___node___nodeType\n  featuredImage___node___parentDatabaseId\n  featuredImage___node___parentId\n  featuredImage___node___parent___children\n  featuredImage___node___parent___id\n  featuredImage___node___publicUrl\n  featuredImage___node___remoteFile___absolutePath\n  featuredImage___node___remoteFile___accessTime\n  featuredImage___node___remoteFile___atime\n  featuredImage___node___remoteFile___atimeMs\n  featuredImage___node___remoteFile___base\n  featuredImage___node___remoteFile___birthTime\n  featuredImage___node___remoteFile___birthtime\n  featuredImage___node___remoteFile___birthtimeMs\n  featuredImage___node___remoteFile___blksize\n  featuredImage___node___remoteFile___blocks\n  featuredImage___node___remoteFile___changeTime\n  featuredImage___node___remoteFile___children\n  featuredImage___node___remoteFile___childrenImageSharp\n  featuredImage___node___remoteFile___ctime\n  featuredImage___node___remoteFile___ctimeMs\n  featuredImage___node___remoteFile___dev\n  featuredImage___node___remoteFile___dir\n  featuredImage___node___remoteFile___ext\n  featuredImage___node___remoteFile___extension\n  featuredImage___node___remoteFile___gid\n  featuredImage___node___remoteFile___hash\n  featuredImage___node___remoteFile___id\n  featuredImage___node___remoteFile___ino\n  featuredImage___node___remoteFile___mode\n  featuredImage___node___remoteFile___modifiedTime\n  featuredImage___node___remoteFile___mtime\n  featuredImage___node___remoteFile___mtimeMs\n  featuredImage___node___remoteFile___name\n  featuredImage___node___remoteFile___nlink\n  featuredImage___node___remoteFile___prettySize\n  featuredImage___node___remoteFile___publicURL\n  featuredImage___node___remoteFile___rdev\n  featuredImage___node___remoteFile___relativeDirectory\n  featuredImage___node___remoteFile___relativePath\n  featuredImage___node___remoteFile___root\n  featuredImage___node___remoteFile___size\n  featuredImage___node___remoteFile___sourceInstanceName\n  featuredImage___node___remoteFile___uid\n  featuredImage___node___resize___height\n  featuredImage___node___resize___src\n  featuredImage___node___resize___width\n  featuredImage___node___sizes\n  featuredImage___node___slug\n  featuredImage___node___sourceUrl\n  featuredImage___node___srcSet\n  featuredImage___node___status\n  featuredImage___node___template___templateName\n  featuredImage___node___title\n  featuredImage___node___uri\n  featuredImage___node___width\n  featuredImage___node___wpChildren___nodes\n  guid\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  isContentNode\n  isRevision\n  isSticky\n  isTermNode\n  lastEditedBy___node___avatar___default\n  lastEditedBy___node___avatar___extraAttr\n  lastEditedBy___node___avatar___forceDefault\n  lastEditedBy___node___avatar___foundAvatar\n  lastEditedBy___node___avatar___height\n  lastEditedBy___node___avatar___rating\n  lastEditedBy___node___avatar___scheme\n  lastEditedBy___node___avatar___size\n  lastEditedBy___node___avatar___url\n  lastEditedBy___node___avatar___width\n  lastEditedBy___node___blockEditorPreviews___nodes\n  lastEditedBy___node___capKey\n  lastEditedBy___node___capabilities\n  lastEditedBy___node___children\n  lastEditedBy___node___children___children\n  lastEditedBy___node___children___id\n  lastEditedBy___node___comments___nodes\n  lastEditedBy___node___databaseId\n  lastEditedBy___node___description\n  lastEditedBy___node___email\n  lastEditedBy___node___extraCapabilities\n  lastEditedBy___node___firstName\n  lastEditedBy___node___id\n  lastEditedBy___node___internal___content\n  lastEditedBy___node___internal___contentDigest\n  lastEditedBy___node___internal___description\n  lastEditedBy___node___internal___fieldOwners\n  lastEditedBy___node___internal___ignoreType\n  lastEditedBy___node___internal___mediaType\n  lastEditedBy___node___internal___owner\n  lastEditedBy___node___internal___type\n  lastEditedBy___node___isContentNode\n  lastEditedBy___node___isTermNode\n  lastEditedBy___node___lastName\n  lastEditedBy___node___locale\n  lastEditedBy___node___name\n  lastEditedBy___node___nicename\n  lastEditedBy___node___nickname\n  lastEditedBy___node___nodeType\n  lastEditedBy___node___pages___nodes\n  lastEditedBy___node___parent___children\n  lastEditedBy___node___parent___id\n  lastEditedBy___node___posts___nodes\n  lastEditedBy___node___registeredDate\n  lastEditedBy___node___roles___nodes\n  lastEditedBy___node___slug\n  lastEditedBy___node___uri\n  lastEditedBy___node___url\n  lastEditedBy___node___username\n  link\n  modified\n  modifiedGmt\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  pingStatus\n  pinged\n  postFormats___nodes\n  postFormats___nodes___children\n  postFormats___nodes___children___children\n  postFormats___nodes___children___id\n  postFormats___nodes___contentNodes___nodes\n  postFormats___nodes___count\n  postFormats___nodes___databaseId\n  postFormats___nodes___description\n  postFormats___nodes___id\n  postFormats___nodes___internal___content\n  postFormats___nodes___internal___contentDigest\n  postFormats___nodes___internal___description\n  postFormats___nodes___internal___fieldOwners\n  postFormats___nodes___internal___ignoreType\n  postFormats___nodes___internal___mediaType\n  postFormats___nodes___internal___owner\n  postFormats___nodes___internal___type\n  postFormats___nodes___isContentNode\n  postFormats___nodes___isTermNode\n  postFormats___nodes___link\n  postFormats___nodes___name\n  postFormats___nodes___nodeType\n  postFormats___nodes___parent___children\n  postFormats___nodes___parent___id\n  postFormats___nodes___posts___nodes\n  postFormats___nodes___slug\n  postFormats___nodes___taxonomyName\n  postFormats___nodes___termGroupId\n  postFormats___nodes___termTaxonomyId\n  postFormats___nodes___uri\n  previewBlocks\n  previewBlocksJSON\n  previewBlocks___attributesJSON\n  previewBlocks___dynamicContent\n  previewBlocks___innerBlocks\n  previewBlocks___innerBlocks___attributesJSON\n  previewBlocks___innerBlocks___dynamicContent\n  previewBlocks___innerBlocks___innerBlocks\n  previewBlocks___innerBlocks___innerBlocks___attributesJSON\n  previewBlocks___innerBlocks___innerBlocks___dynamicContent\n  previewBlocks___innerBlocks___innerBlocks___innerBlocks\n  previewBlocks___innerBlocks___innerBlocks___isDynamic\n  previewBlocks___innerBlocks___innerBlocks___name\n  previewBlocks___innerBlocks___innerBlocks___order\n  previewBlocks___innerBlocks___innerBlocks___originalContent\n  previewBlocks___innerBlocks___innerBlocks___parentNodeDatabaseId\n  previewBlocks___innerBlocks___innerBlocks___saveContent\n  previewBlocks___innerBlocks___isDynamic\n  previewBlocks___innerBlocks___name\n  previewBlocks___innerBlocks___order\n  previewBlocks___innerBlocks___originalContent\n  previewBlocks___innerBlocks___parentNodeDatabaseId\n  previewBlocks___innerBlocks___parentNode___id\n  previewBlocks___innerBlocks___saveContent\n  previewBlocks___isDynamic\n  previewBlocks___name\n  previewBlocks___order\n  previewBlocks___originalContent\n  previewBlocks___parentNodeDatabaseId\n  previewBlocks___parentNode___id\n  previewBlocks___saveContent\n  slug\n  status\n  tags___nodes\n  tags___nodes___children\n  tags___nodes___children___children\n  tags___nodes___children___id\n  tags___nodes___contentNodes___nodes\n  tags___nodes___count\n  tags___nodes___databaseId\n  tags___nodes___description\n  tags___nodes___id\n  tags___nodes___internal___content\n  tags___nodes___internal___contentDigest\n  tags___nodes___internal___description\n  tags___nodes___internal___fieldOwners\n  tags___nodes___internal___ignoreType\n  tags___nodes___internal___mediaType\n  tags___nodes___internal___owner\n  tags___nodes___internal___type\n  tags___nodes___isContentNode\n  tags___nodes___isTermNode\n  tags___nodes___link\n  tags___nodes___name\n  tags___nodes___nodeType\n  tags___nodes___parent___children\n  tags___nodes___parent___id\n  tags___nodes___posts___nodes\n  tags___nodes___slug\n  tags___nodes___taxonomyName\n  tags___nodes___termGroupId\n  tags___nodes___termTaxonomyId\n  tags___nodes___uri\n  template___templateName\n  terms___nodes\n  terms___nodes___children\n  terms___nodes___children___children\n  terms___nodes___children___id\n  terms___nodes___count\n  terms___nodes___databaseId\n  terms___nodes___description\n  terms___nodes___id\n  terms___nodes___internal___content\n  terms___nodes___internal___contentDigest\n  terms___nodes___internal___description\n  terms___nodes___internal___fieldOwners\n  terms___nodes___internal___ignoreType\n  terms___nodes___internal___mediaType\n  terms___nodes___internal___owner\n  terms___nodes___internal___type\n  terms___nodes___isContentNode\n  terms___nodes___isTermNode\n  terms___nodes___link\n  terms___nodes___name\n  terms___nodes___nodeType\n  terms___nodes___parent___children\n  terms___nodes___parent___id\n  terms___nodes___slug\n  terms___nodes___taxonomyName\n  terms___nodes___termGroupId\n  terms___nodes___termTaxonomyId\n  terms___nodes___uri\n  title\n  toPing\n  uri\n}\n\ninput WpPostFilterInput {\n  author: WpNodeWithAuthorToUserConnectionEdgeFilterInput\n  authorDatabaseId: IntQueryOperatorInput\n  authorId: IDQueryOperatorInput\n  blocks: WpBlockFilterListInput\n  blocksJSON: StringQueryOperatorInput\n  categories: WpPostToCategoryConnectionFilterInput\n  children: NodeFilterListInput\n  commentCount: IntQueryOperatorInput\n  commentStatus: StringQueryOperatorInput\n  comments: WpPostToCommentConnectionFilterInput\n  content: StringQueryOperatorInput\n  contentType: WpContentNodeToContentTypeConnectionEdgeFilterInput\n  contentTypeName: StringQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  date: DateQueryOperatorInput\n  dateGmt: DateQueryOperatorInput\n  desiredSlug: StringQueryOperatorInput\n  enclosure: StringQueryOperatorInput\n  excerpt: StringQueryOperatorInput\n  featuredImage: WpNodeWithFeaturedImageToMediaItemConnectionEdgeFilterInput\n  featuredImageDatabaseId: IntQueryOperatorInput\n  featuredImageId: IDQueryOperatorInput\n  guid: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  isContentNode: BooleanQueryOperatorInput\n  isRevision: BooleanQueryOperatorInput\n  isSticky: BooleanQueryOperatorInput\n  isTermNode: BooleanQueryOperatorInput\n  lastEditedBy: WpContentNodeToEditLastConnectionEdgeFilterInput\n  link: StringQueryOperatorInput\n  modified: DateQueryOperatorInput\n  modifiedGmt: DateQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  pingStatus: StringQueryOperatorInput\n  pinged: StringQueryOperatorInput\n  postFormats: WpPostToPostFormatConnectionFilterInput\n  previewBlocks: WpBlockFilterListInput\n  previewBlocksJSON: StringQueryOperatorInput\n  slug: StringQueryOperatorInput\n  status: StringQueryOperatorInput\n  tags: WpPostToTagConnectionFilterInput\n  template: WpContentTemplateFilterInput\n  terms: WpPostToTermNodeConnectionFilterInput\n  title: StringQueryOperatorInput\n  toPing: StringQueryOperatorInput\n  uri: StringQueryOperatorInput\n}\n\ninput WpPostFilterListInput {\n  elemMatch: WpPostFilterInput\n}\n\n\"\"\"\nThe postFormat type\n\"\"\"\ntype WpPostFormat implements Node & WpDatabaseIdentifier & WpNode & WpTermNode & WpUniformResourceIdentifiable {\n  children: [Node!]!\n\n  \"\"\"\n  Connection between the postFormat type and the ContentNode type\n  \"\"\"\n  contentNodes: WpPostFormatToContentNodeConnection\n\n  \"\"\"\n  The number of objects connected to the object\n  \"\"\"\n  count: Int\n\n  \"\"\"\n  The unique identifier stored in the database\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  The description of the object\n  \"\"\"\n  description: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  The link to the term\n  \"\"\"\n  link: String\n\n  \"\"\"\n  The human friendly name of the object.\n  \"\"\"\n  name: String\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  Connection between the postFormat type and the post type\n  \"\"\"\n  posts: WpPostFormatToPostConnection\n\n  \"\"\"\n  An alphanumeric identifier for the object unique to its type.\n  \"\"\"\n  slug: String\n\n  \"\"\"\n  Connection between the postFormat type and the Taxonomy type\n  \"\"\"\n  taxonomy: WpPostFormatToTaxonomyConnectionEdge\n\n  \"\"\"\n  The name of the taxonomy that the object is associated with\n  \"\"\"\n  taxonomyName: String\n\n  \"\"\"\n  The ID of the term group that this term object belongs to\n  \"\"\"\n  termGroupId: Int\n\n  \"\"\"\n  The taxonomy ID that the object is associated with\n  \"\"\"\n  termTaxonomyId: Int\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n}\n\ntype WpPostFormatConnection {\n  distinct(field: WpPostFormatFieldsEnum!): [String!]!\n  edges: [WpPostFormatEdge!]!\n  group(field: WpPostFormatFieldsEnum!, limit: Int, skip: Int): [WpPostFormatGroupConnection!]!\n  max(field: WpPostFormatFieldsEnum!): Float\n  min(field: WpPostFormatFieldsEnum!): Float\n  nodes: [WpPostFormat!]!\n  pageInfo: PageInfo!\n  sum(field: WpPostFormatFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpPostFormatEdge {\n  next: WpPostFormat\n  node: WpPostFormat!\n  previous: WpPostFormat\n}\n\nenum WpPostFormatFieldsEnum {\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  contentNodes___nodes\n  contentNodes___nodes___children\n  contentNodes___nodes___children___children\n  contentNodes___nodes___children___id\n  contentNodes___nodes___contentTypeName\n  contentNodes___nodes___databaseId\n  contentNodes___nodes___date\n  contentNodes___nodes___dateGmt\n  contentNodes___nodes___desiredSlug\n  contentNodes___nodes___enclosure\n  contentNodes___nodes___guid\n  contentNodes___nodes___id\n  contentNodes___nodes___internal___content\n  contentNodes___nodes___internal___contentDigest\n  contentNodes___nodes___internal___description\n  contentNodes___nodes___internal___fieldOwners\n  contentNodes___nodes___internal___ignoreType\n  contentNodes___nodes___internal___mediaType\n  contentNodes___nodes___internal___owner\n  contentNodes___nodes___internal___type\n  contentNodes___nodes___isContentNode\n  contentNodes___nodes___isTermNode\n  contentNodes___nodes___link\n  contentNodes___nodes___modified\n  contentNodes___nodes___modifiedGmt\n  contentNodes___nodes___nodeType\n  contentNodes___nodes___parent___children\n  contentNodes___nodes___parent___id\n  contentNodes___nodes___slug\n  contentNodes___nodes___status\n  contentNodes___nodes___template___templateName\n  contentNodes___nodes___uri\n  count\n  databaseId\n  description\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  isContentNode\n  isTermNode\n  link\n  name\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  posts___nodes\n  posts___nodes___authorDatabaseId\n  posts___nodes___authorId\n  posts___nodes___blocks\n  posts___nodes___blocksJSON\n  posts___nodes___blocks___attributesJSON\n  posts___nodes___blocks___dynamicContent\n  posts___nodes___blocks___innerBlocks\n  posts___nodes___blocks___isDynamic\n  posts___nodes___blocks___name\n  posts___nodes___blocks___order\n  posts___nodes___blocks___originalContent\n  posts___nodes___blocks___parentNodeDatabaseId\n  posts___nodes___blocks___saveContent\n  posts___nodes___categories___nodes\n  posts___nodes___children\n  posts___nodes___children___children\n  posts___nodes___children___id\n  posts___nodes___commentCount\n  posts___nodes___commentStatus\n  posts___nodes___comments___nodes\n  posts___nodes___content\n  posts___nodes___contentTypeName\n  posts___nodes___databaseId\n  posts___nodes___date\n  posts___nodes___dateGmt\n  posts___nodes___desiredSlug\n  posts___nodes___enclosure\n  posts___nodes___excerpt\n  posts___nodes___featuredImageDatabaseId\n  posts___nodes___featuredImageId\n  posts___nodes___guid\n  posts___nodes___id\n  posts___nodes___internal___content\n  posts___nodes___internal___contentDigest\n  posts___nodes___internal___description\n  posts___nodes___internal___fieldOwners\n  posts___nodes___internal___ignoreType\n  posts___nodes___internal___mediaType\n  posts___nodes___internal___owner\n  posts___nodes___internal___type\n  posts___nodes___isContentNode\n  posts___nodes___isRevision\n  posts___nodes___isSticky\n  posts___nodes___isTermNode\n  posts___nodes___link\n  posts___nodes___modified\n  posts___nodes___modifiedGmt\n  posts___nodes___nodeType\n  posts___nodes___parent___children\n  posts___nodes___parent___id\n  posts___nodes___pingStatus\n  posts___nodes___pinged\n  posts___nodes___postFormats___nodes\n  posts___nodes___previewBlocks\n  posts___nodes___previewBlocksJSON\n  posts___nodes___previewBlocks___attributesJSON\n  posts___nodes___previewBlocks___dynamicContent\n  posts___nodes___previewBlocks___innerBlocks\n  posts___nodes___previewBlocks___isDynamic\n  posts___nodes___previewBlocks___name\n  posts___nodes___previewBlocks___order\n  posts___nodes___previewBlocks___originalContent\n  posts___nodes___previewBlocks___parentNodeDatabaseId\n  posts___nodes___previewBlocks___saveContent\n  posts___nodes___slug\n  posts___nodes___status\n  posts___nodes___tags___nodes\n  posts___nodes___template___templateName\n  posts___nodes___terms___nodes\n  posts___nodes___title\n  posts___nodes___toPing\n  posts___nodes___uri\n  slug\n  taxonomyName\n  taxonomy___node___archivePath\n  taxonomy___node___children\n  taxonomy___node___children___children\n  taxonomy___node___children___id\n  taxonomy___node___connectedContentTypes___nodes\n  taxonomy___node___description\n  taxonomy___node___graphqlPluralName\n  taxonomy___node___graphqlSingleName\n  taxonomy___node___hierarchical\n  taxonomy___node___id\n  taxonomy___node___internal___content\n  taxonomy___node___internal___contentDigest\n  taxonomy___node___internal___description\n  taxonomy___node___internal___fieldOwners\n  taxonomy___node___internal___ignoreType\n  taxonomy___node___internal___mediaType\n  taxonomy___node___internal___owner\n  taxonomy___node___internal___type\n  taxonomy___node___label\n  taxonomy___node___name\n  taxonomy___node___nodeType\n  taxonomy___node___parent___children\n  taxonomy___node___parent___id\n  taxonomy___node___public\n  taxonomy___node___restBase\n  taxonomy___node___restControllerClass\n  taxonomy___node___showCloud\n  taxonomy___node___showInAdminColumn\n  taxonomy___node___showInGraphql\n  taxonomy___node___showInMenu\n  taxonomy___node___showInNavMenus\n  taxonomy___node___showInQuickEdit\n  taxonomy___node___showInRest\n  taxonomy___node___showUi\n  termGroupId\n  termTaxonomyId\n  uri\n}\n\ninput WpPostFormatFilterInput {\n  children: NodeFilterListInput\n  contentNodes: WpPostFormatToContentNodeConnectionFilterInput\n  count: IntQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  description: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  isContentNode: BooleanQueryOperatorInput\n  isTermNode: BooleanQueryOperatorInput\n  link: StringQueryOperatorInput\n  name: StringQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  posts: WpPostFormatToPostConnectionFilterInput\n  slug: StringQueryOperatorInput\n  taxonomy: WpPostFormatToTaxonomyConnectionEdgeFilterInput\n  taxonomyName: StringQueryOperatorInput\n  termGroupId: IntQueryOperatorInput\n  termTaxonomyId: IntQueryOperatorInput\n  uri: StringQueryOperatorInput\n}\n\ninput WpPostFormatFilterListInput {\n  elemMatch: WpPostFormatFilterInput\n}\n\ntype WpPostFormatGroupConnection {\n  distinct(field: WpPostFormatFieldsEnum!): [String!]!\n  edges: [WpPostFormatEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpPostFormatFieldsEnum!, limit: Int, skip: Int): [WpPostFormatGroupConnection!]!\n  max(field: WpPostFormatFieldsEnum!): Float\n  min(field: WpPostFormatFieldsEnum!): Float\n  nodes: [WpPostFormat!]!\n  pageInfo: PageInfo!\n  sum(field: WpPostFormatFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpPostFormatSortInput {\n  fields: [WpPostFormatFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the postFormat type and the ContentNode type\n\"\"\"\ntype WpPostFormatToContentNodeConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpContentNode]\n}\n\ninput WpPostFormatToContentNodeConnectionFilterInput {\n  nodes: WpContentNodeFilterListInput\n}\n\n\"\"\"\nConnection between the postFormat type and the post type\n\"\"\"\ntype WpPostFormatToPostConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpPost]\n}\n\ninput WpPostFormatToPostConnectionFilterInput {\n  nodes: WpPostFilterListInput\n}\n\n\"\"\"\nConnection between the postFormat type and the Taxonomy type\n\"\"\"\ntype WpPostFormatToTaxonomyConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpTaxonomy\n}\n\ninput WpPostFormatToTaxonomyConnectionEdgeFilterInput {\n  node: WpTaxonomyFilterInput\n}\n\ntype WpPostGroupConnection {\n  distinct(field: WpPostFieldsEnum!): [String!]!\n  edges: [WpPostEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpPostFieldsEnum!, limit: Int, skip: Int): [WpPostGroupConnection!]!\n  max(field: WpPostFieldsEnum!): Float\n  min(field: WpPostFieldsEnum!): Float\n  nodes: [WpPost!]!\n  pageInfo: PageInfo!\n  sum(field: WpPostFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpPostSortInput {\n  fields: [WpPostFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the post type and the category type\n\"\"\"\ntype WpPostToCategoryConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpCategory]\n}\n\ninput WpPostToCategoryConnectionFilterInput {\n  nodes: WpCategoryFilterListInput\n}\n\n\"\"\"\nConnection between the post type and the Comment type\n\"\"\"\ntype WpPostToCommentConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpComment]\n}\n\ninput WpPostToCommentConnectionFilterInput {\n  nodes: WpCommentFilterListInput\n}\n\n\"\"\"\nConnection between the post type and the postFormat type\n\"\"\"\ntype WpPostToPostFormatConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpPostFormat]\n}\n\ninput WpPostToPostFormatConnectionFilterInput {\n  nodes: WpPostFormatFilterListInput\n}\n\n\"\"\"\nConnection between the post type and the tag type\n\"\"\"\ntype WpPostToTagConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpTag]\n}\n\ninput WpPostToTagConnectionFilterInput {\n  nodes: WpTagFilterListInput\n}\n\n\"\"\"\nConnection between the post type and the TermNode type\n\"\"\"\ntype WpPostToTermNodeConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpTermNode]\n}\n\ninput WpPostToTermNodeConnectionFilterInput {\n  nodes: WpTermNodeFilterListInput\n}\n\n\"\"\"\nDetails for labels of the PostType\n\"\"\"\ntype WpPostTypeLabelDetails {\n  \"\"\"\n  Default is ‘Add New’ for both hierarchical and non-hierarchical types.\n  \"\"\"\n  addNew: String\n\n  \"\"\"\n  Label for adding a new singular item.\n  \"\"\"\n  addNewItem: String\n\n  \"\"\"\n  Label to signify all items in a submenu link.\n  \"\"\"\n  allItems: String\n\n  \"\"\"\n  Label for archives in nav menus\n  \"\"\"\n  archives: String\n\n  \"\"\"\n  Label for the attributes meta box.\n  \"\"\"\n  attributes: String\n\n  \"\"\"\n  Label for editing a singular item.\n  \"\"\"\n  editItem: String\n\n  \"\"\"\n  Label for the Featured Image meta box title.\n  \"\"\"\n  featuredImage: String\n\n  \"\"\"\n  Label for the table views hidden heading.\n  \"\"\"\n  filterItemsList: String\n\n  \"\"\"\n  Label for the media frame button.\n  \"\"\"\n  insertIntoItem: String\n\n  \"\"\"\n  Label for the table hidden heading.\n  \"\"\"\n  itemsList: String\n\n  \"\"\"\n  Label for the table pagination hidden heading.\n  \"\"\"\n  itemsListNavigation: String\n\n  \"\"\"\n  Label for the menu name.\n  \"\"\"\n  menuName: String\n\n  \"\"\"\n  General name for the post type, usually plural.\n  \"\"\"\n  name: String\n\n  \"\"\"\n  Label for the new item page title.\n  \"\"\"\n  newItem: String\n\n  \"\"\"\n  Label used when no items are found.\n  \"\"\"\n  notFound: String\n\n  \"\"\"\n  Label used when no items are in the trash.\n  \"\"\"\n  notFoundInTrash: String\n\n  \"\"\"\n  Label used to prefix parents of hierarchical items.\n  \"\"\"\n  parentItemColon: String\n\n  \"\"\"\n  Label for removing the featured image.\n  \"\"\"\n  removeFeaturedImage: String\n\n  \"\"\"\n  Label for searching plural items.\n  \"\"\"\n  searchItems: String\n\n  \"\"\"\n  Label for setting the featured image.\n  \"\"\"\n  setFeaturedImage: String\n\n  \"\"\"\n  Name for one object of this post type.\n  \"\"\"\n  singularName: String\n\n  \"\"\"\n  Label for the media frame filter.\n  \"\"\"\n  uploadedToThisItem: String\n\n  \"\"\"\n  Label in the media frame for using a featured image.\n  \"\"\"\n  useFeaturedImage: String\n\n  \"\"\"\n  Label for viewing a singular item.\n  \"\"\"\n  viewItem: String\n\n  \"\"\"\n  Label for viewing post type archives.\n  \"\"\"\n  viewItems: String\n}\n\ninput WpPostTypeLabelDetailsFilterInput {\n  addNew: StringQueryOperatorInput\n  addNewItem: StringQueryOperatorInput\n  allItems: StringQueryOperatorInput\n  archives: StringQueryOperatorInput\n  attributes: StringQueryOperatorInput\n  editItem: StringQueryOperatorInput\n  featuredImage: StringQueryOperatorInput\n  filterItemsList: StringQueryOperatorInput\n  insertIntoItem: StringQueryOperatorInput\n  itemsList: StringQueryOperatorInput\n  itemsListNavigation: StringQueryOperatorInput\n  menuName: StringQueryOperatorInput\n  name: StringQueryOperatorInput\n  newItem: StringQueryOperatorInput\n  notFound: StringQueryOperatorInput\n  notFoundInTrash: StringQueryOperatorInput\n  parentItemColon: StringQueryOperatorInput\n  removeFeaturedImage: StringQueryOperatorInput\n  searchItems: StringQueryOperatorInput\n  setFeaturedImage: StringQueryOperatorInput\n  singularName: StringQueryOperatorInput\n  uploadedToThisItem: StringQueryOperatorInput\n  useFeaturedImage: StringQueryOperatorInput\n  viewItem: StringQueryOperatorInput\n  viewItems: StringQueryOperatorInput\n}\n\n\"\"\"\nThe reading setting type\n\"\"\"\ntype WpReadingSettings {\n  \"\"\"\n  Maximal angezeigte Beiträge.\n  \"\"\"\n  postsPerPage: Int\n}\n\ninput WpReadingSettingsFilterInput {\n  postsPerPage: IntQueryOperatorInput\n}\n\n\"\"\"\nreal-media-library/gallery block\n\"\"\"\ntype WpRealMediaLibraryGalleryBlock implements WpBlock {\n  attributes: WpRealMediaLibraryGalleryBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpRealMediaLibraryGalleryBlockAttributes {\n  align: String\n  captions: Boolean!\n  className: String\n  columns: Float!\n  fid: Float!\n  imageCrop: Boolean!\n  lastEditReload: Float!\n  linkTo: String!\n  lock: JSON\n}\n\n\"\"\"\nThe ReusableBlock type\n\"\"\"\ntype WpReusableBlock implements Node & WpBlockEditorContentNode & WpContentNode & WpDatabaseIdentifier & WpNode & WpNodeWithContentEditor & WpNodeWithRevisions & WpNodeWithTemplate & WpNodeWithTitle & WpUniformResourceIdentifiable {\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  blocks: [WpBlock!]\n\n  \"\"\"\n  Gutenberg blocks as json string\n  \"\"\"\n  blocksJSON: String\n  children: [Node!]!\n\n  \"\"\"\n  The content of the post.\n  \"\"\"\n  content: String\n\n  \"\"\"\n  Connection between the ContentNode type and the ContentType type\n  \"\"\"\n  contentType: WpContentNodeToContentTypeConnectionEdge\n\n  \"\"\"\n  The name of the Content Type the node belongs to\n  \"\"\"\n  contentTypeName: String!\n\n  \"\"\"\n  The unique identifier stored in the database\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  Post publishing date.\n  \"\"\"\n  date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The publishing date set in GMT.\n  \"\"\"\n  dateGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The desired slug of the post\n  \"\"\"\n  desiredSlug: String\n\n  \"\"\"\n  The RSS enclosure for the object\n  \"\"\"\n  enclosure: String\n\n  \"\"\"\n  The global unique identifier for this post. This currently matches the value stored in WP_Post-&gt;guid and the guid column in the &quot;post_objects&quot; database table.\n  \"\"\"\n  guid: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  True if the node is a revision of another node\n  \"\"\"\n  isRevision: Boolean\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  The user that most recently edited the node\n  \"\"\"\n  lastEditedBy: WpContentNodeToEditLastConnectionEdge\n\n  \"\"\"\n  The permalink of the post\n  \"\"\"\n  link: String\n\n  \"\"\"\n  The local modified time for a post. If a post was recently updated the modified field will change to match the corresponding time.\n  \"\"\"\n  modified(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n\n  \"\"\"\n  The GMT modified time for a post. If a post was recently updated the modified field will change to match the corresponding time in GMT.\n  \"\"\"\n  modifiedGmt(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  Previewed gutenberg blocks\n  \"\"\"\n  previewBlocks: [WpBlock!]\n\n  \"\"\"\n  Previewed Gutenberg blocks as json string\n  \"\"\"\n  previewBlocksJSON: String\n\n  \"\"\"\n  The uri slug for the post. This is equivalent to the WP_Post-&gt;post_name field and the post_name column in the database for the &quot;post_objects&quot; table.\n  \"\"\"\n  slug: String\n\n  \"\"\"\n  The current status of the object\n  \"\"\"\n  status: String\n\n  \"\"\"\n  The template assigned to the node\n  \"\"\"\n  template: WpContentTemplate\n\n  \"\"\"\n  The title of the post. This is currently just the raw title. An amendment to support rendered title needs to be made.\n  \"\"\"\n  title: String\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n}\n\ntype WpReusableBlockConnection {\n  distinct(field: WpReusableBlockFieldsEnum!): [String!]!\n  edges: [WpReusableBlockEdge!]!\n  group(field: WpReusableBlockFieldsEnum!, limit: Int, skip: Int): [WpReusableBlockGroupConnection!]!\n  max(field: WpReusableBlockFieldsEnum!): Float\n  min(field: WpReusableBlockFieldsEnum!): Float\n  nodes: [WpReusableBlock!]!\n  pageInfo: PageInfo!\n  sum(field: WpReusableBlockFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpReusableBlockEdge {\n  next: WpReusableBlock\n  node: WpReusableBlock!\n  previous: WpReusableBlock\n}\n\nenum WpReusableBlockFieldsEnum {\n  blocks\n  blocksJSON\n  blocks___attributesJSON\n  blocks___dynamicContent\n  blocks___innerBlocks\n  blocks___innerBlocks___attributesJSON\n  blocks___innerBlocks___dynamicContent\n  blocks___innerBlocks___innerBlocks\n  blocks___innerBlocks___innerBlocks___attributesJSON\n  blocks___innerBlocks___innerBlocks___dynamicContent\n  blocks___innerBlocks___innerBlocks___innerBlocks\n  blocks___innerBlocks___innerBlocks___isDynamic\n  blocks___innerBlocks___innerBlocks___name\n  blocks___innerBlocks___innerBlocks___order\n  blocks___innerBlocks___innerBlocks___originalContent\n  blocks___innerBlocks___innerBlocks___parentNodeDatabaseId\n  blocks___innerBlocks___innerBlocks___saveContent\n  blocks___innerBlocks___isDynamic\n  blocks___innerBlocks___name\n  blocks___innerBlocks___order\n  blocks___innerBlocks___originalContent\n  blocks___innerBlocks___parentNodeDatabaseId\n  blocks___innerBlocks___parentNode___id\n  blocks___innerBlocks___saveContent\n  blocks___isDynamic\n  blocks___name\n  blocks___order\n  blocks___originalContent\n  blocks___parentNodeDatabaseId\n  blocks___parentNode___id\n  blocks___saveContent\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  content\n  contentTypeName\n  contentType___node___archivePath\n  contentType___node___canExport\n  contentType___node___children\n  contentType___node___children___children\n  contentType___node___children___id\n  contentType___node___connectedTaxonomies___nodes\n  contentType___node___contentNodes___nodes\n  contentType___node___deleteWithUser\n  contentType___node___description\n  contentType___node___excludeFromSearch\n  contentType___node___graphqlPluralName\n  contentType___node___graphqlSingleName\n  contentType___node___hasArchive\n  contentType___node___hierarchical\n  contentType___node___id\n  contentType___node___internal___content\n  contentType___node___internal___contentDigest\n  contentType___node___internal___description\n  contentType___node___internal___fieldOwners\n  contentType___node___internal___ignoreType\n  contentType___node___internal___mediaType\n  contentType___node___internal___owner\n  contentType___node___internal___type\n  contentType___node___isContentNode\n  contentType___node___isFrontPage\n  contentType___node___isPostsPage\n  contentType___node___isTermNode\n  contentType___node___label\n  contentType___node___labels___addNew\n  contentType___node___labels___addNewItem\n  contentType___node___labels___allItems\n  contentType___node___labels___archives\n  contentType___node___labels___attributes\n  contentType___node___labels___editItem\n  contentType___node___labels___featuredImage\n  contentType___node___labels___filterItemsList\n  contentType___node___labels___insertIntoItem\n  contentType___node___labels___itemsList\n  contentType___node___labels___itemsListNavigation\n  contentType___node___labels___menuName\n  contentType___node___labels___name\n  contentType___node___labels___newItem\n  contentType___node___labels___notFound\n  contentType___node___labels___notFoundInTrash\n  contentType___node___labels___parentItemColon\n  contentType___node___labels___removeFeaturedImage\n  contentType___node___labels___searchItems\n  contentType___node___labels___setFeaturedImage\n  contentType___node___labels___singularName\n  contentType___node___labels___uploadedToThisItem\n  contentType___node___labels___useFeaturedImage\n  contentType___node___labels___viewItem\n  contentType___node___labels___viewItems\n  contentType___node___menuIcon\n  contentType___node___menuPosition\n  contentType___node___name\n  contentType___node___nodeType\n  contentType___node___parent___children\n  contentType___node___parent___id\n  contentType___node___public\n  contentType___node___publiclyQueryable\n  contentType___node___restBase\n  contentType___node___restControllerClass\n  contentType___node___showInAdminBar\n  contentType___node___showInGraphql\n  contentType___node___showInMenu\n  contentType___node___showInNavMenus\n  contentType___node___showInRest\n  contentType___node___showUi\n  contentType___node___uri\n  databaseId\n  date\n  dateGmt\n  desiredSlug\n  enclosure\n  guid\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  isContentNode\n  isRevision\n  isTermNode\n  lastEditedBy___node___avatar___default\n  lastEditedBy___node___avatar___extraAttr\n  lastEditedBy___node___avatar___forceDefault\n  lastEditedBy___node___avatar___foundAvatar\n  lastEditedBy___node___avatar___height\n  lastEditedBy___node___avatar___rating\n  lastEditedBy___node___avatar___scheme\n  lastEditedBy___node___avatar___size\n  lastEditedBy___node___avatar___url\n  lastEditedBy___node___avatar___width\n  lastEditedBy___node___blockEditorPreviews___nodes\n  lastEditedBy___node___capKey\n  lastEditedBy___node___capabilities\n  lastEditedBy___node___children\n  lastEditedBy___node___children___children\n  lastEditedBy___node___children___id\n  lastEditedBy___node___comments___nodes\n  lastEditedBy___node___databaseId\n  lastEditedBy___node___description\n  lastEditedBy___node___email\n  lastEditedBy___node___extraCapabilities\n  lastEditedBy___node___firstName\n  lastEditedBy___node___id\n  lastEditedBy___node___internal___content\n  lastEditedBy___node___internal___contentDigest\n  lastEditedBy___node___internal___description\n  lastEditedBy___node___internal___fieldOwners\n  lastEditedBy___node___internal___ignoreType\n  lastEditedBy___node___internal___mediaType\n  lastEditedBy___node___internal___owner\n  lastEditedBy___node___internal___type\n  lastEditedBy___node___isContentNode\n  lastEditedBy___node___isTermNode\n  lastEditedBy___node___lastName\n  lastEditedBy___node___locale\n  lastEditedBy___node___name\n  lastEditedBy___node___nicename\n  lastEditedBy___node___nickname\n  lastEditedBy___node___nodeType\n  lastEditedBy___node___pages___nodes\n  lastEditedBy___node___parent___children\n  lastEditedBy___node___parent___id\n  lastEditedBy___node___posts___nodes\n  lastEditedBy___node___registeredDate\n  lastEditedBy___node___roles___nodes\n  lastEditedBy___node___slug\n  lastEditedBy___node___uri\n  lastEditedBy___node___url\n  lastEditedBy___node___username\n  link\n  modified\n  modifiedGmt\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  previewBlocks\n  previewBlocksJSON\n  previewBlocks___attributesJSON\n  previewBlocks___dynamicContent\n  previewBlocks___innerBlocks\n  previewBlocks___innerBlocks___attributesJSON\n  previewBlocks___innerBlocks___dynamicContent\n  previewBlocks___innerBlocks___innerBlocks\n  previewBlocks___innerBlocks___innerBlocks___attributesJSON\n  previewBlocks___innerBlocks___innerBlocks___dynamicContent\n  previewBlocks___innerBlocks___innerBlocks___innerBlocks\n  previewBlocks___innerBlocks___innerBlocks___isDynamic\n  previewBlocks___innerBlocks___innerBlocks___name\n  previewBlocks___innerBlocks___innerBlocks___order\n  previewBlocks___innerBlocks___innerBlocks___originalContent\n  previewBlocks___innerBlocks___innerBlocks___parentNodeDatabaseId\n  previewBlocks___innerBlocks___innerBlocks___saveContent\n  previewBlocks___innerBlocks___isDynamic\n  previewBlocks___innerBlocks___name\n  previewBlocks___innerBlocks___order\n  previewBlocks___innerBlocks___originalContent\n  previewBlocks___innerBlocks___parentNodeDatabaseId\n  previewBlocks___innerBlocks___parentNode___id\n  previewBlocks___innerBlocks___saveContent\n  previewBlocks___isDynamic\n  previewBlocks___name\n  previewBlocks___order\n  previewBlocks___originalContent\n  previewBlocks___parentNodeDatabaseId\n  previewBlocks___parentNode___id\n  previewBlocks___saveContent\n  slug\n  status\n  template___templateName\n  title\n  uri\n}\n\ninput WpReusableBlockFilterInput {\n  blocks: WpBlockFilterListInput\n  blocksJSON: StringQueryOperatorInput\n  children: NodeFilterListInput\n  content: StringQueryOperatorInput\n  contentType: WpContentNodeToContentTypeConnectionEdgeFilterInput\n  contentTypeName: StringQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  date: DateQueryOperatorInput\n  dateGmt: DateQueryOperatorInput\n  desiredSlug: StringQueryOperatorInput\n  enclosure: StringQueryOperatorInput\n  guid: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  isContentNode: BooleanQueryOperatorInput\n  isRevision: BooleanQueryOperatorInput\n  isTermNode: BooleanQueryOperatorInput\n  lastEditedBy: WpContentNodeToEditLastConnectionEdgeFilterInput\n  link: StringQueryOperatorInput\n  modified: DateQueryOperatorInput\n  modifiedGmt: DateQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  previewBlocks: WpBlockFilterListInput\n  previewBlocksJSON: StringQueryOperatorInput\n  slug: StringQueryOperatorInput\n  status: StringQueryOperatorInput\n  template: WpContentTemplateFilterInput\n  title: StringQueryOperatorInput\n  uri: StringQueryOperatorInput\n}\n\ntype WpReusableBlockGroupConnection {\n  distinct(field: WpReusableBlockFieldsEnum!): [String!]!\n  edges: [WpReusableBlockEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpReusableBlockFieldsEnum!, limit: Int, skip: Int): [WpReusableBlockGroupConnection!]!\n  max(field: WpReusableBlockFieldsEnum!): Float\n  min(field: WpReusableBlockFieldsEnum!): Float\n  nodes: [WpReusableBlock!]!\n  pageInfo: PageInfo!\n  sum(field: WpReusableBlockFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpReusableBlockSortInput {\n  fields: [WpReusableBlockFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nAll of the registered settings\n\"\"\"\ntype WpSettings {\n  \"\"\"\n  Settings of the the string Settings Group\n  \"\"\"\n  discussionSettingsDefaultCommentStatus: String\n\n  \"\"\"\n  Settings of the the string Settings Group\n  \"\"\"\n  discussionSettingsDefaultPingStatus: String\n\n  \"\"\"\n  Settings of the the string Settings Group\n  \"\"\"\n  generalSettingsDateFormat: String\n\n  \"\"\"\n  Settings of the the string Settings Group\n  \"\"\"\n  generalSettingsDescription: String\n\n  \"\"\"\n  Settings of the the string Settings Group\n  \"\"\"\n  generalSettingsEmail: String\n\n  \"\"\"\n  Settings of the the string Settings Group\n  \"\"\"\n  generalSettingsLanguage: String\n\n  \"\"\"\n  Settings of the the integer Settings Group\n  \"\"\"\n  generalSettingsStartOfWeek: Int\n\n  \"\"\"\n  Settings of the the string Settings Group\n  \"\"\"\n  generalSettingsTimeFormat: String\n\n  \"\"\"\n  Settings of the the string Settings Group\n  \"\"\"\n  generalSettingsTimezone: String\n\n  \"\"\"\n  Settings of the the string Settings Group\n  \"\"\"\n  generalSettingsTitle: String\n\n  \"\"\"\n  Settings of the the string Settings Group\n  \"\"\"\n  generalSettingsUrl: String\n\n  \"\"\"\n  Settings of the the integer Settings Group\n  \"\"\"\n  readingSettingsPostsPerPage: Int\n\n  \"\"\"\n  Settings of the the integer Settings Group\n  \"\"\"\n  writingSettingsDefaultCategory: Int\n\n  \"\"\"\n  Settings of the the string Settings Group\n  \"\"\"\n  writingSettingsDefaultPostFormat: String\n\n  \"\"\"\n  Settings of the the boolean Settings Group\n  \"\"\"\n  writingSettingsUseSmilies: Boolean\n}\n\ninput WpSettingsFilterInput {\n  discussionSettingsDefaultCommentStatus: StringQueryOperatorInput\n  discussionSettingsDefaultPingStatus: StringQueryOperatorInput\n  generalSettingsDateFormat: StringQueryOperatorInput\n  generalSettingsDescription: StringQueryOperatorInput\n  generalSettingsEmail: StringQueryOperatorInput\n  generalSettingsLanguage: StringQueryOperatorInput\n  generalSettingsStartOfWeek: IntQueryOperatorInput\n  generalSettingsTimeFormat: StringQueryOperatorInput\n  generalSettingsTimezone: StringQueryOperatorInput\n  generalSettingsTitle: StringQueryOperatorInput\n  generalSettingsUrl: StringQueryOperatorInput\n  readingSettingsPostsPerPage: IntQueryOperatorInput\n  writingSettingsDefaultCategory: IntQueryOperatorInput\n  writingSettingsDefaultPostFormat: StringQueryOperatorInput\n  writingSettingsUseSmilies: BooleanQueryOperatorInput\n}\n\ninput WpSortInput {\n  fields: [WpFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\ntadv/classic-paragraph block\n\"\"\"\ntype WpTadvClassicParagraphBlock implements WpBlock {\n  attributes: WpTadvClassicParagraphBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpTadvClassicParagraphBlockAttributes {\n  align: String\n  content: String\n  lock: JSON\n}\n\n\"\"\"\nThe tag type\n\"\"\"\ntype WpTag implements Node & WpDatabaseIdentifier & WpMenuItemLinkable & WpNode & WpTermNode & WpUniformResourceIdentifiable {\n  children: [Node!]!\n\n  \"\"\"\n  Connection between the tag type and the ContentNode type\n  \"\"\"\n  contentNodes: WpTagToContentNodeConnection\n\n  \"\"\"\n  The number of objects connected to the object\n  \"\"\"\n  count: Int\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  The description of the object\n  \"\"\"\n  description: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  The link to the term\n  \"\"\"\n  link: String\n\n  \"\"\"\n  The human friendly name of the object.\n  \"\"\"\n  name: String\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  Connection between the tag type and the post type\n  \"\"\"\n  posts: WpTagToPostConnection\n\n  \"\"\"\n  An alphanumeric identifier for the object unique to its type.\n  \"\"\"\n  slug: String\n\n  \"\"\"\n  Connection between the tag type and the Taxonomy type\n  \"\"\"\n  taxonomy: WpTagToTaxonomyConnectionEdge\n\n  \"\"\"\n  The name of the taxonomy that the object is associated with\n  \"\"\"\n  taxonomyName: String\n\n  \"\"\"\n  The ID of the term group that this term object belongs to\n  \"\"\"\n  termGroupId: Int\n\n  \"\"\"\n  The taxonomy ID that the object is associated with\n  \"\"\"\n  termTaxonomyId: Int\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n}\n\ntype WpTagConnection {\n  distinct(field: WpTagFieldsEnum!): [String!]!\n  edges: [WpTagEdge!]!\n  group(field: WpTagFieldsEnum!, limit: Int, skip: Int): [WpTagGroupConnection!]!\n  max(field: WpTagFieldsEnum!): Float\n  min(field: WpTagFieldsEnum!): Float\n  nodes: [WpTag!]!\n  pageInfo: PageInfo!\n  sum(field: WpTagFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpTagEdge {\n  next: WpTag\n  node: WpTag!\n  previous: WpTag\n}\n\nenum WpTagFieldsEnum {\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  contentNodes___nodes\n  contentNodes___nodes___children\n  contentNodes___nodes___children___children\n  contentNodes___nodes___children___id\n  contentNodes___nodes___contentTypeName\n  contentNodes___nodes___databaseId\n  contentNodes___nodes___date\n  contentNodes___nodes___dateGmt\n  contentNodes___nodes___desiredSlug\n  contentNodes___nodes___enclosure\n  contentNodes___nodes___guid\n  contentNodes___nodes___id\n  contentNodes___nodes___internal___content\n  contentNodes___nodes___internal___contentDigest\n  contentNodes___nodes___internal___description\n  contentNodes___nodes___internal___fieldOwners\n  contentNodes___nodes___internal___ignoreType\n  contentNodes___nodes___internal___mediaType\n  contentNodes___nodes___internal___owner\n  contentNodes___nodes___internal___type\n  contentNodes___nodes___isContentNode\n  contentNodes___nodes___isTermNode\n  contentNodes___nodes___link\n  contentNodes___nodes___modified\n  contentNodes___nodes___modifiedGmt\n  contentNodes___nodes___nodeType\n  contentNodes___nodes___parent___children\n  contentNodes___nodes___parent___id\n  contentNodes___nodes___slug\n  contentNodes___nodes___status\n  contentNodes___nodes___template___templateName\n  contentNodes___nodes___uri\n  count\n  databaseId\n  description\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  isContentNode\n  isTermNode\n  link\n  name\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  posts___nodes\n  posts___nodes___authorDatabaseId\n  posts___nodes___authorId\n  posts___nodes___blocks\n  posts___nodes___blocksJSON\n  posts___nodes___blocks___attributesJSON\n  posts___nodes___blocks___dynamicContent\n  posts___nodes___blocks___innerBlocks\n  posts___nodes___blocks___isDynamic\n  posts___nodes___blocks___name\n  posts___nodes___blocks___order\n  posts___nodes___blocks___originalContent\n  posts___nodes___blocks___parentNodeDatabaseId\n  posts___nodes___blocks___saveContent\n  posts___nodes___categories___nodes\n  posts___nodes___children\n  posts___nodes___children___children\n  posts___nodes___children___id\n  posts___nodes___commentCount\n  posts___nodes___commentStatus\n  posts___nodes___comments___nodes\n  posts___nodes___content\n  posts___nodes___contentTypeName\n  posts___nodes___databaseId\n  posts___nodes___date\n  posts___nodes___dateGmt\n  posts___nodes___desiredSlug\n  posts___nodes___enclosure\n  posts___nodes___excerpt\n  posts___nodes___featuredImageDatabaseId\n  posts___nodes___featuredImageId\n  posts___nodes___guid\n  posts___nodes___id\n  posts___nodes___internal___content\n  posts___nodes___internal___contentDigest\n  posts___nodes___internal___description\n  posts___nodes___internal___fieldOwners\n  posts___nodes___internal___ignoreType\n  posts___nodes___internal___mediaType\n  posts___nodes___internal___owner\n  posts___nodes___internal___type\n  posts___nodes___isContentNode\n  posts___nodes___isRevision\n  posts___nodes___isSticky\n  posts___nodes___isTermNode\n  posts___nodes___link\n  posts___nodes___modified\n  posts___nodes___modifiedGmt\n  posts___nodes___nodeType\n  posts___nodes___parent___children\n  posts___nodes___parent___id\n  posts___nodes___pingStatus\n  posts___nodes___pinged\n  posts___nodes___postFormats___nodes\n  posts___nodes___previewBlocks\n  posts___nodes___previewBlocksJSON\n  posts___nodes___previewBlocks___attributesJSON\n  posts___nodes___previewBlocks___dynamicContent\n  posts___nodes___previewBlocks___innerBlocks\n  posts___nodes___previewBlocks___isDynamic\n  posts___nodes___previewBlocks___name\n  posts___nodes___previewBlocks___order\n  posts___nodes___previewBlocks___originalContent\n  posts___nodes___previewBlocks___parentNodeDatabaseId\n  posts___nodes___previewBlocks___saveContent\n  posts___nodes___slug\n  posts___nodes___status\n  posts___nodes___tags___nodes\n  posts___nodes___template___templateName\n  posts___nodes___terms___nodes\n  posts___nodes___title\n  posts___nodes___toPing\n  posts___nodes___uri\n  slug\n  taxonomyName\n  taxonomy___node___archivePath\n  taxonomy___node___children\n  taxonomy___node___children___children\n  taxonomy___node___children___id\n  taxonomy___node___connectedContentTypes___nodes\n  taxonomy___node___description\n  taxonomy___node___graphqlPluralName\n  taxonomy___node___graphqlSingleName\n  taxonomy___node___hierarchical\n  taxonomy___node___id\n  taxonomy___node___internal___content\n  taxonomy___node___internal___contentDigest\n  taxonomy___node___internal___description\n  taxonomy___node___internal___fieldOwners\n  taxonomy___node___internal___ignoreType\n  taxonomy___node___internal___mediaType\n  taxonomy___node___internal___owner\n  taxonomy___node___internal___type\n  taxonomy___node___label\n  taxonomy___node___name\n  taxonomy___node___nodeType\n  taxonomy___node___parent___children\n  taxonomy___node___parent___id\n  taxonomy___node___public\n  taxonomy___node___restBase\n  taxonomy___node___restControllerClass\n  taxonomy___node___showCloud\n  taxonomy___node___showInAdminColumn\n  taxonomy___node___showInGraphql\n  taxonomy___node___showInMenu\n  taxonomy___node___showInNavMenus\n  taxonomy___node___showInQuickEdit\n  taxonomy___node___showInRest\n  taxonomy___node___showUi\n  termGroupId\n  termTaxonomyId\n  uri\n}\n\ninput WpTagFilterInput {\n  children: NodeFilterListInput\n  contentNodes: WpTagToContentNodeConnectionFilterInput\n  count: IntQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  description: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  isContentNode: BooleanQueryOperatorInput\n  isTermNode: BooleanQueryOperatorInput\n  link: StringQueryOperatorInput\n  name: StringQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  posts: WpTagToPostConnectionFilterInput\n  slug: StringQueryOperatorInput\n  taxonomy: WpTagToTaxonomyConnectionEdgeFilterInput\n  taxonomyName: StringQueryOperatorInput\n  termGroupId: IntQueryOperatorInput\n  termTaxonomyId: IntQueryOperatorInput\n  uri: StringQueryOperatorInput\n}\n\ninput WpTagFilterListInput {\n  elemMatch: WpTagFilterInput\n}\n\ntype WpTagGroupConnection {\n  distinct(field: WpTagFieldsEnum!): [String!]!\n  edges: [WpTagEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpTagFieldsEnum!, limit: Int, skip: Int): [WpTagGroupConnection!]!\n  max(field: WpTagFieldsEnum!): Float\n  min(field: WpTagFieldsEnum!): Float\n  nodes: [WpTag!]!\n  pageInfo: PageInfo!\n  sum(field: WpTagFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpTagSortInput {\n  fields: [WpTagFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the tag type and the ContentNode type\n\"\"\"\ntype WpTagToContentNodeConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpContentNode]\n}\n\ninput WpTagToContentNodeConnectionFilterInput {\n  nodes: WpContentNodeFilterListInput\n}\n\n\"\"\"\nConnection between the tag type and the post type\n\"\"\"\ntype WpTagToPostConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpPost]\n}\n\ninput WpTagToPostConnectionFilterInput {\n  nodes: WpPostFilterListInput\n}\n\n\"\"\"\nConnection between the tag type and the Taxonomy type\n\"\"\"\ntype WpTagToTaxonomyConnectionEdge {\n  \"\"\"\n  The node of the connection, without the edges\n  \"\"\"\n  node: WpTaxonomy\n}\n\ninput WpTagToTaxonomyConnectionEdgeFilterInput {\n  node: WpTaxonomyFilterInput\n}\n\n\"\"\"\nA taxonomy object\n\"\"\"\ntype WpTaxonomy implements Node & WpNode {\n  \"\"\"\n  The url path of the first page of the archive page for this content type.\n  \"\"\"\n  archivePath: String\n  children: [Node!]!\n\n  \"\"\"\n  List of Content Types associated with the Taxonomy\n  \"\"\"\n  connectedContentTypes: WpTaxonomyToContentTypeConnection\n\n  \"\"\"\n  Description of the taxonomy. This field is equivalent to WP_Taxonomy-&gt;description\n  \"\"\"\n  description: String\n\n  \"\"\"\n  The plural name of the post type within the GraphQL Schema.\n  \"\"\"\n  graphqlPluralName: String\n\n  \"\"\"\n  The singular name of the post type within the GraphQL Schema.\n  \"\"\"\n  graphqlSingleName: String\n\n  \"\"\"\n  Whether the taxonomy is hierarchical\n  \"\"\"\n  hierarchical: Boolean\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Name of the taxonomy shown in the menu. Usually plural.\n  \"\"\"\n  label: String\n\n  \"\"\"\n  The display name of the taxonomy. This field is equivalent to WP_Taxonomy-&gt;label\n  \"\"\"\n  name: String\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  Whether the taxonomy is publicly queryable\n  \"\"\"\n  public: Boolean\n\n  \"\"\"\n  Name of content type to diplay in REST API &quot;wp/v2&quot; namespace.\n  \"\"\"\n  restBase: String\n\n  \"\"\"\n  The REST Controller class assigned to handling this content type.\n  \"\"\"\n  restControllerClass: String\n\n  \"\"\"\n  Whether to show the taxonomy as part of a tag cloud widget. This field is equivalent to WP_Taxonomy-&gt;show_tagcloud\n  \"\"\"\n  showCloud: Boolean\n\n  \"\"\"\n  Whether to display a column for the taxonomy on its post type listing screens.\n  \"\"\"\n  showInAdminColumn: Boolean\n\n  \"\"\"\n  Whether to add the post type to the GraphQL Schema.\n  \"\"\"\n  showInGraphql: Boolean\n\n  \"\"\"\n  Whether to show the taxonomy in the admin menu\n  \"\"\"\n  showInMenu: Boolean\n\n  \"\"\"\n  Whether the taxonomy is available for selection in navigation menus.\n  \"\"\"\n  showInNavMenus: Boolean\n\n  \"\"\"\n  Whether to show the taxonomy in the quick/bulk edit panel.\n  \"\"\"\n  showInQuickEdit: Boolean\n\n  \"\"\"\n  Whether to add the post type route in the REST API &quot;wp/v2&quot; namespace.\n  \"\"\"\n  showInRest: Boolean\n\n  \"\"\"\n  Whether to generate and allow a UI for managing terms in this taxonomy in the admin\n  \"\"\"\n  showUi: Boolean\n}\n\ntype WpTaxonomyConnection {\n  distinct(field: WpTaxonomyFieldsEnum!): [String!]!\n  edges: [WpTaxonomyEdge!]!\n  group(field: WpTaxonomyFieldsEnum!, limit: Int, skip: Int): [WpTaxonomyGroupConnection!]!\n  max(field: WpTaxonomyFieldsEnum!): Float\n  min(field: WpTaxonomyFieldsEnum!): Float\n  nodes: [WpTaxonomy!]!\n  pageInfo: PageInfo!\n  sum(field: WpTaxonomyFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpTaxonomyEdge {\n  next: WpTaxonomy\n  node: WpTaxonomy!\n  previous: WpTaxonomy\n}\n\nenum WpTaxonomyFieldsEnum {\n  archivePath\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  connectedContentTypes___nodes\n  connectedContentTypes___nodes___archivePath\n  connectedContentTypes___nodes___canExport\n  connectedContentTypes___nodes___children\n  connectedContentTypes___nodes___children___children\n  connectedContentTypes___nodes___children___id\n  connectedContentTypes___nodes___connectedTaxonomies___nodes\n  connectedContentTypes___nodes___contentNodes___nodes\n  connectedContentTypes___nodes___deleteWithUser\n  connectedContentTypes___nodes___description\n  connectedContentTypes___nodes___excludeFromSearch\n  connectedContentTypes___nodes___graphqlPluralName\n  connectedContentTypes___nodes___graphqlSingleName\n  connectedContentTypes___nodes___hasArchive\n  connectedContentTypes___nodes___hierarchical\n  connectedContentTypes___nodes___id\n  connectedContentTypes___nodes___internal___content\n  connectedContentTypes___nodes___internal___contentDigest\n  connectedContentTypes___nodes___internal___description\n  connectedContentTypes___nodes___internal___fieldOwners\n  connectedContentTypes___nodes___internal___ignoreType\n  connectedContentTypes___nodes___internal___mediaType\n  connectedContentTypes___nodes___internal___owner\n  connectedContentTypes___nodes___internal___type\n  connectedContentTypes___nodes___isContentNode\n  connectedContentTypes___nodes___isFrontPage\n  connectedContentTypes___nodes___isPostsPage\n  connectedContentTypes___nodes___isTermNode\n  connectedContentTypes___nodes___label\n  connectedContentTypes___nodes___labels___addNew\n  connectedContentTypes___nodes___labels___addNewItem\n  connectedContentTypes___nodes___labels___allItems\n  connectedContentTypes___nodes___labels___archives\n  connectedContentTypes___nodes___labels___attributes\n  connectedContentTypes___nodes___labels___editItem\n  connectedContentTypes___nodes___labels___featuredImage\n  connectedContentTypes___nodes___labels___filterItemsList\n  connectedContentTypes___nodes___labels___insertIntoItem\n  connectedContentTypes___nodes___labels___itemsList\n  connectedContentTypes___nodes___labels___itemsListNavigation\n  connectedContentTypes___nodes___labels___menuName\n  connectedContentTypes___nodes___labels___name\n  connectedContentTypes___nodes___labels___newItem\n  connectedContentTypes___nodes___labels___notFound\n  connectedContentTypes___nodes___labels___notFoundInTrash\n  connectedContentTypes___nodes___labels___parentItemColon\n  connectedContentTypes___nodes___labels___removeFeaturedImage\n  connectedContentTypes___nodes___labels___searchItems\n  connectedContentTypes___nodes___labels___setFeaturedImage\n  connectedContentTypes___nodes___labels___singularName\n  connectedContentTypes___nodes___labels___uploadedToThisItem\n  connectedContentTypes___nodes___labels___useFeaturedImage\n  connectedContentTypes___nodes___labels___viewItem\n  connectedContentTypes___nodes___labels___viewItems\n  connectedContentTypes___nodes___menuIcon\n  connectedContentTypes___nodes___menuPosition\n  connectedContentTypes___nodes___name\n  connectedContentTypes___nodes___nodeType\n  connectedContentTypes___nodes___parent___children\n  connectedContentTypes___nodes___parent___id\n  connectedContentTypes___nodes___public\n  connectedContentTypes___nodes___publiclyQueryable\n  connectedContentTypes___nodes___restBase\n  connectedContentTypes___nodes___restControllerClass\n  connectedContentTypes___nodes___showInAdminBar\n  connectedContentTypes___nodes___showInGraphql\n  connectedContentTypes___nodes___showInMenu\n  connectedContentTypes___nodes___showInNavMenus\n  connectedContentTypes___nodes___showInRest\n  connectedContentTypes___nodes___showUi\n  connectedContentTypes___nodes___uri\n  description\n  graphqlPluralName\n  graphqlSingleName\n  hierarchical\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  label\n  name\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  public\n  restBase\n  restControllerClass\n  showCloud\n  showInAdminColumn\n  showInGraphql\n  showInMenu\n  showInNavMenus\n  showInQuickEdit\n  showInRest\n  showUi\n}\n\ninput WpTaxonomyFilterInput {\n  archivePath: StringQueryOperatorInput\n  children: NodeFilterListInput\n  connectedContentTypes: WpTaxonomyToContentTypeConnectionFilterInput\n  description: StringQueryOperatorInput\n  graphqlPluralName: StringQueryOperatorInput\n  graphqlSingleName: StringQueryOperatorInput\n  hierarchical: BooleanQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  label: StringQueryOperatorInput\n  name: StringQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  public: BooleanQueryOperatorInput\n  restBase: StringQueryOperatorInput\n  restControllerClass: StringQueryOperatorInput\n  showCloud: BooleanQueryOperatorInput\n  showInAdminColumn: BooleanQueryOperatorInput\n  showInGraphql: BooleanQueryOperatorInput\n  showInMenu: BooleanQueryOperatorInput\n  showInNavMenus: BooleanQueryOperatorInput\n  showInQuickEdit: BooleanQueryOperatorInput\n  showInRest: BooleanQueryOperatorInput\n  showUi: BooleanQueryOperatorInput\n}\n\ninput WpTaxonomyFilterListInput {\n  elemMatch: WpTaxonomyFilterInput\n}\n\ntype WpTaxonomyGroupConnection {\n  distinct(field: WpTaxonomyFieldsEnum!): [String!]!\n  edges: [WpTaxonomyEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpTaxonomyFieldsEnum!, limit: Int, skip: Int): [WpTaxonomyGroupConnection!]!\n  max(field: WpTaxonomyFieldsEnum!): Float\n  min(field: WpTaxonomyFieldsEnum!): Float\n  nodes: [WpTaxonomy!]!\n  pageInfo: PageInfo!\n  sum(field: WpTaxonomyFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpTaxonomySortInput {\n  fields: [WpTaxonomyFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the Taxonomy type and the ContentType type\n\"\"\"\ntype WpTaxonomyToContentTypeConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpContentType]\n}\n\ninput WpTaxonomyToContentTypeConnectionFilterInput {\n  nodes: WpContentTypeFilterListInput\n}\n\ninterface WpTermNode implements Node {\n  children: [Node!]!\n\n  \"\"\"\n  The number of objects connected to the object\n  \"\"\"\n  count: Int\n\n  \"\"\"\n  Identifies the primary key from the database.\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  The description of the object\n  \"\"\"\n  description: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  The link to the term\n  \"\"\"\n  link: String\n\n  \"\"\"\n  The human friendly name of the object.\n  \"\"\"\n  name: String\n  nodeType: String\n  parent: Node\n\n  \"\"\"\n  An alphanumeric identifier for the object unique to its type.\n  \"\"\"\n  slug: String\n\n  \"\"\"\n  The name of the taxonomy that the object is associated with\n  \"\"\"\n  taxonomyName: String\n\n  \"\"\"\n  The ID of the term group that this term object belongs to\n  \"\"\"\n  termGroupId: Int\n\n  \"\"\"\n  The taxonomy ID that the object is associated with\n  \"\"\"\n  termTaxonomyId: Int\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n}\n\ntype WpTermNodeConnection {\n  distinct(field: WpTermNodeFieldsEnum!): [String!]!\n  edges: [WpTermNodeEdge!]!\n  group(field: WpTermNodeFieldsEnum!, limit: Int, skip: Int): [WpTermNodeGroupConnection!]!\n  max(field: WpTermNodeFieldsEnum!): Float\n  min(field: WpTermNodeFieldsEnum!): Float\n  nodes: [WpTermNode!]!\n  pageInfo: PageInfo!\n  sum(field: WpTermNodeFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpTermNodeEdge {\n  next: WpTermNode\n  node: WpTermNode!\n  previous: WpTermNode\n}\n\nenum WpTermNodeFieldsEnum {\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  count\n  databaseId\n  description\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  isContentNode\n  isTermNode\n  link\n  name\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  slug\n  taxonomyName\n  termGroupId\n  termTaxonomyId\n  uri\n}\n\ninput WpTermNodeFilterInput {\n  children: NodeFilterListInput\n  count: IntQueryOperatorInput\n  databaseId: IntQueryOperatorInput\n  description: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  isContentNode: BooleanQueryOperatorInput\n  isTermNode: BooleanQueryOperatorInput\n  link: StringQueryOperatorInput\n  name: StringQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n  slug: StringQueryOperatorInput\n  taxonomyName: StringQueryOperatorInput\n  termGroupId: IntQueryOperatorInput\n  termTaxonomyId: IntQueryOperatorInput\n  uri: StringQueryOperatorInput\n}\n\ninput WpTermNodeFilterListInput {\n  elemMatch: WpTermNodeFilterInput\n}\n\ntype WpTermNodeGroupConnection {\n  distinct(field: WpTermNodeFieldsEnum!): [String!]!\n  edges: [WpTermNodeEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpTermNodeFieldsEnum!, limit: Int, skip: Int): [WpTermNodeGroupConnection!]!\n  max(field: WpTermNodeFieldsEnum!): Float\n  min(field: WpTermNodeFieldsEnum!): Float\n  nodes: [WpTermNode!]!\n  pageInfo: PageInfo!\n  sum(field: WpTermNodeFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpTermNodeSortInput {\n  fields: [WpTermNodeFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\ntribe/events-list block\n\"\"\"\ntype WpTribeEventsListBlock implements WpBlock {\n  attributes: WpTribeEventsListBlockAttributes\n\n  \"\"\"\n  Block attributes, JSON encoded\n  \"\"\"\n  attributesJSON: String\n\n  \"\"\"\n  Server side rendered content.\n  \"\"\"\n  dynamicContent: String\n\n  \"\"\"\n  Gutenberg blocks\n  \"\"\"\n  innerBlocks: [WpBlock!]\n\n  \"\"\"\n  Is block rendered server side.\n  \"\"\"\n  isDynamic: Boolean!\n\n  \"\"\"\n  Name of the block.\n  \"\"\"\n  name: String!\n  order: Int!\n\n  \"\"\"\n  Original HTML content.\n  \"\"\"\n  originalContent: String\n\n  \"\"\"\n  Parent post.\n  \"\"\"\n  parentNode: WpNode!\n\n  \"\"\"\n  Parent post id.\n  \"\"\"\n  parentNodeDatabaseId: Int!\n\n  \"\"\"\n  Original HTML content with inner blocks.\n  \"\"\"\n  saveContent: String\n}\n\ntype WpTribeEventsListBlockAttributes {\n  className: String\n  lock: JSON\n}\n\ninterface WpUniformResourceIdentifiable {\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  id: ID!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n}\n\n\"\"\"\nA User object\n\"\"\"\ntype WpUser implements Node & WpCommenter & WpDatabaseIdentifier & WpNode & WpUniformResourceIdentifiable {\n  \"\"\"\n  Avatar object for user. The avatar object can be retrieved in different sizes by specifying the size argument.\n  \"\"\"\n  avatar: WpAvatar\n\n  \"\"\"\n  Connection between the User type and the BlockEditorPreview type\n  \"\"\"\n  blockEditorPreviews: WpUserToBlockEditorPreviewConnection\n\n  \"\"\"\n  User metadata option name. Usually it will be &quot;wp_capabilities&quot;.\n  \"\"\"\n  capKey: String\n\n  \"\"\"\n  A list of capabilities (permissions) granted to the user\n  \"\"\"\n  capabilities: [String]\n  children: [Node!]!\n\n  \"\"\"\n  Connection between the User type and the Comment type\n  \"\"\"\n  comments: WpUserToCommentConnection\n\n  \"\"\"\n  Identifies the primary key from the database.\n  \"\"\"\n  databaseId: Int!\n\n  \"\"\"\n  Description of the user.\n  \"\"\"\n  description: String\n\n  \"\"\"\n  Email address of the user. This is equivalent to the WP_User-&gt;user_email property.\n  \"\"\"\n  email: String\n\n  \"\"\"\n  A complete list of capabilities including capabilities inherited from a role. This is equivalent to the array keys of WP_User-&gt;allcaps.\n  \"\"\"\n  extraCapabilities: [String]\n\n  \"\"\"\n  First name of the user. This is equivalent to the WP_User-&gt;user_first_name property.\n  \"\"\"\n  firstName: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  Whether the node is a Content Node\n  \"\"\"\n  isContentNode: Boolean!\n\n  \"\"\"\n  Whether the node is a Term\n  \"\"\"\n  isTermNode: Boolean!\n\n  \"\"\"\n  Last name of the user. This is equivalent to the WP_User-&gt;user_last_name property.\n  \"\"\"\n  lastName: String\n\n  \"\"\"\n  The preferred language locale set for the user. Value derived from get_user_locale().\n  \"\"\"\n  locale: String\n\n  \"\"\"\n  Display name of the user. This is equivalent to the WP_User-&gt;dispaly_name property.\n  \"\"\"\n  name: String\n\n  \"\"\"\n  The nicename for the user. This field is equivalent to WP_User-&gt;user_nicename\n  \"\"\"\n  nicename: String\n\n  \"\"\"\n  Nickname of the user.\n  \"\"\"\n  nickname: String\n  nodeType: String\n\n  \"\"\"\n  Connection between the User type and the page type\n  \"\"\"\n  pages: WpUserToPageConnection\n  parent: Node\n\n  \"\"\"\n  Connection between the User type and the post type\n  \"\"\"\n  posts: WpUserToPostConnection\n\n  \"\"\"\n  The date the user registered or was created. The field follows a full ISO8601 date string format.\n  \"\"\"\n  registeredDate: String\n\n  \"\"\"\n  Connection between the User type and the UserRole type\n  \"\"\"\n  roles: WpUserToUserRoleConnection\n\n  \"\"\"\n  The slug for the user. This field is equivalent to WP_User-&gt;user_nicename\n  \"\"\"\n  slug: String\n\n  \"\"\"\n  The unique resource identifier path\n  \"\"\"\n  uri: String\n\n  \"\"\"\n  A website url that is associated with the user.\n  \"\"\"\n  url: String\n\n  \"\"\"\n  Username for the user. This field is equivalent to WP_User-&gt;user_login.\n  \"\"\"\n  username: String\n}\n\ntype WpUserConnection {\n  distinct(field: WpUserFieldsEnum!): [String!]!\n  edges: [WpUserEdge!]!\n  group(field: WpUserFieldsEnum!, limit: Int, skip: Int): [WpUserGroupConnection!]!\n  max(field: WpUserFieldsEnum!): Float\n  min(field: WpUserFieldsEnum!): Float\n  nodes: [WpUser!]!\n  pageInfo: PageInfo!\n  sum(field: WpUserFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpUserEdge {\n  next: WpUser\n  node: WpUser!\n  previous: WpUser\n}\n\nenum WpUserFieldsEnum {\n  avatar___default\n  avatar___extraAttr\n  avatar___forceDefault\n  avatar___foundAvatar\n  avatar___height\n  avatar___rating\n  avatar___scheme\n  avatar___size\n  avatar___url\n  avatar___width\n  blockEditorPreviews___nodes\n  blockEditorPreviews___nodes___authorDatabaseId\n  blockEditorPreviews___nodes___authorId\n  blockEditorPreviews___nodes___blocks\n  blockEditorPreviews___nodes___blocksJSON\n  blockEditorPreviews___nodes___blocks___attributesJSON\n  blockEditorPreviews___nodes___blocks___dynamicContent\n  blockEditorPreviews___nodes___blocks___innerBlocks\n  blockEditorPreviews___nodes___blocks___isDynamic\n  blockEditorPreviews___nodes___blocks___name\n  blockEditorPreviews___nodes___blocks___order\n  blockEditorPreviews___nodes___blocks___originalContent\n  blockEditorPreviews___nodes___blocks___parentNodeDatabaseId\n  blockEditorPreviews___nodes___blocks___saveContent\n  blockEditorPreviews___nodes___children\n  blockEditorPreviews___nodes___children___children\n  blockEditorPreviews___nodes___children___id\n  blockEditorPreviews___nodes___content\n  blockEditorPreviews___nodes___contentTypeName\n  blockEditorPreviews___nodes___databaseId\n  blockEditorPreviews___nodes___date\n  blockEditorPreviews___nodes___dateGmt\n  blockEditorPreviews___nodes___desiredSlug\n  blockEditorPreviews___nodes___enclosure\n  blockEditorPreviews___nodes___guid\n  blockEditorPreviews___nodes___id\n  blockEditorPreviews___nodes___internal___content\n  blockEditorPreviews___nodes___internal___contentDigest\n  blockEditorPreviews___nodes___internal___description\n  blockEditorPreviews___nodes___internal___fieldOwners\n  blockEditorPreviews___nodes___internal___ignoreType\n  blockEditorPreviews___nodes___internal___mediaType\n  blockEditorPreviews___nodes___internal___owner\n  blockEditorPreviews___nodes___internal___type\n  blockEditorPreviews___nodes___isContentNode\n  blockEditorPreviews___nodes___isTermNode\n  blockEditorPreviews___nodes___lastUpdateTime\n  blockEditorPreviews___nodes___link\n  blockEditorPreviews___nodes___modified\n  blockEditorPreviews___nodes___modifiedGmt\n  blockEditorPreviews___nodes___nodeType\n  blockEditorPreviews___nodes___parent___children\n  blockEditorPreviews___nodes___parent___id\n  blockEditorPreviews___nodes___previewedDatabaseId\n  blockEditorPreviews___nodes___previewedParentDatabaseId\n  blockEditorPreviews___nodes___previewed___blocks\n  blockEditorPreviews___nodes___previewed___blocksJSON\n  blockEditorPreviews___nodes___previewed___children\n  blockEditorPreviews___nodes___previewed___id\n  blockEditorPreviews___nodes___previewed___nodeType\n  blockEditorPreviews___nodes___previewed___previewBlocks\n  blockEditorPreviews___nodes___previewed___previewBlocksJSON\n  blockEditorPreviews___nodes___slug\n  blockEditorPreviews___nodes___status\n  blockEditorPreviews___nodes___template___templateName\n  blockEditorPreviews___nodes___title\n  blockEditorPreviews___nodes___uri\n  capKey\n  capabilities\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  comments___nodes\n  comments___nodes___agent\n  comments___nodes___approved\n  comments___nodes___authorIp\n  comments___nodes___children\n  comments___nodes___children___children\n  comments___nodes___children___id\n  comments___nodes___content\n  comments___nodes___databaseId\n  comments___nodes___date\n  comments___nodes___dateGmt\n  comments___nodes___id\n  comments___nodes___internal___content\n  comments___nodes___internal___contentDigest\n  comments___nodes___internal___description\n  comments___nodes___internal___fieldOwners\n  comments___nodes___internal___ignoreType\n  comments___nodes___internal___mediaType\n  comments___nodes___internal___owner\n  comments___nodes___internal___type\n  comments___nodes___karma\n  comments___nodes___nodeType\n  comments___nodes___parentDatabaseId\n  comments___nodes___parentId\n  comments___nodes___parent___children\n  comments___nodes___parent___id\n  comments___nodes___replies___nodes\n  comments___nodes___type\n  databaseId\n  description\n  email\n  extraCapabilities\n  firstName\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  isContentNode\n  isTermNode\n  lastName\n  locale\n  name\n  nicename\n  nickname\n  nodeType\n  pages___nodes\n  pages___nodes___ancestors___nodes\n  pages___nodes___authorDatabaseId\n  pages___nodes___authorId\n  pages___nodes___blocks\n  pages___nodes___blocksJSON\n  pages___nodes___blocks___attributesJSON\n  pages___nodes___blocks___dynamicContent\n  pages___nodes___blocks___innerBlocks\n  pages___nodes___blocks___isDynamic\n  pages___nodes___blocks___name\n  pages___nodes___blocks___order\n  pages___nodes___blocks___originalContent\n  pages___nodes___blocks___parentNodeDatabaseId\n  pages___nodes___blocks___saveContent\n  pages___nodes___children\n  pages___nodes___children___children\n  pages___nodes___children___id\n  pages___nodes___commentCount\n  pages___nodes___commentStatus\n  pages___nodes___comments___nodes\n  pages___nodes___content\n  pages___nodes___contentTypeName\n  pages___nodes___databaseId\n  pages___nodes___date\n  pages___nodes___dateGmt\n  pages___nodes___desiredSlug\n  pages___nodes___enclosure\n  pages___nodes___featuredImageDatabaseId\n  pages___nodes___featuredImageId\n  pages___nodes___guid\n  pages___nodes___id\n  pages___nodes___internal___content\n  pages___nodes___internal___contentDigest\n  pages___nodes___internal___description\n  pages___nodes___internal___fieldOwners\n  pages___nodes___internal___ignoreType\n  pages___nodes___internal___mediaType\n  pages___nodes___internal___owner\n  pages___nodes___internal___type\n  pages___nodes___isContentNode\n  pages___nodes___isFrontPage\n  pages___nodes___isPostsPage\n  pages___nodes___isPrivacyPage\n  pages___nodes___isRevision\n  pages___nodes___isTermNode\n  pages___nodes___link\n  pages___nodes___menuOrder\n  pages___nodes___modified\n  pages___nodes___modifiedGmt\n  pages___nodes___nodeType\n  pages___nodes___parentDatabaseId\n  pages___nodes___parentId\n  pages___nodes___parent___children\n  pages___nodes___parent___id\n  pages___nodes___previewBlocks\n  pages___nodes___previewBlocksJSON\n  pages___nodes___previewBlocks___attributesJSON\n  pages___nodes___previewBlocks___dynamicContent\n  pages___nodes___previewBlocks___innerBlocks\n  pages___nodes___previewBlocks___isDynamic\n  pages___nodes___previewBlocks___name\n  pages___nodes___previewBlocks___order\n  pages___nodes___previewBlocks___originalContent\n  pages___nodes___previewBlocks___parentNodeDatabaseId\n  pages___nodes___previewBlocks___saveContent\n  pages___nodes___slug\n  pages___nodes___status\n  pages___nodes___template___templateName\n  pages___nodes___title\n  pages___nodes___uri\n  pages___nodes___wpChildren___nodes\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  posts___nodes\n  posts___nodes___authorDatabaseId\n  posts___nodes___authorId\n  posts___nodes___blocks\n  posts___nodes___blocksJSON\n  posts___nodes___blocks___attributesJSON\n  posts___nodes___blocks___dynamicContent\n  posts___nodes___blocks___innerBlocks\n  posts___nodes___blocks___isDynamic\n  posts___nodes___blocks___name\n  posts___nodes___blocks___order\n  posts___nodes___blocks___originalContent\n  posts___nodes___blocks___parentNodeDatabaseId\n  posts___nodes___blocks___saveContent\n  posts___nodes___categories___nodes\n  posts___nodes___children\n  posts___nodes___children___children\n  posts___nodes___children___id\n  posts___nodes___commentCount\n  posts___nodes___commentStatus\n  posts___nodes___comments___nodes\n  posts___nodes___content\n  posts___nodes___contentTypeName\n  posts___nodes___databaseId\n  posts___nodes___date\n  posts___nodes___dateGmt\n  posts___nodes___desiredSlug\n  posts___nodes___enclosure\n  posts___nodes___excerpt\n  posts___nodes___featuredImageDatabaseId\n  posts___nodes___featuredImageId\n  posts___nodes___guid\n  posts___nodes___id\n  posts___nodes___internal___content\n  posts___nodes___internal___contentDigest\n  posts___nodes___internal___description\n  posts___nodes___internal___fieldOwners\n  posts___nodes___internal___ignoreType\n  posts___nodes___internal___mediaType\n  posts___nodes___internal___owner\n  posts___nodes___internal___type\n  posts___nodes___isContentNode\n  posts___nodes___isRevision\n  posts___nodes___isSticky\n  posts___nodes___isTermNode\n  posts___nodes___link\n  posts___nodes___modified\n  posts___nodes___modifiedGmt\n  posts___nodes___nodeType\n  posts___nodes___parent___children\n  posts___nodes___parent___id\n  posts___nodes___pingStatus\n  posts___nodes___pinged\n  posts___nodes___postFormats___nodes\n  posts___nodes___previewBlocks\n  posts___nodes___previewBlocksJSON\n  posts___nodes___previewBlocks___attributesJSON\n  posts___nodes___previewBlocks___dynamicContent\n  posts___nodes___previewBlocks___innerBlocks\n  posts___nodes___previewBlocks___isDynamic\n  posts___nodes___previewBlocks___name\n  posts___nodes___previewBlocks___order\n  posts___nodes___previewBlocks___originalContent\n  posts___nodes___previewBlocks___parentNodeDatabaseId\n  posts___nodes___previewBlocks___saveContent\n  posts___nodes___slug\n  posts___nodes___status\n  posts___nodes___tags___nodes\n  posts___nodes___template___templateName\n  posts___nodes___terms___nodes\n  posts___nodes___title\n  posts___nodes___toPing\n  posts___nodes___uri\n  registeredDate\n  roles___nodes\n  roles___nodes___capabilities\n  roles___nodes___children\n  roles___nodes___children___children\n  roles___nodes___children___id\n  roles___nodes___displayName\n  roles___nodes___id\n  roles___nodes___internal___content\n  roles___nodes___internal___contentDigest\n  roles___nodes___internal___description\n  roles___nodes___internal___fieldOwners\n  roles___nodes___internal___ignoreType\n  roles___nodes___internal___mediaType\n  roles___nodes___internal___owner\n  roles___nodes___internal___type\n  roles___nodes___name\n  roles___nodes___nodeType\n  roles___nodes___parent___children\n  roles___nodes___parent___id\n  slug\n  uri\n  url\n  username\n}\n\ninput WpUserFilterInput {\n  avatar: WpAvatarFilterInput\n  blockEditorPreviews: WpUserToBlockEditorPreviewConnectionFilterInput\n  capKey: StringQueryOperatorInput\n  capabilities: StringQueryOperatorInput\n  children: NodeFilterListInput\n  comments: WpUserToCommentConnectionFilterInput\n  databaseId: IntQueryOperatorInput\n  description: StringQueryOperatorInput\n  email: StringQueryOperatorInput\n  extraCapabilities: StringQueryOperatorInput\n  firstName: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  isContentNode: BooleanQueryOperatorInput\n  isTermNode: BooleanQueryOperatorInput\n  lastName: StringQueryOperatorInput\n  locale: StringQueryOperatorInput\n  name: StringQueryOperatorInput\n  nicename: StringQueryOperatorInput\n  nickname: StringQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  pages: WpUserToPageConnectionFilterInput\n  parent: NodeFilterInput\n  posts: WpUserToPostConnectionFilterInput\n  registeredDate: StringQueryOperatorInput\n  roles: WpUserToUserRoleConnectionFilterInput\n  slug: StringQueryOperatorInput\n  uri: StringQueryOperatorInput\n  url: StringQueryOperatorInput\n  username: StringQueryOperatorInput\n}\n\ntype WpUserGroupConnection {\n  distinct(field: WpUserFieldsEnum!): [String!]!\n  edges: [WpUserEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpUserFieldsEnum!, limit: Int, skip: Int): [WpUserGroupConnection!]!\n  max(field: WpUserFieldsEnum!): Float\n  min(field: WpUserFieldsEnum!): Float\n  nodes: [WpUser!]!\n  pageInfo: PageInfo!\n  sum(field: WpUserFieldsEnum!): Float\n  totalCount: Int!\n}\n\n\"\"\"\nA user role object\n\"\"\"\ntype WpUserRole implements Node & WpNode {\n  \"\"\"\n  The capabilities that belong to this role\n  \"\"\"\n  capabilities: [String]\n  children: [Node!]!\n\n  \"\"\"\n  The display name of the role\n  \"\"\"\n  displayName: String\n  id: ID!\n  internal: Internal!\n\n  \"\"\"\n  The registered name of the role\n  \"\"\"\n  name: String\n  nodeType: String\n  parent: Node\n}\n\ntype WpUserRoleConnection {\n  distinct(field: WpUserRoleFieldsEnum!): [String!]!\n  edges: [WpUserRoleEdge!]!\n  group(field: WpUserRoleFieldsEnum!, limit: Int, skip: Int): [WpUserRoleGroupConnection!]!\n  max(field: WpUserRoleFieldsEnum!): Float\n  min(field: WpUserRoleFieldsEnum!): Float\n  nodes: [WpUserRole!]!\n  pageInfo: PageInfo!\n  sum(field: WpUserRoleFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype WpUserRoleEdge {\n  next: WpUserRole\n  node: WpUserRole!\n  previous: WpUserRole\n}\n\nenum WpUserRoleFieldsEnum {\n  capabilities\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  displayName\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  name\n  nodeType\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n}\n\ninput WpUserRoleFilterInput {\n  capabilities: StringQueryOperatorInput\n  children: NodeFilterListInput\n  displayName: StringQueryOperatorInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  name: StringQueryOperatorInput\n  nodeType: StringQueryOperatorInput\n  parent: NodeFilterInput\n}\n\ninput WpUserRoleFilterListInput {\n  elemMatch: WpUserRoleFilterInput\n}\n\ntype WpUserRoleGroupConnection {\n  distinct(field: WpUserRoleFieldsEnum!): [String!]!\n  edges: [WpUserRoleEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: WpUserRoleFieldsEnum!, limit: Int, skip: Int): [WpUserRoleGroupConnection!]!\n  max(field: WpUserRoleFieldsEnum!): Float\n  min(field: WpUserRoleFieldsEnum!): Float\n  nodes: [WpUserRole!]!\n  pageInfo: PageInfo!\n  sum(field: WpUserRoleFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput WpUserRoleSortInput {\n  fields: [WpUserRoleFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\ninput WpUserSortInput {\n  fields: [WpUserFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n\n\"\"\"\nConnection between the User type and the BlockEditorPreview type\n\"\"\"\ntype WpUserToBlockEditorPreviewConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpBlockEditorPreview]\n}\n\ninput WpUserToBlockEditorPreviewConnectionFilterInput {\n  nodes: WpBlockEditorPreviewFilterListInput\n}\n\n\"\"\"\nConnection between the User type and the Comment type\n\"\"\"\ntype WpUserToCommentConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpComment]\n}\n\ninput WpUserToCommentConnectionFilterInput {\n  nodes: WpCommentFilterListInput\n}\n\n\"\"\"\nConnection between the User type and the page type\n\"\"\"\ntype WpUserToPageConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpPage]\n}\n\ninput WpUserToPageConnectionFilterInput {\n  nodes: WpPageFilterListInput\n}\n\n\"\"\"\nConnection between the User type and the post type\n\"\"\"\ntype WpUserToPostConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpPost]\n}\n\ninput WpUserToPostConnectionFilterInput {\n  nodes: WpPostFilterListInput\n}\n\n\"\"\"\nConnection between the User type and the UserRole type\n\"\"\"\ntype WpUserToUserRoleConnection {\n  \"\"\"\n  The nodes of the connection, without the edges\n  \"\"\"\n  nodes: [WpUserRole]\n}\n\ninput WpUserToUserRoleConnectionFilterInput {\n  nodes: WpUserRoleFilterListInput\n}\n\n\"\"\"\nInformation needed by gatsby-source-wordpress.\n\"\"\"\ntype WpWPGatsby {\n  \"\"\"\n  Returns wether or not pretty permalinks are enabled.\n  \"\"\"\n  arePrettyPermalinksEnabled: Boolean\n\n  \"\"\"\n  Wether or not the Preview frontend URL is online.\n  \"\"\"\n  isPreviewFrontendOnline: Boolean\n}\n\ninput WpWPGatsbyFilterInput {\n  arePrettyPermalinksEnabled: BooleanQueryOperatorInput\n  isPreviewFrontendOnline: BooleanQueryOperatorInput\n}\n\n\"\"\"\nThe writing setting type\n\"\"\"\ntype WpWritingSettings {\n  \"\"\"\n  Standard-Beitragskategorie.\n  \"\"\"\n  defaultCategory: Int\n\n  \"\"\"\n  Standard-Beitragsformat.\n  \"\"\"\n  defaultPostFormat: String\n\n  \"\"\"\n  Emoticons wie :-) und :-P als Grafiken anzeigen.\n  \"\"\"\n  useSmilies: Boolean\n}\n\ninput WpWritingSettingsFilterInput {\n  defaultCategory: IntQueryOperatorInput\n  defaultPostFormat: StringQueryOperatorInput\n  useSmilies: BooleanQueryOperatorInput\n}\n\ntype internal__events implements Node {\n  children: [Node!]!\n  events: [internal__eventsEvents]\n  id: ID!\n  internal: Internal!\n  next_rest_url: String\n  parent: Node\n  previous_rest_url: String\n  rest_url: String\n  total: Int\n  total_pages: Int\n}\n\ntype internal__eventsConnection {\n  distinct(field: internal__eventsFieldsEnum!): [String!]!\n  edges: [internal__eventsEdge!]!\n  group(field: internal__eventsFieldsEnum!, limit: Int, skip: Int): [internal__eventsGroupConnection!]!\n  max(field: internal__eventsFieldsEnum!): Float\n  min(field: internal__eventsFieldsEnum!): Float\n  nodes: [internal__events!]!\n  pageInfo: PageInfo!\n  sum(field: internal__eventsFieldsEnum!): Float\n  totalCount: Int!\n}\n\ntype internal__eventsEdge {\n  next: internal__events\n  node: internal__events!\n  previous: internal__events\n}\n\ntype internal__eventsEvents {\n  all_day: Boolean\n  alternative_id: Int\n  author: String\n  categories: [internal__eventsEventsCategories]\n  cost: String\n  cost_details: internal__eventsEventsCost_details\n  date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  date_utc(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  description: String\n  end_date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  end_date_details: internal__eventsEventsEnd_date_details\n  excerpt: String\n  featured: Boolean\n  global_id: String\n  global_id_lineage: [String]\n  hide_from_listings: Boolean\n  image: Boolean\n  modified(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  modified_utc(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  rest_url: String\n  show_map: Boolean\n  show_map_link: Boolean\n  slug: String\n  start_date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  start_date_details: internal__eventsEventsStart_date_details\n  status: String\n  sticky: Boolean\n  timezone: String\n  timezone_abbr: String\n  title: String\n  url: String\n  utc_end_date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  utc_end_date_details: internal__eventsEventsUtc_end_date_details\n  utc_start_date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  utc_start_date_details: internal__eventsEventsUtc_start_date_details\n  venue: internal__eventsEventsVenue\n  website: String\n}\n\ntype internal__eventsEventsCategories {\n  alternative_id: Int\n  alternative_parent: Int\n  count: Int\n  description: String\n  filter: String\n  name: String\n  slug: String\n  taxonomy: String\n  term_group: Int\n  term_taxonomy_id: Int\n  urls: internal__eventsEventsCategoriesUrls\n}\n\ninput internal__eventsEventsCategoriesFilterInput {\n  alternative_id: IntQueryOperatorInput\n  alternative_parent: IntQueryOperatorInput\n  count: IntQueryOperatorInput\n  description: StringQueryOperatorInput\n  filter: StringQueryOperatorInput\n  name: StringQueryOperatorInput\n  slug: StringQueryOperatorInput\n  taxonomy: StringQueryOperatorInput\n  term_group: IntQueryOperatorInput\n  term_taxonomy_id: IntQueryOperatorInput\n  urls: internal__eventsEventsCategoriesUrlsFilterInput\n}\n\ninput internal__eventsEventsCategoriesFilterListInput {\n  elemMatch: internal__eventsEventsCategoriesFilterInput\n}\n\ntype internal__eventsEventsCategoriesUrls {\n  collection: String\n  self: String\n  up: String\n}\n\ninput internal__eventsEventsCategoriesUrlsFilterInput {\n  collection: StringQueryOperatorInput\n  self: StringQueryOperatorInput\n  up: StringQueryOperatorInput\n}\n\ntype internal__eventsEventsCost_details {\n  currency_code: String\n  currency_position: String\n  currency_symbol: String\n}\n\ninput internal__eventsEventsCost_detailsFilterInput {\n  currency_code: StringQueryOperatorInput\n  currency_position: StringQueryOperatorInput\n  currency_symbol: StringQueryOperatorInput\n}\n\ntype internal__eventsEventsEnd_date_details {\n  day: String\n  hour: String\n  minutes: String\n  month: String\n  seconds: String\n  year(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n}\n\ninput internal__eventsEventsEnd_date_detailsFilterInput {\n  day: StringQueryOperatorInput\n  hour: StringQueryOperatorInput\n  minutes: StringQueryOperatorInput\n  month: StringQueryOperatorInput\n  seconds: StringQueryOperatorInput\n  year: DateQueryOperatorInput\n}\n\ninput internal__eventsEventsFilterInput {\n  all_day: BooleanQueryOperatorInput\n  alternative_id: IntQueryOperatorInput\n  author: StringQueryOperatorInput\n  categories: internal__eventsEventsCategoriesFilterListInput\n  cost: StringQueryOperatorInput\n  cost_details: internal__eventsEventsCost_detailsFilterInput\n  date: DateQueryOperatorInput\n  date_utc: DateQueryOperatorInput\n  description: StringQueryOperatorInput\n  end_date: DateQueryOperatorInput\n  end_date_details: internal__eventsEventsEnd_date_detailsFilterInput\n  excerpt: StringQueryOperatorInput\n  featured: BooleanQueryOperatorInput\n  global_id: StringQueryOperatorInput\n  global_id_lineage: StringQueryOperatorInput\n  hide_from_listings: BooleanQueryOperatorInput\n  image: BooleanQueryOperatorInput\n  modified: DateQueryOperatorInput\n  modified_utc: DateQueryOperatorInput\n  rest_url: StringQueryOperatorInput\n  show_map: BooleanQueryOperatorInput\n  show_map_link: BooleanQueryOperatorInput\n  slug: StringQueryOperatorInput\n  start_date: DateQueryOperatorInput\n  start_date_details: internal__eventsEventsStart_date_detailsFilterInput\n  status: StringQueryOperatorInput\n  sticky: BooleanQueryOperatorInput\n  timezone: StringQueryOperatorInput\n  timezone_abbr: StringQueryOperatorInput\n  title: StringQueryOperatorInput\n  url: StringQueryOperatorInput\n  utc_end_date: DateQueryOperatorInput\n  utc_end_date_details: internal__eventsEventsUtc_end_date_detailsFilterInput\n  utc_start_date: DateQueryOperatorInput\n  utc_start_date_details: internal__eventsEventsUtc_start_date_detailsFilterInput\n  venue: internal__eventsEventsVenueFilterInput\n  website: StringQueryOperatorInput\n}\n\ninput internal__eventsEventsFilterListInput {\n  elemMatch: internal__eventsEventsFilterInput\n}\n\ntype internal__eventsEventsStart_date_details {\n  day: String\n  hour: String\n  minutes: String\n  month: String\n  seconds: String\n  year(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n}\n\ninput internal__eventsEventsStart_date_detailsFilterInput {\n  day: StringQueryOperatorInput\n  hour: StringQueryOperatorInput\n  minutes: StringQueryOperatorInput\n  month: StringQueryOperatorInput\n  seconds: StringQueryOperatorInput\n  year: DateQueryOperatorInput\n}\n\ntype internal__eventsEventsUtc_end_date_details {\n  day: String\n  hour: String\n  minutes: String\n  month: String\n  seconds: String\n  year(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n}\n\ninput internal__eventsEventsUtc_end_date_detailsFilterInput {\n  day: StringQueryOperatorInput\n  hour: StringQueryOperatorInput\n  minutes: StringQueryOperatorInput\n  month: StringQueryOperatorInput\n  seconds: StringQueryOperatorInput\n  year: DateQueryOperatorInput\n}\n\ntype internal__eventsEventsUtc_start_date_details {\n  day: String\n  hour: String\n  minutes: String\n  month: String\n  seconds: String\n  year(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n}\n\ninput internal__eventsEventsUtc_start_date_detailsFilterInput {\n  day: StringQueryOperatorInput\n  hour: StringQueryOperatorInput\n  minutes: StringQueryOperatorInput\n  month: StringQueryOperatorInput\n  seconds: StringQueryOperatorInput\n  year: DateQueryOperatorInput\n}\n\ntype internal__eventsEventsVenue {\n  alternative_id: Int\n  author: String\n  country: String\n  date(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  date_utc(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  global_id: String\n  global_id_lineage: [String]\n  modified(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  modified_utc(\n    \"\"\"\n    Returns the difference between this date and the current time. Defaults to \"milliseconds\" but you can also pass in as the measurement \"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", and \"seconds\".\n    \"\"\"\n    difference: String\n\n    \"\"\"\n    Format the date using Moment.js' date tokens, e.g. `date(formatString: \"YYYY MMMM DD\")`. See https://momentjs.com/docs/#/displaying/format/ for documentation for different tokens.\n    \"\"\"\n    formatString: String\n\n    \"\"\"\n    Returns a string generated with Moment.js' `fromNow` function\n    \"\"\"\n    fromNow: Boolean\n\n    \"\"\"\n    Configures the locale Moment.js will use to format the date.\n    \"\"\"\n    locale: String\n  ): Date\n  show_map: Boolean\n  show_map_link: Boolean\n  slug: String\n  status: String\n  url: String\n  venue: String\n}\n\ninput internal__eventsEventsVenueFilterInput {\n  alternative_id: IntQueryOperatorInput\n  author: StringQueryOperatorInput\n  country: StringQueryOperatorInput\n  date: DateQueryOperatorInput\n  date_utc: DateQueryOperatorInput\n  global_id: StringQueryOperatorInput\n  global_id_lineage: StringQueryOperatorInput\n  modified: DateQueryOperatorInput\n  modified_utc: DateQueryOperatorInput\n  show_map: BooleanQueryOperatorInput\n  show_map_link: BooleanQueryOperatorInput\n  slug: StringQueryOperatorInput\n  status: StringQueryOperatorInput\n  url: StringQueryOperatorInput\n  venue: StringQueryOperatorInput\n}\n\nenum internal__eventsFieldsEnum {\n  children\n  children___children\n  children___children___children\n  children___children___children___children\n  children___children___children___id\n  children___children___id\n  children___children___internal___content\n  children___children___internal___contentDigest\n  children___children___internal___description\n  children___children___internal___fieldOwners\n  children___children___internal___ignoreType\n  children___children___internal___mediaType\n  children___children___internal___owner\n  children___children___internal___type\n  children___children___parent___children\n  children___children___parent___id\n  children___id\n  children___internal___content\n  children___internal___contentDigest\n  children___internal___description\n  children___internal___fieldOwners\n  children___internal___ignoreType\n  children___internal___mediaType\n  children___internal___owner\n  children___internal___type\n  children___parent___children\n  children___parent___children___children\n  children___parent___children___id\n  children___parent___id\n  children___parent___internal___content\n  children___parent___internal___contentDigest\n  children___parent___internal___description\n  children___parent___internal___fieldOwners\n  children___parent___internal___ignoreType\n  children___parent___internal___mediaType\n  children___parent___internal___owner\n  children___parent___internal___type\n  children___parent___parent___children\n  children___parent___parent___id\n  events\n  events___all_day\n  events___alternative_id\n  events___author\n  events___categories\n  events___categories___alternative_id\n  events___categories___alternative_parent\n  events___categories___count\n  events___categories___description\n  events___categories___filter\n  events___categories___name\n  events___categories___slug\n  events___categories___taxonomy\n  events___categories___term_group\n  events___categories___term_taxonomy_id\n  events___categories___urls___collection\n  events___categories___urls___self\n  events___categories___urls___up\n  events___cost\n  events___cost_details___currency_code\n  events___cost_details___currency_position\n  events___cost_details___currency_symbol\n  events___date\n  events___date_utc\n  events___description\n  events___end_date\n  events___end_date_details___day\n  events___end_date_details___hour\n  events___end_date_details___minutes\n  events___end_date_details___month\n  events___end_date_details___seconds\n  events___end_date_details___year\n  events___excerpt\n  events___featured\n  events___global_id\n  events___global_id_lineage\n  events___hide_from_listings\n  events___image\n  events___modified\n  events___modified_utc\n  events___rest_url\n  events___show_map\n  events___show_map_link\n  events___slug\n  events___start_date\n  events___start_date_details___day\n  events___start_date_details___hour\n  events___start_date_details___minutes\n  events___start_date_details___month\n  events___start_date_details___seconds\n  events___start_date_details___year\n  events___status\n  events___sticky\n  events___timezone\n  events___timezone_abbr\n  events___title\n  events___url\n  events___utc_end_date\n  events___utc_end_date_details___day\n  events___utc_end_date_details___hour\n  events___utc_end_date_details___minutes\n  events___utc_end_date_details___month\n  events___utc_end_date_details___seconds\n  events___utc_end_date_details___year\n  events___utc_start_date\n  events___utc_start_date_details___day\n  events___utc_start_date_details___hour\n  events___utc_start_date_details___minutes\n  events___utc_start_date_details___month\n  events___utc_start_date_details___seconds\n  events___utc_start_date_details___year\n  events___venue___alternative_id\n  events___venue___author\n  events___venue___country\n  events___venue___date\n  events___venue___date_utc\n  events___venue___global_id\n  events___venue___global_id_lineage\n  events___venue___modified\n  events___venue___modified_utc\n  events___venue___show_map\n  events___venue___show_map_link\n  events___venue___slug\n  events___venue___status\n  events___venue___url\n  events___venue___venue\n  events___website\n  id\n  internal___content\n  internal___contentDigest\n  internal___description\n  internal___fieldOwners\n  internal___ignoreType\n  internal___mediaType\n  internal___owner\n  internal___type\n  next_rest_url\n  parent___children\n  parent___children___children\n  parent___children___children___children\n  parent___children___children___id\n  parent___children___id\n  parent___children___internal___content\n  parent___children___internal___contentDigest\n  parent___children___internal___description\n  parent___children___internal___fieldOwners\n  parent___children___internal___ignoreType\n  parent___children___internal___mediaType\n  parent___children___internal___owner\n  parent___children___internal___type\n  parent___children___parent___children\n  parent___children___parent___id\n  parent___id\n  parent___internal___content\n  parent___internal___contentDigest\n  parent___internal___description\n  parent___internal___fieldOwners\n  parent___internal___ignoreType\n  parent___internal___mediaType\n  parent___internal___owner\n  parent___internal___type\n  parent___parent___children\n  parent___parent___children___children\n  parent___parent___children___id\n  parent___parent___id\n  parent___parent___internal___content\n  parent___parent___internal___contentDigest\n  parent___parent___internal___description\n  parent___parent___internal___fieldOwners\n  parent___parent___internal___ignoreType\n  parent___parent___internal___mediaType\n  parent___parent___internal___owner\n  parent___parent___internal___type\n  parent___parent___parent___children\n  parent___parent___parent___id\n  previous_rest_url\n  rest_url\n  total\n  total_pages\n}\n\ninput internal__eventsFilterInput {\n  children: NodeFilterListInput\n  events: internal__eventsEventsFilterListInput\n  id: StringQueryOperatorInput\n  internal: InternalFilterInput\n  next_rest_url: StringQueryOperatorInput\n  parent: NodeFilterInput\n  previous_rest_url: StringQueryOperatorInput\n  rest_url: StringQueryOperatorInput\n  total: IntQueryOperatorInput\n  total_pages: IntQueryOperatorInput\n}\n\ntype internal__eventsGroupConnection {\n  distinct(field: internal__eventsFieldsEnum!): [String!]!\n  edges: [internal__eventsEdge!]!\n  field: String!\n  fieldValue: String\n  group(field: internal__eventsFieldsEnum!, limit: Int, skip: Int): [internal__eventsGroupConnection!]!\n  max(field: internal__eventsFieldsEnum!): Float\n  min(field: internal__eventsFieldsEnum!): Float\n  nodes: [internal__events!]!\n  pageInfo: PageInfo!\n  sum(field: internal__eventsFieldsEnum!): Float\n  totalCount: Int!\n}\n\ninput internal__eventsSortInput {\n  fields: [internal__eventsFieldsEnum]\n  order: [SortOrderEnum] = [ASC]\n}\n"
  },
  {
    "path": "dev-test/githunt/comment-added.subscription.graphql",
    "content": "subscription onCommentAdded($repoFullName: String!) {\n  commentAdded(repoFullName: $repoFullName) {\n    id\n    postedBy {\n      login\n      html_url\n    }\n    createdAt\n    content\n  }\n}\n"
  },
  {
    "path": "dev-test/githunt/comment.query.graphql",
    "content": "# import './comments-page-comment.fragment.graphql'\n\nquery Comment($repoFullName: String!, $limit: Int, $offset: Int) {\n  # Eventually move this into a no fetch query right on the entry\n  # since we literally just need this info to determine whether to\n  # show upvote/downvote buttons\n  currentUser {\n    login\n    html_url\n  }\n  entry(repoFullName: $repoFullName) {\n    id\n    postedBy {\n      login\n      html_url\n    }\n    createdAt\n    comments(limit: $limit, offset: $offset) {\n      ...CommentsPageComment\n    }\n    commentCount\n    repository {\n      full_name\n      html_url\n\n      ... on Repository {\n        description\n        open_issues_count\n        stargazers_count\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "dev-test/githunt/comments-page-comment.fragment.graphql",
    "content": "fragment CommentsPageComment on Comment {\n  id\n  postedBy {\n    login\n    html_url\n  }\n  createdAt\n  content\n}\n"
  },
  {
    "path": "dev-test/githunt/current-user.query.graphql",
    "content": "query CurrentUserForProfile {\n  currentUser {\n    login\n    avatar_url\n  }\n}\n"
  },
  {
    "path": "dev-test/githunt/feed-entry.fragment.graphql",
    "content": "fragment FeedEntry on Entry {\n  id\n  commentCount\n  repository {\n    full_name\n    html_url\n    owner {\n      avatar_url\n    }\n  }\n  ...VoteButtons\n  ...RepoInfo\n}\n"
  },
  {
    "path": "dev-test/githunt/feed.query.graphql",
    "content": "query Feed($type: FeedType!, $offset: Int, $limit: Int) {\n  currentUser {\n    login\n  }\n  feed(type: $type, offset: $offset, limit: $limit) {\n    ...FeedEntry\n  }\n}\n"
  },
  {
    "path": "dev-test/githunt/graphql-declared-modules.d.ts",
    "content": "declare module '*/current-user.query.graphql' {\n  import { DocumentNode } from 'graphql';\n  const defaultDocument: DocumentNode;\n  export const CurrentUserForProfileFromOutsideDirectory: DocumentNode;\n  export const CurrentUserForProfile: DocumentNode;\n\n  export default defaultDocument;\n}\n\ndeclare module '*/comment-added.subscription.graphql' {\n  import { DocumentNode } from 'graphql';\n  const defaultDocument: DocumentNode;\n  export const onCommentAdded: DocumentNode;\n\n  export default defaultDocument;\n}\n\ndeclare module '*/comment.query.graphql' {\n  import { DocumentNode } from 'graphql';\n  const defaultDocument: DocumentNode;\n  export const Comment: DocumentNode;\n\n  export default defaultDocument;\n}\n\ndeclare module '*/comments-page-comment.fragment.graphql' {\n  import { DocumentNode } from 'graphql';\n  const defaultDocument: DocumentNode;\n  export const CommentsPageComment: DocumentNode;\n\n  export default defaultDocument;\n}\n\ndeclare module '*/feed-entry.fragment.graphql' {\n  import { DocumentNode } from 'graphql';\n  const defaultDocument: DocumentNode;\n  export const FeedEntry: DocumentNode;\n\n  export default defaultDocument;\n}\n\ndeclare module '*/feed.query.graphql' {\n  import { DocumentNode } from 'graphql';\n  const defaultDocument: DocumentNode;\n  export const Feed: DocumentNode;\n\n  export default defaultDocument;\n}\n\ndeclare module '*/new-entry.mutation.graphql' {\n  import { DocumentNode } from 'graphql';\n  const defaultDocument: DocumentNode;\n  export const submitRepository: DocumentNode;\n\n  export default defaultDocument;\n}\n\ndeclare module '*/repo-info.fragment.graphql' {\n  import { DocumentNode } from 'graphql';\n  const defaultDocument: DocumentNode;\n  export const RepoInfo: DocumentNode;\n\n  export default defaultDocument;\n}\n\ndeclare module '*/submit-comment.mutation.graphql' {\n  import { DocumentNode } from 'graphql';\n  const defaultDocument: DocumentNode;\n  export const submitComment: DocumentNode;\n\n  export default defaultDocument;\n}\n\ndeclare module '*/vote-buttons.fragment.graphql' {\n  import { DocumentNode } from 'graphql';\n  const defaultDocument: DocumentNode;\n  export const VoteButtons: DocumentNode;\n\n  export default defaultDocument;\n}\n\ndeclare module '*/vote.mutation.graphql' {\n  import { DocumentNode } from 'graphql';\n  const defaultDocument: DocumentNode;\n  export const vote: DocumentNode;\n\n  export default defaultDocument;\n}\n"
  },
  {
    "path": "dev-test/githunt/new-entry.mutation.graphql",
    "content": "mutation submitRepository($repoFullName: String!) {\n  submitRepository(repoFullName: $repoFullName) {\n    createdAt\n  }\n}\n"
  },
  {
    "path": "dev-test/githunt/repo-info.fragment.graphql",
    "content": "fragment RepoInfo on Entry {\n  createdAt\n  repository {\n    description\n    stargazers_count\n    open_issues_count\n  }\n  postedBy {\n    html_url\n    login\n  }\n}\n"
  },
  {
    "path": "dev-test/githunt/schema.json",
    "content": "{\n  \"__schema\": {\n    \"queryType\": {\n      \"name\": \"Query\"\n    },\n    \"mutationType\": {\n      \"name\": \"Mutation\"\n    },\n    \"subscriptionType\": {\n      \"name\": \"Subscription\"\n    },\n    \"types\": [\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Query\",\n        \"description\": \"\",\n        \"fields\": [\n          {\n            \"name\": \"feed\",\n            \"description\": \"A feed of repository submissions\",\n            \"args\": [\n              {\n                \"name\": \"type\",\n                \"description\": \"The sort order for the feed\",\n                \"type\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"ENUM\",\n                    \"name\": \"FeedType\",\n                    \"ofType\": null\n                  }\n                },\n                \"defaultValue\": null\n              },\n              {\n                \"name\": \"offset\",\n                \"description\": \"The number of items to skip, for pagination\",\n                \"type\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Int\",\n                  \"ofType\": null\n                },\n                \"defaultValue\": null\n              },\n              {\n                \"name\": \"limit\",\n                \"description\": \"The number of items to fetch starting from the offset, for pagination\",\n                \"type\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Int\",\n                  \"ofType\": null\n                },\n                \"defaultValue\": null\n              }\n            ],\n            \"type\": {\n              \"kind\": \"LIST\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Entry\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"entry\",\n            \"description\": \"A single entry\",\n            \"args\": [\n              {\n                \"name\": \"repoFullName\",\n                \"description\": \"The full repository name from GitHub, e.g. \\\"apollostack/GitHunt-API\\\"\",\n                \"type\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  }\n                },\n                \"defaultValue\": null\n              }\n            ],\n            \"type\": {\n              \"kind\": \"OBJECT\",\n              \"name\": \"Entry\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"currentUser\",\n            \"description\": \"Return the currently logged in user, or null if nobody is logged in\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"OBJECT\",\n              \"name\": \"User\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"FeedType\",\n        \"description\": \"A list of options for the sort order of the feed\",\n        \"fields\": null,\n        \"inputFields\": null,\n        \"interfaces\": null,\n        \"enumValues\": [\n          {\n            \"name\": \"HOT\",\n            \"description\": \"Sort by a combination of freshness and score, using Reddit's algorithm\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"NEW\",\n            \"description\": \"Newest entries first\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"TOP\",\n            \"description\": \"Highest score entries first\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"SCALAR\",\n        \"name\": \"Int\",\n        \"description\": \"The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. \",\n        \"fields\": null,\n        \"inputFields\": null,\n        \"interfaces\": null,\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Entry\",\n        \"description\": \"Information about a GitHub repository submitted to GitHunt\",\n        \"fields\": [\n          {\n            \"name\": \"repository\",\n            \"description\": \"Information about the repository from GitHub\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Repository\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"postedBy\",\n            \"description\": \"The GitHub user who submitted this entry\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"User\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"createdAt\",\n            \"description\": \"A timestamp of when the entry was submitted\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"score\",\n            \"description\": \"The score of this repository, upvotes - downvotes\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"hotScore\",\n            \"description\": \"The hot score of this repository\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"comments\",\n            \"description\": \"Comments posted about this repository\",\n            \"args\": [\n              {\n                \"name\": \"limit\",\n                \"description\": \"\",\n                \"type\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Int\",\n                  \"ofType\": null\n                },\n                \"defaultValue\": null\n              },\n              {\n                \"name\": \"offset\",\n                \"description\": \"\",\n                \"type\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Int\",\n                  \"ofType\": null\n                },\n                \"defaultValue\": null\n              }\n            ],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"Comment\",\n                  \"ofType\": null\n                }\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"commentCount\",\n            \"description\": \"The number of comments posted about this repository\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"id\",\n            \"description\": \"The SQL ID of this entry\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"vote\",\n            \"description\": \"XXX to be changed\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Vote\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Repository\",\n        \"description\": \"A repository object from the GitHub API. This uses the exact field names returned by the\\nGitHub API for simplicity, even though the convention for GraphQL is usually to camel case.\",\n        \"fields\": [\n          {\n            \"name\": \"name\",\n            \"description\": \"Just the name of the repository, e.g. GitHunt-API\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"full_name\",\n            \"description\": \"The full name of the repository with the username, e.g. apollostack/GitHunt-API\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"description\",\n            \"description\": \"The description of the repository\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"SCALAR\",\n              \"name\": \"String\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"html_url\",\n            \"description\": \"The link to the repository on GitHub\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"stargazers_count\",\n            \"description\": \"The number of people who have starred this repository on GitHub\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"open_issues_count\",\n            \"description\": \"The number of open issues on this repository on GitHub\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"SCALAR\",\n              \"name\": \"Int\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"owner\",\n            \"description\": \"The owner of this repository on GitHub, e.g. apollostack\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"OBJECT\",\n              \"name\": \"User\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"SCALAR\",\n        \"name\": \"String\",\n        \"description\": \"The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.\",\n        \"fields\": null,\n        \"inputFields\": null,\n        \"interfaces\": null,\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"User\",\n        \"description\": \"A user object from the GitHub API. This uses the exact field names returned from the GitHub API.\",\n        \"fields\": [\n          {\n            \"name\": \"login\",\n            \"description\": \"The name of the user, e.g. apollostack\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"avatar_url\",\n            \"description\": \"The URL to a directly embeddable image for this user's avatar\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"html_url\",\n            \"description\": \"The URL of this user's GitHub page\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"SCALAR\",\n        \"name\": \"Float\",\n        \"description\": \"The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](http://en.wikipedia.org/wiki/IEEE_floating_point). \",\n        \"fields\": null,\n        \"inputFields\": null,\n        \"interfaces\": null,\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Comment\",\n        \"description\": \"A comment about an entry, submitted by a user\",\n        \"fields\": [\n          {\n            \"name\": \"id\",\n            \"description\": \"The SQL ID of this entry\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"postedBy\",\n            \"description\": \"The GitHub user who posted the comment\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"User\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"createdAt\",\n            \"description\": \"A timestamp of when the comment was posted\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"content\",\n            \"description\": \"The text of the comment\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"repoName\",\n            \"description\": \"The repository which this comment is about\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Vote\",\n        \"description\": \"XXX to be removed\",\n        \"fields\": [\n          {\n            \"name\": \"vote_value\",\n            \"description\": \"\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Mutation\",\n        \"description\": \"\",\n        \"fields\": [\n          {\n            \"name\": \"submitRepository\",\n            \"description\": \"Submit a new repository, returns the new submission\",\n            \"args\": [\n              {\n                \"name\": \"repoFullName\",\n                \"description\": \"The full repository name from GitHub, e.g. \\\"apollostack/GitHunt-API\\\"\",\n                \"type\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  }\n                },\n                \"defaultValue\": null\n              }\n            ],\n            \"type\": {\n              \"kind\": \"OBJECT\",\n              \"name\": \"Entry\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"vote\",\n            \"description\": \"Vote on a repository submission, returns the submission that was voted on\",\n            \"args\": [\n              {\n                \"name\": \"repoFullName\",\n                \"description\": \"The full repository name from GitHub, e.g. \\\"apollostack/GitHunt-API\\\"\",\n                \"type\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  }\n                },\n                \"defaultValue\": null\n              },\n              {\n                \"name\": \"type\",\n                \"description\": \"The type of vote - UP, DOWN, or CANCEL\",\n                \"type\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"ENUM\",\n                    \"name\": \"VoteType\",\n                    \"ofType\": null\n                  }\n                },\n                \"defaultValue\": null\n              }\n            ],\n            \"type\": {\n              \"kind\": \"OBJECT\",\n              \"name\": \"Entry\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"submitComment\",\n            \"description\": \"Comment on a repository, returns the new comment\",\n            \"args\": [\n              {\n                \"name\": \"repoFullName\",\n                \"description\": \"The full repository name from GitHub, e.g. \\\"apollostack/GitHunt-API\\\"\",\n                \"type\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  }\n                },\n                \"defaultValue\": null\n              },\n              {\n                \"name\": \"commentContent\",\n                \"description\": \"The text content for the new comment\",\n                \"type\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  }\n                },\n                \"defaultValue\": null\n              }\n            ],\n            \"type\": {\n              \"kind\": \"OBJECT\",\n              \"name\": \"Comment\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"VoteType\",\n        \"description\": \"The type of vote to record, when submitting a vote\",\n        \"fields\": null,\n        \"inputFields\": null,\n        \"interfaces\": null,\n        \"enumValues\": [\n          {\n            \"name\": \"UP\",\n            \"description\": \"\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"DOWN\",\n            \"description\": \"\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"CANCEL\",\n            \"description\": \"\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Subscription\",\n        \"description\": \"\",\n        \"fields\": [\n          {\n            \"name\": \"commentAdded\",\n            \"description\": \"Subscription fires on every comment added\",\n            \"args\": [\n              {\n                \"name\": \"repoFullName\",\n                \"description\": \"\",\n                \"type\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  }\n                },\n                \"defaultValue\": null\n              }\n            ],\n            \"type\": {\n              \"kind\": \"OBJECT\",\n              \"name\": \"Comment\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"__Schema\",\n        \"description\": \"A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.\",\n        \"fields\": [\n          {\n            \"name\": \"types\",\n            \"description\": \"A list of all types supported by this server.\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Type\",\n                    \"ofType\": null\n                  }\n                }\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"queryType\",\n            \"description\": \"The type that query operations will be rooted at.\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"mutationType\",\n            \"description\": \"If this server supports mutation, the type that mutation operations will be rooted at.\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"OBJECT\",\n              \"name\": \"__Type\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"subscriptionType\",\n            \"description\": \"If this server support subscription, the type that subscription operations will be rooted at.\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"OBJECT\",\n              \"name\": \"__Type\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"directives\",\n            \"description\": \"A list of all directives supported by this server.\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Directive\",\n                    \"ofType\": null\n                  }\n                }\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"__Type\",\n        \"description\": \"The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\\n\\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name and description, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.\",\n        \"fields\": [\n          {\n            \"name\": \"kind\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"ENUM\",\n                \"name\": \"__TypeKind\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"name\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"SCALAR\",\n              \"name\": \"String\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"description\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"SCALAR\",\n              \"name\": \"String\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"fields\",\n            \"description\": null,\n            \"args\": [\n              {\n                \"name\": \"includeDeprecated\",\n                \"description\": null,\n                \"type\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                },\n                \"defaultValue\": \"false\"\n              }\n            ],\n            \"type\": {\n              \"kind\": \"LIST\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Field\",\n                  \"ofType\": null\n                }\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"interfaces\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"LIST\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"possibleTypes\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"LIST\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"enumValues\",\n            \"description\": null,\n            \"args\": [\n              {\n                \"name\": \"includeDeprecated\",\n                \"description\": null,\n                \"type\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                },\n                \"defaultValue\": \"false\"\n              }\n            ],\n            \"type\": {\n              \"kind\": \"LIST\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__EnumValue\",\n                  \"ofType\": null\n                }\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"inputFields\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"LIST\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__InputValue\",\n                  \"ofType\": null\n                }\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"ofType\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"OBJECT\",\n              \"name\": \"__Type\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"__TypeKind\",\n        \"description\": \"An enum describing what kind of type a given `__Type` is.\",\n        \"fields\": null,\n        \"inputFields\": null,\n        \"interfaces\": null,\n        \"enumValues\": [\n          {\n            \"name\": \"SCALAR\",\n            \"description\": \"Indicates this type is a scalar.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"OBJECT\",\n            \"description\": \"Indicates this type is an object. `fields` and `interfaces` are valid fields.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"INTERFACE\",\n            \"description\": \"Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"UNION\",\n            \"description\": \"Indicates this type is a union. `possibleTypes` is a valid field.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"ENUM\",\n            \"description\": \"Indicates this type is an enum. `enumValues` is a valid field.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"INPUT_OBJECT\",\n            \"description\": \"Indicates this type is an input object. `inputFields` is a valid field.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"LIST\",\n            \"description\": \"Indicates this type is a list. `ofType` is a valid field.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"NON_NULL\",\n            \"description\": \"Indicates this type is a non-null. `ofType` is a valid field.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"SCALAR\",\n        \"name\": \"Boolean\",\n        \"description\": \"The `Boolean` scalar type represents `true` or `false`.\",\n        \"fields\": null,\n        \"inputFields\": null,\n        \"interfaces\": null,\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"__Field\",\n        \"description\": \"Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.\",\n        \"fields\": [\n          {\n            \"name\": \"name\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"description\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"SCALAR\",\n              \"name\": \"String\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"args\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__InputValue\",\n                    \"ofType\": null\n                  }\n                }\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"type\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"isDeprecated\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"deprecationReason\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"SCALAR\",\n              \"name\": \"String\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"__InputValue\",\n        \"description\": \"Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.\",\n        \"fields\": [\n          {\n            \"name\": \"name\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"description\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"SCALAR\",\n              \"name\": \"String\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"type\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"defaultValue\",\n            \"description\": \"A GraphQL-formatted string representing the default value for this input value.\",\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"SCALAR\",\n              \"name\": \"String\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"__EnumValue\",\n        \"description\": \"One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.\",\n        \"fields\": [\n          {\n            \"name\": \"name\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"description\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"SCALAR\",\n              \"name\": \"String\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"isDeprecated\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"deprecationReason\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"SCALAR\",\n              \"name\": \"String\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"__Directive\",\n        \"description\": \"A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\\n\\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.\",\n        \"fields\": [\n          {\n            \"name\": \"name\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"description\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"SCALAR\",\n              \"name\": \"String\",\n              \"ofType\": null\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"locations\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"ENUM\",\n                    \"name\": \"__DirectiveLocation\",\n                    \"ofType\": null\n                  }\n                }\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"args\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__InputValue\",\n                    \"ofType\": null\n                  }\n                }\n              }\n            },\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"onOperation\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": true,\n            \"deprecationReason\": \"Use `locations`.\"\n          },\n          {\n            \"name\": \"onFragment\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": true,\n            \"deprecationReason\": \"Use `locations`.\"\n          },\n          {\n            \"name\": \"onField\",\n            \"description\": null,\n            \"args\": [],\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              }\n            },\n            \"isDeprecated\": true,\n            \"deprecationReason\": \"Use `locations`.\"\n          }\n        ],\n        \"inputFields\": null,\n        \"interfaces\": [],\n        \"enumValues\": null,\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"__DirectiveLocation\",\n        \"description\": \"A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.\",\n        \"fields\": null,\n        \"inputFields\": null,\n        \"interfaces\": null,\n        \"enumValues\": [\n          {\n            \"name\": \"QUERY\",\n            \"description\": \"Location adjacent to a query operation.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"MUTATION\",\n            \"description\": \"Location adjacent to a mutation operation.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"SUBSCRIPTION\",\n            \"description\": \"Location adjacent to a subscription operation.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"FIELD\",\n            \"description\": \"Location adjacent to a field.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"FRAGMENT_DEFINITION\",\n            \"description\": \"Location adjacent to a fragment definition.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"FRAGMENT_SPREAD\",\n            \"description\": \"Location adjacent to a fragment spread.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"INLINE_FRAGMENT\",\n            \"description\": \"Location adjacent to an inline fragment.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"SCHEMA\",\n            \"description\": \"Location adjacent to a schema definition.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"SCALAR\",\n            \"description\": \"Location adjacent to a scalar definition.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"OBJECT\",\n            \"description\": \"Location adjacent to an object type definition.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"FIELD_DEFINITION\",\n            \"description\": \"Location adjacent to a field definition.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"ARGUMENT_DEFINITION\",\n            \"description\": \"Location adjacent to an argument definition.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"INTERFACE\",\n            \"description\": \"Location adjacent to an interface definition.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"UNION\",\n            \"description\": \"Location adjacent to a union definition.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"ENUM\",\n            \"description\": \"Location adjacent to an enum definition.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"ENUM_VALUE\",\n            \"description\": \"Location adjacent to an enum value definition.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"INPUT_OBJECT\",\n            \"description\": \"Location adjacent to an input object type definition.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          },\n          {\n            \"name\": \"INPUT_FIELD_DEFINITION\",\n            \"description\": \"Location adjacent to an input object field definition.\",\n            \"isDeprecated\": false,\n            \"deprecationReason\": null\n          }\n        ],\n        \"possibleTypes\": null\n      }\n    ],\n    \"directives\": [\n      {\n        \"name\": \"skip\",\n        \"description\": \"Directs the executor to skip this field or fragment when the `if` argument is true.\",\n        \"locations\": [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"],\n        \"args\": [\n          {\n            \"name\": \"if\",\n            \"description\": \"Skipped when true.\",\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              }\n            },\n            \"defaultValue\": null\n          }\n        ]\n      },\n      {\n        \"name\": \"include\",\n        \"description\": \"Directs the executor to include this field or fragment only when the `if` argument is true.\",\n        \"locations\": [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"],\n        \"args\": [\n          {\n            \"name\": \"if\",\n            \"description\": \"Included when true.\",\n            \"type\": {\n              \"kind\": \"NON_NULL\",\n              \"name\": null,\n              \"ofType\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              }\n            },\n            \"defaultValue\": null\n          }\n        ]\n      },\n      {\n        \"name\": \"deprecated\",\n        \"description\": \"Marks an element of a GraphQL schema as no longer supported.\",\n        \"locations\": [\"FIELD_DEFINITION\", \"ENUM_VALUE\"],\n        \"args\": [\n          {\n            \"name\": \"reason\",\n            \"description\": \"Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted in [Markdown](https://daringfireball.net/projects/markdown/).\",\n            \"type\": {\n              \"kind\": \"SCALAR\",\n              \"name\": \"String\",\n              \"ofType\": null\n            },\n            \"defaultValue\": \"\\\"No longer supported\\\"\"\n          }\n        ]\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "dev-test/githunt/submit-comment.mutation.graphql",
    "content": "mutation submitComment($repoFullName: String!, $commentContent: String!) {\n  submitComment(repoFullName: $repoFullName, commentContent: $commentContent) {\n    ...CommentsPageComment\n  }\n}\n"
  },
  {
    "path": "dev-test/githunt/typed-document-nodes.ts",
    "content": "import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A comment about an entry, submitted by a user */\nexport type Comment = {\n  __typename?: 'Comment';\n  /** The text of the comment */\n  content: Scalars['String']['output'];\n  /** A timestamp of when the comment was posted */\n  createdAt: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who posted the comment */\n  postedBy: User;\n  /** The repository which this comment is about */\n  repoName: Scalars['String']['output'];\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type Entry = {\n  __typename?: 'Entry';\n  /** The number of comments posted about this repository */\n  commentCount: Scalars['Int']['output'];\n  /** Comments posted about this repository */\n  comments: Array<Maybe<Comment>>;\n  /** A timestamp of when the entry was submitted */\n  createdAt: Scalars['Float']['output'];\n  /** The hot score of this repository */\n  hotScore: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who submitted this entry */\n  postedBy: User;\n  /** Information about the repository from GitHub */\n  repository: Repository;\n  /** The score of this repository, upvotes - downvotes */\n  score: Scalars['Int']['output'];\n  /** XXX to be changed */\n  vote: Vote;\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type EntryCommentsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A list of options for the sort order of the feed */\nexport enum FeedType {\n  /** Sort by a combination of freshness and score, using Reddit's algorithm */\n  Hot = 'HOT',\n  /** Newest entries first */\n  New = 'NEW',\n  /** Highest score entries first */\n  Top = 'TOP',\n}\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  /** Comment on a repository, returns the new comment */\n  submitComment?: Maybe<Comment>;\n  /** Submit a new repository, returns the new submission */\n  submitRepository?: Maybe<Entry>;\n  /** Vote on a repository submission, returns the submission that was voted on */\n  vote?: Maybe<Entry>;\n};\n\nexport type MutationSubmitCommentArgs = {\n  commentContent: Scalars['String']['input'];\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationSubmitRepositoryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationVoteArgs = {\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  /** Return the currently logged in user, or null if nobody is logged in */\n  currentUser?: Maybe<User>;\n  /** A single entry */\n  entry?: Maybe<Entry>;\n  /** A feed of repository submissions */\n  feed?: Maybe<Array<Maybe<Entry>>>;\n};\n\nexport type QueryEntryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type QueryFeedArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  type: FeedType;\n};\n\n/**\n * A repository object from the GitHub API. This uses the exact field names returned by the\n * GitHub API for simplicity, even though the convention for GraphQL is usually to camel case.\n */\nexport type Repository = {\n  __typename?: 'Repository';\n  /** The description of the repository */\n  description?: Maybe<Scalars['String']['output']>;\n  /** The full name of the repository with the username, e.g. apollostack/GitHunt-API */\n  full_name: Scalars['String']['output'];\n  /** The link to the repository on GitHub */\n  html_url: Scalars['String']['output'];\n  /** Just the name of the repository, e.g. GitHunt-API */\n  name: Scalars['String']['output'];\n  /** The number of open issues on this repository on GitHub */\n  open_issues_count?: Maybe<Scalars['Int']['output']>;\n  /** The owner of this repository on GitHub, e.g. apollostack */\n  owner?: Maybe<User>;\n  /** The number of people who have starred this repository on GitHub */\n  stargazers_count: Scalars['Int']['output'];\n};\n\nexport type Subscription = {\n  __typename?: 'Subscription';\n  /** Subscription fires on every comment added */\n  commentAdded?: Maybe<Comment>;\n};\n\nexport type SubscriptionCommentAddedArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\n/** A user object from the GitHub API. This uses the exact field names returned from the GitHub API. */\nexport type User = {\n  __typename?: 'User';\n  /** The URL to a directly embeddable image for this user's avatar */\n  avatar_url: Scalars['String']['output'];\n  /** The URL of this user's GitHub page */\n  html_url: Scalars['String']['output'];\n  /** The name of the user, e.g. apollostack */\n  login: Scalars['String']['output'];\n};\n\n/** XXX to be removed */\nexport type Vote = {\n  __typename?: 'Vote';\n  vote_value: Scalars['Int']['output'];\n};\n\n/** The type of vote to record, when submitting a vote */\nexport enum VoteType {\n  Cancel = 'CANCEL',\n  Down = 'DOWN',\n  Up = 'UP',\n}\n\nexport type OnCommentAddedSubscriptionVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type OnCommentAddedSubscription = {\n  __typename?: 'Subscription';\n  commentAdded?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type CommentQueryVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type CommentQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; html_url: string } | null;\n  entry?: {\n    __typename?: 'Entry';\n    id: number;\n    createdAt: number;\n    commentCount: number;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n    comments: Array<{\n      __typename?: 'Comment';\n      id: number;\n      createdAt: number;\n      content: string;\n      postedBy: { __typename?: 'User'; login: string; html_url: string };\n    } | null>;\n    repository: {\n      __typename?: 'Repository';\n      description?: string | null;\n      open_issues_count?: number | null;\n      stargazers_count: number;\n      full_name: string;\n      html_url: string;\n    };\n  } | null;\n};\n\nexport type CommentsPageCommentFragment = {\n  __typename?: 'Comment';\n  id: number;\n  createdAt: number;\n  content: string;\n  postedBy: { __typename?: 'User'; login: string; html_url: string };\n};\n\nexport type CurrentUserForProfileQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type CurrentUserForProfileQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; avatar_url: string } | null;\n};\n\nexport type FeedEntryFragment = {\n  __typename?: 'Entry';\n  id: number;\n  commentCount: number;\n  score: number;\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    full_name: string;\n    html_url: string;\n    description?: string | null;\n    stargazers_count: number;\n    open_issues_count?: number | null;\n    owner?: { __typename?: 'User'; avatar_url: string } | null;\n  };\n  vote: { __typename?: 'Vote'; vote_value: number };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type FeedQueryVariables = Exact<{\n  type: FeedType;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  limit?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type FeedQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string } | null;\n  feed?: Array<{\n    __typename?: 'Entry';\n    id: number;\n    commentCount: number;\n    score: number;\n    createdAt: number;\n    repository: {\n      __typename?: 'Repository';\n      full_name: string;\n      html_url: string;\n      description?: string | null;\n      stargazers_count: number;\n      open_issues_count?: number | null;\n      owner?: { __typename?: 'User'; avatar_url: string } | null;\n    };\n    vote: { __typename?: 'Vote'; vote_value: number };\n    postedBy: { __typename?: 'User'; html_url: string; login: string };\n  } | null> | null;\n};\n\nexport type SubmitRepositoryMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type SubmitRepositoryMutation = {\n  __typename?: 'Mutation';\n  submitRepository?: { __typename?: 'Entry'; createdAt: number } | null;\n};\n\nexport type RepoInfoFragment = {\n  __typename?: 'Entry';\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    description?: string | null;\n    stargazers_count: number;\n    open_issues_count?: number | null;\n  };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type SubmitCommentMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  commentContent: Scalars['String']['input'];\n}>;\n\nexport type SubmitCommentMutation = {\n  __typename?: 'Mutation';\n  submitComment?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type VoteButtonsFragment = {\n  __typename?: 'Entry';\n  score: number;\n  vote: { __typename?: 'Vote'; vote_value: number };\n};\n\nexport type VoteMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n}>;\n\nexport type VoteMutation = {\n  __typename?: 'Mutation';\n  vote?: { __typename?: 'Entry'; score: number; id: number; vote: { __typename?: 'Vote'; vote_value: number } } | null;\n};\n\nexport const CommentsPageCommentFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'CommentsPageComment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Comment' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'postedBy' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'login' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'html_url' } },\n              ],\n            },\n          },\n          { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'content' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<CommentsPageCommentFragment, unknown>;\nexport const VoteButtonsFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'VoteButtons' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Entry' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'score' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'vote' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'Field', name: { kind: 'Name', value: 'vote_value' } }],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<VoteButtonsFragment, unknown>;\nexport const RepoInfoFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'RepoInfo' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Entry' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'repository' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'description' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'stargazers_count' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'open_issues_count' } },\n              ],\n            },\n          },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'postedBy' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'html_url' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'login' } },\n              ],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<RepoInfoFragment, unknown>;\nexport const FeedEntryFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FeedEntry' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Entry' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'repository' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'full_name' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'html_url' } },\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'owner' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [{ kind: 'Field', name: { kind: 'Name', value: 'avatar_url' } }],\n                  },\n                },\n              ],\n            },\n          },\n          { kind: 'FragmentSpread', name: { kind: 'Name', value: 'VoteButtons' } },\n          { kind: 'FragmentSpread', name: { kind: 'Name', value: 'RepoInfo' } },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'VoteButtons' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Entry' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'score' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'vote' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'Field', name: { kind: 'Name', value: 'vote_value' } }],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'RepoInfo' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Entry' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'repository' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'description' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'stargazers_count' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'open_issues_count' } },\n              ],\n            },\n          },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'postedBy' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'html_url' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'login' } },\n              ],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FeedEntryFragment, unknown>;\nexport const OnCommentAddedDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'subscription',\n      name: { kind: 'Name', value: 'onCommentAdded' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'repoFullName' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'commentAdded' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'repoFullName' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'repoFullName' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'postedBy' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      { kind: 'Field', name: { kind: 'Name', value: 'login' } },\n                      { kind: 'Field', name: { kind: 'Name', value: 'html_url' } },\n                    ],\n                  },\n                },\n                { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'content' } },\n              ],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<OnCommentAddedSubscription, OnCommentAddedSubscriptionVariables>;\nexport const CommentDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'Comment' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'repoFullName' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } } },\n        },\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'limit' } },\n          type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } },\n        },\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'offset' } },\n          type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'currentUser' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'login' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'html_url' } },\n              ],\n            },\n          },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'entry' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'repoFullName' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'repoFullName' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'postedBy' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      { kind: 'Field', name: { kind: 'Name', value: 'login' } },\n                      { kind: 'Field', name: { kind: 'Name', value: 'html_url' } },\n                    ],\n                  },\n                },\n                { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } },\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'comments' },\n                  arguments: [\n                    {\n                      kind: 'Argument',\n                      name: { kind: 'Name', value: 'limit' },\n                      value: { kind: 'Variable', name: { kind: 'Name', value: 'limit' } },\n                    },\n                    {\n                      kind: 'Argument',\n                      name: { kind: 'Name', value: 'offset' },\n                      value: { kind: 'Variable', name: { kind: 'Name', value: 'offset' } },\n                    },\n                  ],\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'CommentsPageComment' } }],\n                  },\n                },\n                { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } },\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'repository' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      { kind: 'Field', name: { kind: 'Name', value: 'full_name' } },\n                      { kind: 'Field', name: { kind: 'Name', value: 'html_url' } },\n                      {\n                        kind: 'InlineFragment',\n                        typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Repository' } },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [\n                            { kind: 'Field', name: { kind: 'Name', value: 'description' } },\n                            { kind: 'Field', name: { kind: 'Name', value: 'open_issues_count' } },\n                            { kind: 'Field', name: { kind: 'Name', value: 'stargazers_count' } },\n                          ],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'CommentsPageComment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Comment' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'postedBy' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'login' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'html_url' } },\n              ],\n            },\n          },\n          { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'content' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<CommentQuery, CommentQueryVariables>;\nexport const CurrentUserForProfileDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'CurrentUserForProfile' },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'currentUser' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'login' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'avatar_url' } },\n              ],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<CurrentUserForProfileQuery, CurrentUserForProfileQueryVariables>;\nexport const FeedDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'Feed' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'type' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'FeedType' } } },\n        },\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'offset' } },\n          type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } },\n        },\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'limit' } },\n          type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'currentUser' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'Field', name: { kind: 'Name', value: 'login' } }],\n            },\n          },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'feed' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'type' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'type' } },\n              },\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'offset' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'offset' } },\n              },\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'limit' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'limit' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'FeedEntry' } }],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'VoteButtons' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Entry' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'score' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'vote' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'Field', name: { kind: 'Name', value: 'vote_value' } }],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'RepoInfo' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Entry' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'repository' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'description' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'stargazers_count' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'open_issues_count' } },\n              ],\n            },\n          },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'postedBy' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'html_url' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'login' } },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FeedEntry' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Entry' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'commentCount' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'repository' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'full_name' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'html_url' } },\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'owner' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [{ kind: 'Field', name: { kind: 'Name', value: 'avatar_url' } }],\n                  },\n                },\n              ],\n            },\n          },\n          { kind: 'FragmentSpread', name: { kind: 'Name', value: 'VoteButtons' } },\n          { kind: 'FragmentSpread', name: { kind: 'Name', value: 'RepoInfo' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FeedQuery, FeedQueryVariables>;\nexport const SubmitRepositoryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'mutation',\n      name: { kind: 'Name', value: 'submitRepository' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'repoFullName' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'submitRepository' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'repoFullName' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'repoFullName' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'Field', name: { kind: 'Name', value: 'createdAt' } }],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<SubmitRepositoryMutation, SubmitRepositoryMutationVariables>;\nexport const SubmitCommentDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'mutation',\n      name: { kind: 'Name', value: 'submitComment' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'repoFullName' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } } },\n        },\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'commentContent' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'submitComment' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'repoFullName' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'repoFullName' } },\n              },\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'commentContent' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'commentContent' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'CommentsPageComment' } }],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'CommentsPageComment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Comment' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'postedBy' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'login' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'html_url' } },\n              ],\n            },\n          },\n          { kind: 'Field', name: { kind: 'Name', value: 'createdAt' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'content' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<SubmitCommentMutation, SubmitCommentMutationVariables>;\nexport const VoteDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'mutation',\n      name: { kind: 'Name', value: 'vote' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'repoFullName' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } } },\n        },\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'type' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'VoteType' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'vote' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'repoFullName' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'repoFullName' } },\n              },\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'type' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'type' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'score' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'vote' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [{ kind: 'Field', name: { kind: 'Name', value: 'vote_value' } }],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<VoteMutation, VoteMutationVariables>;\n"
  },
  {
    "path": "dev-test/githunt/types.avoidOptionals.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A comment about an entry, submitted by a user */\nexport type Comment = {\n  __typename?: 'Comment';\n  /** The text of the comment */\n  content: Scalars['String']['output'];\n  /** A timestamp of when the comment was posted */\n  createdAt: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who posted the comment */\n  postedBy: User;\n  /** The repository which this comment is about */\n  repoName: Scalars['String']['output'];\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type Entry = {\n  __typename?: 'Entry';\n  /** The number of comments posted about this repository */\n  commentCount: Scalars['Int']['output'];\n  /** Comments posted about this repository */\n  comments: Array<Maybe<Comment>>;\n  /** A timestamp of when the entry was submitted */\n  createdAt: Scalars['Float']['output'];\n  /** The hot score of this repository */\n  hotScore: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who submitted this entry */\n  postedBy: User;\n  /** Information about the repository from GitHub */\n  repository: Repository;\n  /** The score of this repository, upvotes - downvotes */\n  score: Scalars['Int']['output'];\n  /** XXX to be changed */\n  vote: Vote;\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type EntryCommentsArgs = {\n  limit: InputMaybe<Scalars['Int']['input']>;\n  offset: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A list of options for the sort order of the feed */\nexport enum FeedType {\n  /** Sort by a combination of freshness and score, using Reddit's algorithm */\n  Hot = 'HOT',\n  /** Newest entries first */\n  New = 'NEW',\n  /** Highest score entries first */\n  Top = 'TOP',\n}\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  /** Comment on a repository, returns the new comment */\n  submitComment: Maybe<Comment>;\n  /** Submit a new repository, returns the new submission */\n  submitRepository: Maybe<Entry>;\n  /** Vote on a repository submission, returns the submission that was voted on */\n  vote: Maybe<Entry>;\n};\n\nexport type MutationSubmitCommentArgs = {\n  commentContent: Scalars['String']['input'];\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationSubmitRepositoryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationVoteArgs = {\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  /** Return the currently logged in user, or null if nobody is logged in */\n  currentUser: Maybe<User>;\n  /** A single entry */\n  entry: Maybe<Entry>;\n  /** A feed of repository submissions */\n  feed: Maybe<Array<Maybe<Entry>>>;\n};\n\nexport type QueryEntryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type QueryFeedArgs = {\n  limit: InputMaybe<Scalars['Int']['input']>;\n  offset: InputMaybe<Scalars['Int']['input']>;\n  type: FeedType;\n};\n\n/**\n * A repository object from the GitHub API. This uses the exact field names returned by the\n * GitHub API for simplicity, even though the convention for GraphQL is usually to camel case.\n */\nexport type Repository = {\n  __typename?: 'Repository';\n  /** The description of the repository */\n  description: Maybe<Scalars['String']['output']>;\n  /** The full name of the repository with the username, e.g. apollostack/GitHunt-API */\n  full_name: Scalars['String']['output'];\n  /** The link to the repository on GitHub */\n  html_url: Scalars['String']['output'];\n  /** Just the name of the repository, e.g. GitHunt-API */\n  name: Scalars['String']['output'];\n  /** The number of open issues on this repository on GitHub */\n  open_issues_count: Maybe<Scalars['Int']['output']>;\n  /** The owner of this repository on GitHub, e.g. apollostack */\n  owner: Maybe<User>;\n  /** The number of people who have starred this repository on GitHub */\n  stargazers_count: Scalars['Int']['output'];\n};\n\nexport type Subscription = {\n  __typename?: 'Subscription';\n  /** Subscription fires on every comment added */\n  commentAdded: Maybe<Comment>;\n};\n\nexport type SubscriptionCommentAddedArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\n/** A user object from the GitHub API. This uses the exact field names returned from the GitHub API. */\nexport type User = {\n  __typename?: 'User';\n  /** The URL to a directly embeddable image for this user's avatar */\n  avatar_url: Scalars['String']['output'];\n  /** The URL of this user's GitHub page */\n  html_url: Scalars['String']['output'];\n  /** The name of the user, e.g. apollostack */\n  login: Scalars['String']['output'];\n};\n\n/** XXX to be removed */\nexport type Vote = {\n  __typename?: 'Vote';\n  vote_value: Scalars['Int']['output'];\n};\n\n/** The type of vote to record, when submitting a vote */\nexport enum VoteType {\n  Cancel = 'CANCEL',\n  Down = 'DOWN',\n  Up = 'UP',\n}\n\nexport type OnCommentAddedSubscriptionVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type OnCommentAddedSubscription = {\n  __typename?: 'Subscription';\n  commentAdded: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type CommentQueryVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  limit: InputMaybe<Scalars['Int']['input']>;\n  offset: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type CommentQuery = {\n  __typename?: 'Query';\n  currentUser: { __typename?: 'User'; login: string; html_url: string } | null;\n  entry: {\n    __typename?: 'Entry';\n    id: number;\n    createdAt: number;\n    commentCount: number;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n    comments: Array<{\n      __typename?: 'Comment';\n      id: number;\n      createdAt: number;\n      content: string;\n      postedBy: { __typename?: 'User'; login: string; html_url: string };\n    } | null>;\n    repository: {\n      __typename?: 'Repository';\n      description: string | null;\n      open_issues_count: number | null;\n      stargazers_count: number;\n      full_name: string;\n      html_url: string;\n    };\n  } | null;\n};\n\nexport type CommentsPageCommentFragment = {\n  __typename?: 'Comment';\n  id: number;\n  createdAt: number;\n  content: string;\n  postedBy: { __typename?: 'User'; login: string; html_url: string };\n};\n\nexport type CurrentUserForProfileQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type CurrentUserForProfileQuery = {\n  __typename?: 'Query';\n  currentUser: { __typename?: 'User'; login: string; avatar_url: string } | null;\n};\n\nexport type FeedEntryFragment = {\n  __typename?: 'Entry';\n  id: number;\n  commentCount: number;\n  score: number;\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    full_name: string;\n    html_url: string;\n    description: string | null;\n    stargazers_count: number;\n    open_issues_count: number | null;\n    owner: { __typename?: 'User'; avatar_url: string } | null;\n  };\n  vote: { __typename?: 'Vote'; vote_value: number };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type FeedQueryVariables = Exact<{\n  type: FeedType;\n  offset: InputMaybe<Scalars['Int']['input']>;\n  limit: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type FeedQuery = {\n  __typename?: 'Query';\n  currentUser: { __typename?: 'User'; login: string } | null;\n  feed: Array<{\n    __typename?: 'Entry';\n    id: number;\n    commentCount: number;\n    score: number;\n    createdAt: number;\n    repository: {\n      __typename?: 'Repository';\n      full_name: string;\n      html_url: string;\n      description: string | null;\n      stargazers_count: number;\n      open_issues_count: number | null;\n      owner: { __typename?: 'User'; avatar_url: string } | null;\n    };\n    vote: { __typename?: 'Vote'; vote_value: number };\n    postedBy: { __typename?: 'User'; html_url: string; login: string };\n  } | null> | null;\n};\n\nexport type SubmitRepositoryMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type SubmitRepositoryMutation = {\n  __typename?: 'Mutation';\n  submitRepository: { __typename?: 'Entry'; createdAt: number } | null;\n};\n\nexport type RepoInfoFragment = {\n  __typename?: 'Entry';\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    description: string | null;\n    stargazers_count: number;\n    open_issues_count: number | null;\n  };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type SubmitCommentMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  commentContent: Scalars['String']['input'];\n}>;\n\nexport type SubmitCommentMutation = {\n  __typename?: 'Mutation';\n  submitComment: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type VoteButtonsFragment = {\n  __typename?: 'Entry';\n  score: number;\n  vote: { __typename?: 'Vote'; vote_value: number };\n};\n\nexport type VoteMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n}>;\n\nexport type VoteMutation = {\n  __typename?: 'Mutation';\n  vote: { __typename?: 'Entry'; score: number; id: number; vote: { __typename?: 'Vote'; vote_value: number } } | null;\n};\n"
  },
  {
    "path": "dev-test/githunt/types.d.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A comment about an entry, submitted by a user */\nexport type Comment = {\n  __typename?: 'Comment';\n  /** The text of the comment */\n  content: Scalars['String']['output'];\n  /** A timestamp of when the comment was posted */\n  createdAt: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who posted the comment */\n  postedBy: User;\n  /** The repository which this comment is about */\n  repoName: Scalars['String']['output'];\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type Entry = {\n  __typename?: 'Entry';\n  /** The number of comments posted about this repository */\n  commentCount: Scalars['Int']['output'];\n  /** Comments posted about this repository */\n  comments: Array<Maybe<Comment>>;\n  /** A timestamp of when the entry was submitted */\n  createdAt: Scalars['Float']['output'];\n  /** The hot score of this repository */\n  hotScore: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who submitted this entry */\n  postedBy: User;\n  /** Information about the repository from GitHub */\n  repository: Repository;\n  /** The score of this repository, upvotes - downvotes */\n  score: Scalars['Int']['output'];\n  /** XXX to be changed */\n  vote: Vote;\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type EntryCommentsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A list of options for the sort order of the feed */\nexport type FeedType =\n  /** Sort by a combination of freshness and score, using Reddit's algorithm */\n  | 'HOT'\n  /** Newest entries first */\n  | 'NEW'\n  /** Highest score entries first */\n  | 'TOP';\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  /** Comment on a repository, returns the new comment */\n  submitComment?: Maybe<Comment>;\n  /** Submit a new repository, returns the new submission */\n  submitRepository?: Maybe<Entry>;\n  /** Vote on a repository submission, returns the submission that was voted on */\n  vote?: Maybe<Entry>;\n};\n\nexport type MutationSubmitCommentArgs = {\n  commentContent: Scalars['String']['input'];\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationSubmitRepositoryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationVoteArgs = {\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  /** Return the currently logged in user, or null if nobody is logged in */\n  currentUser?: Maybe<User>;\n  /** A single entry */\n  entry?: Maybe<Entry>;\n  /** A feed of repository submissions */\n  feed?: Maybe<Array<Maybe<Entry>>>;\n};\n\nexport type QueryEntryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type QueryFeedArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  type: FeedType;\n};\n\n/**\n * A repository object from the GitHub API. This uses the exact field names returned by the\n * GitHub API for simplicity, even though the convention for GraphQL is usually to camel case.\n */\nexport type Repository = {\n  __typename?: 'Repository';\n  /** The description of the repository */\n  description?: Maybe<Scalars['String']['output']>;\n  /** The full name of the repository with the username, e.g. apollostack/GitHunt-API */\n  full_name: Scalars['String']['output'];\n  /** The link to the repository on GitHub */\n  html_url: Scalars['String']['output'];\n  /** Just the name of the repository, e.g. GitHunt-API */\n  name: Scalars['String']['output'];\n  /** The number of open issues on this repository on GitHub */\n  open_issues_count?: Maybe<Scalars['Int']['output']>;\n  /** The owner of this repository on GitHub, e.g. apollostack */\n  owner?: Maybe<User>;\n  /** The number of people who have starred this repository on GitHub */\n  stargazers_count: Scalars['Int']['output'];\n};\n\nexport type Subscription = {\n  __typename?: 'Subscription';\n  /** Subscription fires on every comment added */\n  commentAdded?: Maybe<Comment>;\n};\n\nexport type SubscriptionCommentAddedArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\n/** A user object from the GitHub API. This uses the exact field names returned from the GitHub API. */\nexport type User = {\n  __typename?: 'User';\n  /** The URL to a directly embeddable image for this user's avatar */\n  avatar_url: Scalars['String']['output'];\n  /** The URL of this user's GitHub page */\n  html_url: Scalars['String']['output'];\n  /** The name of the user, e.g. apollostack */\n  login: Scalars['String']['output'];\n};\n\n/** XXX to be removed */\nexport type Vote = {\n  __typename?: 'Vote';\n  vote_value: Scalars['Int']['output'];\n};\n\n/** The type of vote to record, when submitting a vote */\nexport type VoteType = 'CANCEL' | 'DOWN' | 'UP';\n\nexport type OnCommentAddedSubscriptionVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type OnCommentAddedSubscription = {\n  __typename?: 'Subscription';\n  commentAdded?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type CommentQueryVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type CommentQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; html_url: string } | null;\n  entry?: {\n    __typename?: 'Entry';\n    id: number;\n    createdAt: number;\n    commentCount: number;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n    comments: Array<{\n      __typename?: 'Comment';\n      id: number;\n      createdAt: number;\n      content: string;\n      postedBy: { __typename?: 'User'; login: string; html_url: string };\n    } | null>;\n    repository: {\n      __typename?: 'Repository';\n      description?: string | null;\n      open_issues_count?: number | null;\n      stargazers_count: number;\n      full_name: string;\n      html_url: string;\n    };\n  } | null;\n};\n\nexport type CommentsPageCommentFragment = {\n  __typename?: 'Comment';\n  id: number;\n  createdAt: number;\n  content: string;\n  postedBy: { __typename?: 'User'; login: string; html_url: string };\n};\n\nexport type CurrentUserForProfileQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type CurrentUserForProfileQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; avatar_url: string } | null;\n};\n\nexport type FeedEntryFragment = {\n  __typename?: 'Entry';\n  id: number;\n  commentCount: number;\n  score: number;\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    full_name: string;\n    html_url: string;\n    description?: string | null;\n    stargazers_count: number;\n    open_issues_count?: number | null;\n    owner?: { __typename?: 'User'; avatar_url: string } | null;\n  };\n  vote: { __typename?: 'Vote'; vote_value: number };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type FeedQueryVariables = Exact<{\n  type: FeedType;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  limit?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type FeedQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string } | null;\n  feed?: Array<{\n    __typename?: 'Entry';\n    id: number;\n    commentCount: number;\n    score: number;\n    createdAt: number;\n    repository: {\n      __typename?: 'Repository';\n      full_name: string;\n      html_url: string;\n      description?: string | null;\n      stargazers_count: number;\n      open_issues_count?: number | null;\n      owner?: { __typename?: 'User'; avatar_url: string } | null;\n    };\n    vote: { __typename?: 'Vote'; vote_value: number };\n    postedBy: { __typename?: 'User'; html_url: string; login: string };\n  } | null> | null;\n};\n\nexport type SubmitRepositoryMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type SubmitRepositoryMutation = {\n  __typename?: 'Mutation';\n  submitRepository?: { __typename?: 'Entry'; createdAt: number } | null;\n};\n\nexport type RepoInfoFragment = {\n  __typename?: 'Entry';\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    description?: string | null;\n    stargazers_count: number;\n    open_issues_count?: number | null;\n  };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type SubmitCommentMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  commentContent: Scalars['String']['input'];\n}>;\n\nexport type SubmitCommentMutation = {\n  __typename?: 'Mutation';\n  submitComment?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type VoteButtonsFragment = {\n  __typename?: 'Entry';\n  score: number;\n  vote: { __typename?: 'Vote'; vote_value: number };\n};\n\nexport type VoteMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n}>;\n\nexport type VoteMutation = {\n  __typename?: 'Mutation';\n  vote?: { __typename?: 'Entry'; score: number; id: number; vote: { __typename?: 'Vote'; vote_value: number } } | null;\n};\n"
  },
  {
    "path": "dev-test/githunt/types.enumsAsTypes.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A comment about an entry, submitted by a user */\nexport type Comment = {\n  __typename?: 'Comment';\n  /** The text of the comment */\n  content: Scalars['String']['output'];\n  /** A timestamp of when the comment was posted */\n  createdAt: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who posted the comment */\n  postedBy: User;\n  /** The repository which this comment is about */\n  repoName: Scalars['String']['output'];\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type Entry = {\n  __typename?: 'Entry';\n  /** The number of comments posted about this repository */\n  commentCount: Scalars['Int']['output'];\n  /** Comments posted about this repository */\n  comments: Array<Maybe<Comment>>;\n  /** A timestamp of when the entry was submitted */\n  createdAt: Scalars['Float']['output'];\n  /** The hot score of this repository */\n  hotScore: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who submitted this entry */\n  postedBy: User;\n  /** Information about the repository from GitHub */\n  repository: Repository;\n  /** The score of this repository, upvotes - downvotes */\n  score: Scalars['Int']['output'];\n  /** XXX to be changed */\n  vote: Vote;\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type EntryCommentsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A list of options for the sort order of the feed */\nexport type FeedType =\n  /** Sort by a combination of freshness and score, using Reddit's algorithm */\n  | 'HOT'\n  /** Newest entries first */\n  | 'NEW'\n  /** Highest score entries first */\n  | 'TOP';\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  /** Comment on a repository, returns the new comment */\n  submitComment?: Maybe<Comment>;\n  /** Submit a new repository, returns the new submission */\n  submitRepository?: Maybe<Entry>;\n  /** Vote on a repository submission, returns the submission that was voted on */\n  vote?: Maybe<Entry>;\n};\n\nexport type MutationSubmitCommentArgs = {\n  commentContent: Scalars['String']['input'];\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationSubmitRepositoryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationVoteArgs = {\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  /** Return the currently logged in user, or null if nobody is logged in */\n  currentUser?: Maybe<User>;\n  /** A single entry */\n  entry?: Maybe<Entry>;\n  /** A feed of repository submissions */\n  feed?: Maybe<Array<Maybe<Entry>>>;\n};\n\nexport type QueryEntryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type QueryFeedArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  type: FeedType;\n};\n\n/**\n * A repository object from the GitHub API. This uses the exact field names returned by the\n * GitHub API for simplicity, even though the convention for GraphQL is usually to camel case.\n */\nexport type Repository = {\n  __typename?: 'Repository';\n  /** The description of the repository */\n  description?: Maybe<Scalars['String']['output']>;\n  /** The full name of the repository with the username, e.g. apollostack/GitHunt-API */\n  full_name: Scalars['String']['output'];\n  /** The link to the repository on GitHub */\n  html_url: Scalars['String']['output'];\n  /** Just the name of the repository, e.g. GitHunt-API */\n  name: Scalars['String']['output'];\n  /** The number of open issues on this repository on GitHub */\n  open_issues_count?: Maybe<Scalars['Int']['output']>;\n  /** The owner of this repository on GitHub, e.g. apollostack */\n  owner?: Maybe<User>;\n  /** The number of people who have starred this repository on GitHub */\n  stargazers_count: Scalars['Int']['output'];\n};\n\nexport type Subscription = {\n  __typename?: 'Subscription';\n  /** Subscription fires on every comment added */\n  commentAdded?: Maybe<Comment>;\n};\n\nexport type SubscriptionCommentAddedArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\n/** A user object from the GitHub API. This uses the exact field names returned from the GitHub API. */\nexport type User = {\n  __typename?: 'User';\n  /** The URL to a directly embeddable image for this user's avatar */\n  avatar_url: Scalars['String']['output'];\n  /** The URL of this user's GitHub page */\n  html_url: Scalars['String']['output'];\n  /** The name of the user, e.g. apollostack */\n  login: Scalars['String']['output'];\n};\n\n/** XXX to be removed */\nexport type Vote = {\n  __typename?: 'Vote';\n  vote_value: Scalars['Int']['output'];\n};\n\n/** The type of vote to record, when submitting a vote */\nexport type VoteType = 'CANCEL' | 'DOWN' | 'UP';\n\nexport type OnCommentAddedSubscriptionVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type OnCommentAddedSubscription = {\n  __typename?: 'Subscription';\n  commentAdded?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type CommentQueryVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type CommentQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; html_url: string } | null;\n  entry?: {\n    __typename?: 'Entry';\n    id: number;\n    createdAt: number;\n    commentCount: number;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n    comments: Array<{\n      __typename?: 'Comment';\n      id: number;\n      createdAt: number;\n      content: string;\n      postedBy: { __typename?: 'User'; login: string; html_url: string };\n    } | null>;\n    repository: {\n      __typename?: 'Repository';\n      description?: string | null;\n      open_issues_count?: number | null;\n      stargazers_count: number;\n      full_name: string;\n      html_url: string;\n    };\n  } | null;\n};\n\nexport type CommentsPageCommentFragment = {\n  __typename?: 'Comment';\n  id: number;\n  createdAt: number;\n  content: string;\n  postedBy: { __typename?: 'User'; login: string; html_url: string };\n};\n\nexport type CurrentUserForProfileQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type CurrentUserForProfileQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; avatar_url: string } | null;\n};\n\nexport type FeedEntryFragment = {\n  __typename?: 'Entry';\n  id: number;\n  commentCount: number;\n  score: number;\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    full_name: string;\n    html_url: string;\n    description?: string | null;\n    stargazers_count: number;\n    open_issues_count?: number | null;\n    owner?: { __typename?: 'User'; avatar_url: string } | null;\n  };\n  vote: { __typename?: 'Vote'; vote_value: number };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type FeedQueryVariables = Exact<{\n  type: FeedType;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  limit?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type FeedQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string } | null;\n  feed?: Array<{\n    __typename?: 'Entry';\n    id: number;\n    commentCount: number;\n    score: number;\n    createdAt: number;\n    repository: {\n      __typename?: 'Repository';\n      full_name: string;\n      html_url: string;\n      description?: string | null;\n      stargazers_count: number;\n      open_issues_count?: number | null;\n      owner?: { __typename?: 'User'; avatar_url: string } | null;\n    };\n    vote: { __typename?: 'Vote'; vote_value: number };\n    postedBy: { __typename?: 'User'; html_url: string; login: string };\n  } | null> | null;\n};\n\nexport type SubmitRepositoryMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type SubmitRepositoryMutation = {\n  __typename?: 'Mutation';\n  submitRepository?: { __typename?: 'Entry'; createdAt: number } | null;\n};\n\nexport type RepoInfoFragment = {\n  __typename?: 'Entry';\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    description?: string | null;\n    stargazers_count: number;\n    open_issues_count?: number | null;\n  };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type SubmitCommentMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  commentContent: Scalars['String']['input'];\n}>;\n\nexport type SubmitCommentMutation = {\n  __typename?: 'Mutation';\n  submitComment?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type VoteButtonsFragment = {\n  __typename?: 'Entry';\n  score: number;\n  vote: { __typename?: 'Vote'; vote_value: number };\n};\n\nexport type VoteMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n}>;\n\nexport type VoteMutation = {\n  __typename?: 'Mutation';\n  vote?: { __typename?: 'Entry'; score: number; id: number; vote: { __typename?: 'Vote'; vote_value: number } } | null;\n};\n"
  },
  {
    "path": "dev-test/githunt/types.flatten.preResolveTypes.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A comment about an entry, submitted by a user */\nexport type Comment = {\n  __typename?: 'Comment';\n  /** The text of the comment */\n  content: Scalars['String']['output'];\n  /** A timestamp of when the comment was posted */\n  createdAt: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who posted the comment */\n  postedBy: User;\n  /** The repository which this comment is about */\n  repoName: Scalars['String']['output'];\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type Entry = {\n  __typename?: 'Entry';\n  /** The number of comments posted about this repository */\n  commentCount: Scalars['Int']['output'];\n  /** Comments posted about this repository */\n  comments: Array<Maybe<Comment>>;\n  /** A timestamp of when the entry was submitted */\n  createdAt: Scalars['Float']['output'];\n  /** The hot score of this repository */\n  hotScore: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who submitted this entry */\n  postedBy: User;\n  /** Information about the repository from GitHub */\n  repository: Repository;\n  /** The score of this repository, upvotes - downvotes */\n  score: Scalars['Int']['output'];\n  /** XXX to be changed */\n  vote: Vote;\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type EntryCommentsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A list of options for the sort order of the feed */\nexport enum FeedType {\n  /** Sort by a combination of freshness and score, using Reddit's algorithm */\n  Hot = 'HOT',\n  /** Newest entries first */\n  New = 'NEW',\n  /** Highest score entries first */\n  Top = 'TOP',\n}\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  /** Comment on a repository, returns the new comment */\n  submitComment?: Maybe<Comment>;\n  /** Submit a new repository, returns the new submission */\n  submitRepository?: Maybe<Entry>;\n  /** Vote on a repository submission, returns the submission that was voted on */\n  vote?: Maybe<Entry>;\n};\n\nexport type MutationSubmitCommentArgs = {\n  commentContent: Scalars['String']['input'];\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationSubmitRepositoryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationVoteArgs = {\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  /** Return the currently logged in user, or null if nobody is logged in */\n  currentUser?: Maybe<User>;\n  /** A single entry */\n  entry?: Maybe<Entry>;\n  /** A feed of repository submissions */\n  feed?: Maybe<Array<Maybe<Entry>>>;\n};\n\nexport type QueryEntryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type QueryFeedArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  type: FeedType;\n};\n\n/**\n * A repository object from the GitHub API. This uses the exact field names returned by the\n * GitHub API for simplicity, even though the convention for GraphQL is usually to camel case.\n */\nexport type Repository = {\n  __typename?: 'Repository';\n  /** The description of the repository */\n  description?: Maybe<Scalars['String']['output']>;\n  /** The full name of the repository with the username, e.g. apollostack/GitHunt-API */\n  full_name: Scalars['String']['output'];\n  /** The link to the repository on GitHub */\n  html_url: Scalars['String']['output'];\n  /** Just the name of the repository, e.g. GitHunt-API */\n  name: Scalars['String']['output'];\n  /** The number of open issues on this repository on GitHub */\n  open_issues_count?: Maybe<Scalars['Int']['output']>;\n  /** The owner of this repository on GitHub, e.g. apollostack */\n  owner?: Maybe<User>;\n  /** The number of people who have starred this repository on GitHub */\n  stargazers_count: Scalars['Int']['output'];\n};\n\nexport type Subscription = {\n  __typename?: 'Subscription';\n  /** Subscription fires on every comment added */\n  commentAdded?: Maybe<Comment>;\n};\n\nexport type SubscriptionCommentAddedArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\n/** A user object from the GitHub API. This uses the exact field names returned from the GitHub API. */\nexport type User = {\n  __typename?: 'User';\n  /** The URL to a directly embeddable image for this user's avatar */\n  avatar_url: Scalars['String']['output'];\n  /** The URL of this user's GitHub page */\n  html_url: Scalars['String']['output'];\n  /** The name of the user, e.g. apollostack */\n  login: Scalars['String']['output'];\n};\n\n/** XXX to be removed */\nexport type Vote = {\n  __typename?: 'Vote';\n  vote_value: Scalars['Int']['output'];\n};\n\n/** The type of vote to record, when submitting a vote */\nexport enum VoteType {\n  Cancel = 'CANCEL',\n  Down = 'DOWN',\n  Up = 'UP',\n}\n\nexport type OnCommentAddedSubscriptionVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type OnCommentAddedSubscription = {\n  __typename?: 'Subscription';\n  commentAdded?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type CommentQueryVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type CommentQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; html_url: string } | null;\n  entry?: {\n    __typename?: 'Entry';\n    id: number;\n    createdAt: number;\n    commentCount: number;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n    comments: Array<{\n      __typename?: 'Comment';\n      id: number;\n      createdAt: number;\n      content: string;\n      postedBy: { __typename?: 'User'; login: string; html_url: string };\n    } | null>;\n    repository: {\n      __typename?: 'Repository';\n      full_name: string;\n      html_url: string;\n      description?: string | null;\n      open_issues_count?: number | null;\n      stargazers_count: number;\n    };\n  } | null;\n};\n\nexport type CurrentUserForProfileQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type CurrentUserForProfileQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; avatar_url: string } | null;\n};\n\nexport type FeedQueryVariables = Exact<{\n  type: FeedType;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  limit?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type FeedQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string } | null;\n  feed?: Array<{\n    __typename?: 'Entry';\n    id: number;\n    commentCount: number;\n    score: number;\n    createdAt: number;\n    repository: {\n      __typename?: 'Repository';\n      full_name: string;\n      html_url: string;\n      description?: string | null;\n      stargazers_count: number;\n      open_issues_count?: number | null;\n      owner?: { __typename?: 'User'; avatar_url: string } | null;\n    };\n    vote: { __typename?: 'Vote'; vote_value: number };\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null> | null;\n};\n\nexport type SubmitRepositoryMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type SubmitRepositoryMutation = {\n  __typename?: 'Mutation';\n  submitRepository?: { __typename?: 'Entry'; createdAt: number } | null;\n};\n\nexport type SubmitCommentMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  commentContent: Scalars['String']['input'];\n}>;\n\nexport type SubmitCommentMutation = {\n  __typename?: 'Mutation';\n  submitComment?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type VoteMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n}>;\n\nexport type VoteMutation = {\n  __typename?: 'Mutation';\n  vote?: { __typename?: 'Entry'; score: number; id: number; vote: { __typename?: 'Vote'; vote_value: number } } | null;\n};\n"
  },
  {
    "path": "dev-test/githunt/types.immutableTypes.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A comment about an entry, submitted by a user */\nexport type Comment = {\n  readonly __typename?: 'Comment';\n  /** The text of the comment */\n  readonly content: Scalars['String']['output'];\n  /** A timestamp of when the comment was posted */\n  readonly createdAt: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  readonly id: Scalars['Int']['output'];\n  /** The GitHub user who posted the comment */\n  readonly postedBy: User;\n  /** The repository which this comment is about */\n  readonly repoName: Scalars['String']['output'];\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type Entry = {\n  readonly __typename?: 'Entry';\n  /** The number of comments posted about this repository */\n  readonly commentCount: Scalars['Int']['output'];\n  /** Comments posted about this repository */\n  readonly comments: ReadonlyArray<Maybe<Comment>>;\n  /** A timestamp of when the entry was submitted */\n  readonly createdAt: Scalars['Float']['output'];\n  /** The hot score of this repository */\n  readonly hotScore: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  readonly id: Scalars['Int']['output'];\n  /** The GitHub user who submitted this entry */\n  readonly postedBy: User;\n  /** Information about the repository from GitHub */\n  readonly repository: Repository;\n  /** The score of this repository, upvotes - downvotes */\n  readonly score: Scalars['Int']['output'];\n  /** XXX to be changed */\n  readonly vote: Vote;\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type EntryCommentsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A list of options for the sort order of the feed */\nexport enum FeedType {\n  /** Sort by a combination of freshness and score, using Reddit's algorithm */\n  Hot = 'HOT',\n  /** Newest entries first */\n  New = 'NEW',\n  /** Highest score entries first */\n  Top = 'TOP',\n}\n\nexport type Mutation = {\n  readonly __typename?: 'Mutation';\n  /** Comment on a repository, returns the new comment */\n  readonly submitComment?: Maybe<Comment>;\n  /** Submit a new repository, returns the new submission */\n  readonly submitRepository?: Maybe<Entry>;\n  /** Vote on a repository submission, returns the submission that was voted on */\n  readonly vote?: Maybe<Entry>;\n};\n\nexport type MutationSubmitCommentArgs = {\n  commentContent: Scalars['String']['input'];\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationSubmitRepositoryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationVoteArgs = {\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n};\n\nexport type Query = {\n  readonly __typename?: 'Query';\n  /** Return the currently logged in user, or null if nobody is logged in */\n  readonly currentUser?: Maybe<User>;\n  /** A single entry */\n  readonly entry?: Maybe<Entry>;\n  /** A feed of repository submissions */\n  readonly feed?: Maybe<ReadonlyArray<Maybe<Entry>>>;\n};\n\nexport type QueryEntryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type QueryFeedArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  type: FeedType;\n};\n\n/**\n * A repository object from the GitHub API. This uses the exact field names returned by the\n * GitHub API for simplicity, even though the convention for GraphQL is usually to camel case.\n */\nexport type Repository = {\n  readonly __typename?: 'Repository';\n  /** The description of the repository */\n  readonly description?: Maybe<Scalars['String']['output']>;\n  /** The full name of the repository with the username, e.g. apollostack/GitHunt-API */\n  readonly full_name: Scalars['String']['output'];\n  /** The link to the repository on GitHub */\n  readonly html_url: Scalars['String']['output'];\n  /** Just the name of the repository, e.g. GitHunt-API */\n  readonly name: Scalars['String']['output'];\n  /** The number of open issues on this repository on GitHub */\n  readonly open_issues_count?: Maybe<Scalars['Int']['output']>;\n  /** The owner of this repository on GitHub, e.g. apollostack */\n  readonly owner?: Maybe<User>;\n  /** The number of people who have starred this repository on GitHub */\n  readonly stargazers_count: Scalars['Int']['output'];\n};\n\nexport type Subscription = {\n  readonly __typename?: 'Subscription';\n  /** Subscription fires on every comment added */\n  readonly commentAdded?: Maybe<Comment>;\n};\n\nexport type SubscriptionCommentAddedArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\n/** A user object from the GitHub API. This uses the exact field names returned from the GitHub API. */\nexport type User = {\n  readonly __typename?: 'User';\n  /** The URL to a directly embeddable image for this user's avatar */\n  readonly avatar_url: Scalars['String']['output'];\n  /** The URL of this user's GitHub page */\n  readonly html_url: Scalars['String']['output'];\n  /** The name of the user, e.g. apollostack */\n  readonly login: Scalars['String']['output'];\n};\n\n/** XXX to be removed */\nexport type Vote = {\n  readonly __typename?: 'Vote';\n  readonly vote_value: Scalars['Int']['output'];\n};\n\n/** The type of vote to record, when submitting a vote */\nexport enum VoteType {\n  Cancel = 'CANCEL',\n  Down = 'DOWN',\n  Up = 'UP',\n}\n\nexport type OnCommentAddedSubscriptionVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type OnCommentAddedSubscription = {\n  readonly __typename?: 'Subscription';\n  readonly commentAdded?: {\n    readonly __typename?: 'Comment';\n    readonly id: number;\n    readonly createdAt: number;\n    readonly content: string;\n    readonly postedBy: { readonly __typename?: 'User'; readonly login: string; readonly html_url: string };\n  } | null;\n};\n\nexport type CommentQueryVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type CommentQuery = {\n  readonly __typename?: 'Query';\n  readonly currentUser?: { readonly __typename?: 'User'; readonly login: string; readonly html_url: string } | null;\n  readonly entry?: {\n    readonly __typename?: 'Entry';\n    readonly id: number;\n    readonly createdAt: number;\n    readonly commentCount: number;\n    readonly postedBy: { readonly __typename?: 'User'; readonly login: string; readonly html_url: string };\n    readonly comments: ReadonlyArray<{\n      readonly __typename?: 'Comment';\n      readonly id: number;\n      readonly createdAt: number;\n      readonly content: string;\n      readonly postedBy: { readonly __typename?: 'User'; readonly login: string; readonly html_url: string };\n    } | null>;\n    readonly repository: {\n      readonly __typename?: 'Repository';\n      readonly description?: string | null;\n      readonly open_issues_count?: number | null;\n      readonly stargazers_count: number;\n      readonly full_name: string;\n      readonly html_url: string;\n    };\n  } | null;\n};\n\nexport type CommentsPageCommentFragment = {\n  readonly __typename?: 'Comment';\n  readonly id: number;\n  readonly createdAt: number;\n  readonly content: string;\n  readonly postedBy: { readonly __typename?: 'User'; readonly login: string; readonly html_url: string };\n};\n\nexport type CurrentUserForProfileQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type CurrentUserForProfileQuery = {\n  readonly __typename?: 'Query';\n  readonly currentUser?: { readonly __typename?: 'User'; readonly login: string; readonly avatar_url: string } | null;\n};\n\nexport type FeedEntryFragment = {\n  readonly __typename?: 'Entry';\n  readonly id: number;\n  readonly commentCount: number;\n  readonly score: number;\n  readonly createdAt: number;\n  readonly repository: {\n    readonly __typename?: 'Repository';\n    readonly full_name: string;\n    readonly html_url: string;\n    readonly description?: string | null;\n    readonly stargazers_count: number;\n    readonly open_issues_count?: number | null;\n    readonly owner?: { readonly __typename?: 'User'; readonly avatar_url: string } | null;\n  };\n  readonly vote: { readonly __typename?: 'Vote'; readonly vote_value: number };\n  readonly postedBy: { readonly __typename?: 'User'; readonly html_url: string; readonly login: string };\n};\n\nexport type FeedQueryVariables = Exact<{\n  type: FeedType;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  limit?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type FeedQuery = {\n  readonly __typename?: 'Query';\n  readonly currentUser?: { readonly __typename?: 'User'; readonly login: string } | null;\n  readonly feed?: ReadonlyArray<{\n    readonly __typename?: 'Entry';\n    readonly id: number;\n    readonly commentCount: number;\n    readonly score: number;\n    readonly createdAt: number;\n    readonly repository: {\n      readonly __typename?: 'Repository';\n      readonly full_name: string;\n      readonly html_url: string;\n      readonly description?: string | null;\n      readonly stargazers_count: number;\n      readonly open_issues_count?: number | null;\n      readonly owner?: { readonly __typename?: 'User'; readonly avatar_url: string } | null;\n    };\n    readonly vote: { readonly __typename?: 'Vote'; readonly vote_value: number };\n    readonly postedBy: { readonly __typename?: 'User'; readonly html_url: string; readonly login: string };\n  } | null> | null;\n};\n\nexport type SubmitRepositoryMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type SubmitRepositoryMutation = {\n  readonly __typename?: 'Mutation';\n  readonly submitRepository?: { readonly __typename?: 'Entry'; readonly createdAt: number } | null;\n};\n\nexport type RepoInfoFragment = {\n  readonly __typename?: 'Entry';\n  readonly createdAt: number;\n  readonly repository: {\n    readonly __typename?: 'Repository';\n    readonly description?: string | null;\n    readonly stargazers_count: number;\n    readonly open_issues_count?: number | null;\n  };\n  readonly postedBy: { readonly __typename?: 'User'; readonly html_url: string; readonly login: string };\n};\n\nexport type SubmitCommentMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  commentContent: Scalars['String']['input'];\n}>;\n\nexport type SubmitCommentMutation = {\n  readonly __typename?: 'Mutation';\n  readonly submitComment?: {\n    readonly __typename?: 'Comment';\n    readonly id: number;\n    readonly createdAt: number;\n    readonly content: string;\n    readonly postedBy: { readonly __typename?: 'User'; readonly login: string; readonly html_url: string };\n  } | null;\n};\n\nexport type VoteButtonsFragment = {\n  readonly __typename?: 'Entry';\n  readonly score: number;\n  readonly vote: { readonly __typename?: 'Vote'; readonly vote_value: number };\n};\n\nexport type VoteMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n}>;\n\nexport type VoteMutation = {\n  readonly __typename?: 'Mutation';\n  readonly vote?: {\n    readonly __typename?: 'Entry';\n    readonly score: number;\n    readonly id: number;\n    readonly vote: { readonly __typename?: 'Vote'; readonly vote_value: number };\n  } | null;\n};\n"
  },
  {
    "path": "dev-test/githunt/types.onlyEnums.ts",
    "content": "/** A list of options for the sort order of the feed */\nexport enum FeedType {\n  /** Sort by a combination of freshness and score, using Reddit's algorithm */\n  Hot = 'HOT',\n  /** Newest entries first */\n  New = 'NEW',\n  /** Highest score entries first */\n  Top = 'TOP',\n}\n\n/** The type of vote to record, when submitting a vote */\nexport enum VoteType {\n  Cancel = 'CANCEL',\n  Down = 'DOWN',\n  Up = 'UP',\n}\n"
  },
  {
    "path": "dev-test/githunt/types.preResolveTypes.onlyOperationTypes.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A list of options for the sort order of the feed */\nexport enum FeedType {\n  /** Sort by a combination of freshness and score, using Reddit's algorithm */\n  Hot = 'HOT',\n  /** Newest entries first */\n  New = 'NEW',\n  /** Highest score entries first */\n  Top = 'TOP',\n}\n\n/** The type of vote to record, when submitting a vote */\nexport enum VoteType {\n  Cancel = 'CANCEL',\n  Down = 'DOWN',\n  Up = 'UP',\n}\n\nexport type OnCommentAddedSubscriptionVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type OnCommentAddedSubscription = {\n  __typename?: 'Subscription';\n  commentAdded?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type CommentQueryVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type CommentQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; html_url: string } | null;\n  entry?: {\n    __typename?: 'Entry';\n    id: number;\n    createdAt: number;\n    commentCount: number;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n    comments: Array<{\n      __typename?: 'Comment';\n      id: number;\n      createdAt: number;\n      content: string;\n      postedBy: { __typename?: 'User'; login: string; html_url: string };\n    } | null>;\n    repository: {\n      __typename?: 'Repository';\n      description?: string | null;\n      open_issues_count?: number | null;\n      stargazers_count: number;\n      full_name: string;\n      html_url: string;\n    };\n  } | null;\n};\n\nexport type CommentsPageCommentFragment = {\n  __typename?: 'Comment';\n  id: number;\n  createdAt: number;\n  content: string;\n  postedBy: { __typename?: 'User'; login: string; html_url: string };\n};\n\nexport type CurrentUserForProfileQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type CurrentUserForProfileQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; avatar_url: string } | null;\n};\n\nexport type FeedEntryFragment = {\n  __typename?: 'Entry';\n  id: number;\n  commentCount: number;\n  score: number;\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    full_name: string;\n    html_url: string;\n    description?: string | null;\n    stargazers_count: number;\n    open_issues_count?: number | null;\n    owner?: { __typename?: 'User'; avatar_url: string } | null;\n  };\n  vote: { __typename?: 'Vote'; vote_value: number };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type FeedQueryVariables = Exact<{\n  type: FeedType;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  limit?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type FeedQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string } | null;\n  feed?: Array<{\n    __typename?: 'Entry';\n    id: number;\n    commentCount: number;\n    score: number;\n    createdAt: number;\n    repository: {\n      __typename?: 'Repository';\n      full_name: string;\n      html_url: string;\n      description?: string | null;\n      stargazers_count: number;\n      open_issues_count?: number | null;\n      owner?: { __typename?: 'User'; avatar_url: string } | null;\n    };\n    vote: { __typename?: 'Vote'; vote_value: number };\n    postedBy: { __typename?: 'User'; html_url: string; login: string };\n  } | null> | null;\n};\n\nexport type SubmitRepositoryMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type SubmitRepositoryMutation = {\n  __typename?: 'Mutation';\n  submitRepository?: { __typename?: 'Entry'; createdAt: number } | null;\n};\n\nexport type RepoInfoFragment = {\n  __typename?: 'Entry';\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    description?: string | null;\n    stargazers_count: number;\n    open_issues_count?: number | null;\n  };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type SubmitCommentMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  commentContent: Scalars['String']['input'];\n}>;\n\nexport type SubmitCommentMutation = {\n  __typename?: 'Mutation';\n  submitComment?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type VoteButtonsFragment = {\n  __typename?: 'Entry';\n  score: number;\n  vote: { __typename?: 'Vote'; vote_value: number };\n};\n\nexport type VoteMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n}>;\n\nexport type VoteMutation = {\n  __typename?: 'Mutation';\n  vote?: { __typename?: 'Entry'; score: number; id: number; vote: { __typename?: 'Vote'; vote_value: number } } | null;\n};\n"
  },
  {
    "path": "dev-test/githunt/types.preResolveTypes.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A comment about an entry, submitted by a user */\nexport type Comment = {\n  __typename?: 'Comment';\n  /** The text of the comment */\n  content: Scalars['String']['output'];\n  /** A timestamp of when the comment was posted */\n  createdAt: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who posted the comment */\n  postedBy: User;\n  /** The repository which this comment is about */\n  repoName: Scalars['String']['output'];\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type Entry = {\n  __typename?: 'Entry';\n  /** The number of comments posted about this repository */\n  commentCount: Scalars['Int']['output'];\n  /** Comments posted about this repository */\n  comments: Array<Maybe<Comment>>;\n  /** A timestamp of when the entry was submitted */\n  createdAt: Scalars['Float']['output'];\n  /** The hot score of this repository */\n  hotScore: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who submitted this entry */\n  postedBy: User;\n  /** Information about the repository from GitHub */\n  repository: Repository;\n  /** The score of this repository, upvotes - downvotes */\n  score: Scalars['Int']['output'];\n  /** XXX to be changed */\n  vote: Vote;\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type EntryCommentsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A list of options for the sort order of the feed */\nexport enum FeedType {\n  /** Sort by a combination of freshness and score, using Reddit's algorithm */\n  Hot = 'HOT',\n  /** Newest entries first */\n  New = 'NEW',\n  /** Highest score entries first */\n  Top = 'TOP',\n}\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  /** Comment on a repository, returns the new comment */\n  submitComment?: Maybe<Comment>;\n  /** Submit a new repository, returns the new submission */\n  submitRepository?: Maybe<Entry>;\n  /** Vote on a repository submission, returns the submission that was voted on */\n  vote?: Maybe<Entry>;\n};\n\nexport type MutationSubmitCommentArgs = {\n  commentContent: Scalars['String']['input'];\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationSubmitRepositoryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationVoteArgs = {\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  /** Return the currently logged in user, or null if nobody is logged in */\n  currentUser?: Maybe<User>;\n  /** A single entry */\n  entry?: Maybe<Entry>;\n  /** A feed of repository submissions */\n  feed?: Maybe<Array<Maybe<Entry>>>;\n};\n\nexport type QueryEntryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type QueryFeedArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  type: FeedType;\n};\n\n/**\n * A repository object from the GitHub API. This uses the exact field names returned by the\n * GitHub API for simplicity, even though the convention for GraphQL is usually to camel case.\n */\nexport type Repository = {\n  __typename?: 'Repository';\n  /** The description of the repository */\n  description?: Maybe<Scalars['String']['output']>;\n  /** The full name of the repository with the username, e.g. apollostack/GitHunt-API */\n  full_name: Scalars['String']['output'];\n  /** The link to the repository on GitHub */\n  html_url: Scalars['String']['output'];\n  /** Just the name of the repository, e.g. GitHunt-API */\n  name: Scalars['String']['output'];\n  /** The number of open issues on this repository on GitHub */\n  open_issues_count?: Maybe<Scalars['Int']['output']>;\n  /** The owner of this repository on GitHub, e.g. apollostack */\n  owner?: Maybe<User>;\n  /** The number of people who have starred this repository on GitHub */\n  stargazers_count: Scalars['Int']['output'];\n};\n\nexport type Subscription = {\n  __typename?: 'Subscription';\n  /** Subscription fires on every comment added */\n  commentAdded?: Maybe<Comment>;\n};\n\nexport type SubscriptionCommentAddedArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\n/** A user object from the GitHub API. This uses the exact field names returned from the GitHub API. */\nexport type User = {\n  __typename?: 'User';\n  /** The URL to a directly embeddable image for this user's avatar */\n  avatar_url: Scalars['String']['output'];\n  /** The URL of this user's GitHub page */\n  html_url: Scalars['String']['output'];\n  /** The name of the user, e.g. apollostack */\n  login: Scalars['String']['output'];\n};\n\n/** XXX to be removed */\nexport type Vote = {\n  __typename?: 'Vote';\n  vote_value: Scalars['Int']['output'];\n};\n\n/** The type of vote to record, when submitting a vote */\nexport enum VoteType {\n  Cancel = 'CANCEL',\n  Down = 'DOWN',\n  Up = 'UP',\n}\n\nexport type OnCommentAddedSubscriptionVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type OnCommentAddedSubscription = {\n  __typename?: 'Subscription';\n  commentAdded?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type CommentQueryVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type CommentQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; html_url: string } | null;\n  entry?: {\n    __typename?: 'Entry';\n    id: number;\n    createdAt: number;\n    commentCount: number;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n    comments: Array<{\n      __typename?: 'Comment';\n      id: number;\n      createdAt: number;\n      content: string;\n      postedBy: { __typename?: 'User'; login: string; html_url: string };\n    } | null>;\n    repository: {\n      __typename?: 'Repository';\n      description?: string | null;\n      open_issues_count?: number | null;\n      stargazers_count: number;\n      full_name: string;\n      html_url: string;\n    };\n  } | null;\n};\n\nexport type CommentsPageCommentFragment = {\n  __typename?: 'Comment';\n  id: number;\n  createdAt: number;\n  content: string;\n  postedBy: { __typename?: 'User'; login: string; html_url: string };\n};\n\nexport type CurrentUserForProfileQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type CurrentUserForProfileQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; avatar_url: string } | null;\n};\n\nexport type FeedEntryFragment = {\n  __typename?: 'Entry';\n  id: number;\n  commentCount: number;\n  score: number;\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    full_name: string;\n    html_url: string;\n    description?: string | null;\n    stargazers_count: number;\n    open_issues_count?: number | null;\n    owner?: { __typename?: 'User'; avatar_url: string } | null;\n  };\n  vote: { __typename?: 'Vote'; vote_value: number };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type FeedQueryVariables = Exact<{\n  type: FeedType;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  limit?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type FeedQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string } | null;\n  feed?: Array<{\n    __typename?: 'Entry';\n    id: number;\n    commentCount: number;\n    score: number;\n    createdAt: number;\n    repository: {\n      __typename?: 'Repository';\n      full_name: string;\n      html_url: string;\n      description?: string | null;\n      stargazers_count: number;\n      open_issues_count?: number | null;\n      owner?: { __typename?: 'User'; avatar_url: string } | null;\n    };\n    vote: { __typename?: 'Vote'; vote_value: number };\n    postedBy: { __typename?: 'User'; html_url: string; login: string };\n  } | null> | null;\n};\n\nexport type SubmitRepositoryMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type SubmitRepositoryMutation = {\n  __typename?: 'Mutation';\n  submitRepository?: { __typename?: 'Entry'; createdAt: number } | null;\n};\n\nexport type RepoInfoFragment = {\n  __typename?: 'Entry';\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    description?: string | null;\n    stargazers_count: number;\n    open_issues_count?: number | null;\n  };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type SubmitCommentMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  commentContent: Scalars['String']['input'];\n}>;\n\nexport type SubmitCommentMutation = {\n  __typename?: 'Mutation';\n  submitComment?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type VoteButtonsFragment = {\n  __typename?: 'Entry';\n  score: number;\n  vote: { __typename?: 'Vote'; vote_value: number };\n};\n\nexport type VoteMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n}>;\n\nexport type VoteMutation = {\n  __typename?: 'Mutation';\n  vote?: { __typename?: 'Entry'; score: number; id: number; vote: { __typename?: 'Vote'; vote_value: number } } | null;\n};\n"
  },
  {
    "path": "dev-test/githunt/types.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A comment about an entry, submitted by a user */\nexport type Comment = {\n  __typename?: 'Comment';\n  /** The text of the comment */\n  content: Scalars['String']['output'];\n  /** A timestamp of when the comment was posted */\n  createdAt: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who posted the comment */\n  postedBy: User;\n  /** The repository which this comment is about */\n  repoName: Scalars['String']['output'];\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type Entry = {\n  __typename?: 'Entry';\n  /** The number of comments posted about this repository */\n  commentCount: Scalars['Int']['output'];\n  /** Comments posted about this repository */\n  comments: Array<Maybe<Comment>>;\n  /** A timestamp of when the entry was submitted */\n  createdAt: Scalars['Float']['output'];\n  /** The hot score of this repository */\n  hotScore: Scalars['Float']['output'];\n  /** The SQL ID of this entry */\n  id: Scalars['Int']['output'];\n  /** The GitHub user who submitted this entry */\n  postedBy: User;\n  /** Information about the repository from GitHub */\n  repository: Repository;\n  /** The score of this repository, upvotes - downvotes */\n  score: Scalars['Int']['output'];\n  /** XXX to be changed */\n  vote: Vote;\n};\n\n/** Information about a GitHub repository submitted to GitHunt */\nexport type EntryCommentsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A list of options for the sort order of the feed */\nexport enum FeedType {\n  /** Sort by a combination of freshness and score, using Reddit's algorithm */\n  Hot = 'HOT',\n  /** Newest entries first */\n  New = 'NEW',\n  /** Highest score entries first */\n  Top = 'TOP',\n}\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  /** Comment on a repository, returns the new comment */\n  submitComment?: Maybe<Comment>;\n  /** Submit a new repository, returns the new submission */\n  submitRepository?: Maybe<Entry>;\n  /** Vote on a repository submission, returns the submission that was voted on */\n  vote?: Maybe<Entry>;\n};\n\nexport type MutationSubmitCommentArgs = {\n  commentContent: Scalars['String']['input'];\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationSubmitRepositoryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type MutationVoteArgs = {\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  /** Return the currently logged in user, or null if nobody is logged in */\n  currentUser?: Maybe<User>;\n  /** A single entry */\n  entry?: Maybe<Entry>;\n  /** A feed of repository submissions */\n  feed?: Maybe<Array<Maybe<Entry>>>;\n};\n\nexport type QueryEntryArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\nexport type QueryFeedArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  type: FeedType;\n};\n\n/**\n * A repository object from the GitHub API. This uses the exact field names returned by the\n * GitHub API for simplicity, even though the convention for GraphQL is usually to camel case.\n */\nexport type Repository = {\n  __typename?: 'Repository';\n  /** The description of the repository */\n  description?: Maybe<Scalars['String']['output']>;\n  /** The full name of the repository with the username, e.g. apollostack/GitHunt-API */\n  full_name: Scalars['String']['output'];\n  /** The link to the repository on GitHub */\n  html_url: Scalars['String']['output'];\n  /** Just the name of the repository, e.g. GitHunt-API */\n  name: Scalars['String']['output'];\n  /** The number of open issues on this repository on GitHub */\n  open_issues_count?: Maybe<Scalars['Int']['output']>;\n  /** The owner of this repository on GitHub, e.g. apollostack */\n  owner?: Maybe<User>;\n  /** The number of people who have starred this repository on GitHub */\n  stargazers_count: Scalars['Int']['output'];\n};\n\nexport type Subscription = {\n  __typename?: 'Subscription';\n  /** Subscription fires on every comment added */\n  commentAdded?: Maybe<Comment>;\n};\n\nexport type SubscriptionCommentAddedArgs = {\n  repoFullName: Scalars['String']['input'];\n};\n\n/** A user object from the GitHub API. This uses the exact field names returned from the GitHub API. */\nexport type User = {\n  __typename?: 'User';\n  /** The URL to a directly embeddable image for this user's avatar */\n  avatar_url: Scalars['String']['output'];\n  /** The URL of this user's GitHub page */\n  html_url: Scalars['String']['output'];\n  /** The name of the user, e.g. apollostack */\n  login: Scalars['String']['output'];\n};\n\n/** XXX to be removed */\nexport type Vote = {\n  __typename?: 'Vote';\n  vote_value: Scalars['Int']['output'];\n};\n\n/** The type of vote to record, when submitting a vote */\nexport enum VoteType {\n  Cancel = 'CANCEL',\n  Down = 'DOWN',\n  Up = 'UP',\n}\n\nexport type OnCommentAddedSubscriptionVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type OnCommentAddedSubscription = {\n  __typename?: 'Subscription';\n  commentAdded?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type CommentQueryVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type CommentQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; html_url: string } | null;\n  entry?: {\n    __typename?: 'Entry';\n    id: number;\n    createdAt: number;\n    commentCount: number;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n    comments: Array<{\n      __typename?: 'Comment';\n      id: number;\n      createdAt: number;\n      content: string;\n      postedBy: { __typename?: 'User'; login: string; html_url: string };\n    } | null>;\n    repository: {\n      __typename?: 'Repository';\n      description?: string | null;\n      open_issues_count?: number | null;\n      stargazers_count: number;\n      full_name: string;\n      html_url: string;\n    };\n  } | null;\n};\n\nexport type CommentsPageCommentFragment = {\n  __typename?: 'Comment';\n  id: number;\n  createdAt: number;\n  content: string;\n  postedBy: { __typename?: 'User'; login: string; html_url: string };\n};\n\nexport type CurrentUserForProfileQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type CurrentUserForProfileQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string; avatar_url: string } | null;\n};\n\nexport type FeedEntryFragment = {\n  __typename?: 'Entry';\n  id: number;\n  commentCount: number;\n  score: number;\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    full_name: string;\n    html_url: string;\n    description?: string | null;\n    stargazers_count: number;\n    open_issues_count?: number | null;\n    owner?: { __typename?: 'User'; avatar_url: string } | null;\n  };\n  vote: { __typename?: 'Vote'; vote_value: number };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type FeedQueryVariables = Exact<{\n  type: FeedType;\n  offset?: InputMaybe<Scalars['Int']['input']>;\n  limit?: InputMaybe<Scalars['Int']['input']>;\n}>;\n\nexport type FeedQuery = {\n  __typename?: 'Query';\n  currentUser?: { __typename?: 'User'; login: string } | null;\n  feed?: Array<{\n    __typename?: 'Entry';\n    id: number;\n    commentCount: number;\n    score: number;\n    createdAt: number;\n    repository: {\n      __typename?: 'Repository';\n      full_name: string;\n      html_url: string;\n      description?: string | null;\n      stargazers_count: number;\n      open_issues_count?: number | null;\n      owner?: { __typename?: 'User'; avatar_url: string } | null;\n    };\n    vote: { __typename?: 'Vote'; vote_value: number };\n    postedBy: { __typename?: 'User'; html_url: string; login: string };\n  } | null> | null;\n};\n\nexport type SubmitRepositoryMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n}>;\n\nexport type SubmitRepositoryMutation = {\n  __typename?: 'Mutation';\n  submitRepository?: { __typename?: 'Entry'; createdAt: number } | null;\n};\n\nexport type RepoInfoFragment = {\n  __typename?: 'Entry';\n  createdAt: number;\n  repository: {\n    __typename?: 'Repository';\n    description?: string | null;\n    stargazers_count: number;\n    open_issues_count?: number | null;\n  };\n  postedBy: { __typename?: 'User'; html_url: string; login: string };\n};\n\nexport type SubmitCommentMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  commentContent: Scalars['String']['input'];\n}>;\n\nexport type SubmitCommentMutation = {\n  __typename?: 'Mutation';\n  submitComment?: {\n    __typename?: 'Comment';\n    id: number;\n    createdAt: number;\n    content: string;\n    postedBy: { __typename?: 'User'; login: string; html_url: string };\n  } | null;\n};\n\nexport type VoteButtonsFragment = {\n  __typename?: 'Entry';\n  score: number;\n  vote: { __typename?: 'Vote'; vote_value: number };\n};\n\nexport type VoteMutationVariables = Exact<{\n  repoFullName: Scalars['String']['input'];\n  type: VoteType;\n}>;\n\nexport type VoteMutation = {\n  __typename?: 'Mutation';\n  vote?: { __typename?: 'Entry'; score: number; id: number; vote: { __typename?: 'Vote'; vote_value: number } } | null;\n};\n"
  },
  {
    "path": "dev-test/githunt/vote-buttons.fragment.graphql",
    "content": "fragment VoteButtons on Entry {\n  score\n  vote {\n    vote_value\n  }\n}\n"
  },
  {
    "path": "dev-test/githunt/vote.mutation.graphql",
    "content": "mutation vote($repoFullName: String!, $type: VoteType!) {\n  vote(repoFullName: $repoFullName, type: $type) {\n    score\n    id\n    vote {\n      vote_value\n    }\n  }\n}\n"
  },
  {
    "path": "dev-test/githunt-invalid/invalid.graphql",
    "content": "INVALID"
  },
  {
    "path": "dev-test/gql-tag-operations/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql.js';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "dev-test/gql-tag-operations/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql.js';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n': typeof types.FooDocument;\n  '\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n': typeof types.LelFragmentDoc;\n  '\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n': typeof types.BarDocument;\n};\nconst documents: Documents = {\n  '\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n': types.FooDocument,\n  '\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n': types.LelFragmentDoc,\n  '\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n': types.BarDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n'\n): (typeof documents)['\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "dev-test/gql-tag-operations/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n  Date: { input: any; output: any };\n  Url: { input: any; output: any };\n};\n\nexport type Meta = {\n  __typename?: 'Meta';\n  count?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  createTweet?: Maybe<Tweet>;\n  deleteTweet?: Maybe<Tweet>;\n  markTweetRead?: Maybe<Scalars['Boolean']['output']>;\n};\n\nexport type MutationCreateTweetArgs = {\n  body?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type MutationDeleteTweetArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type MutationMarkTweetReadArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type Notification = {\n  __typename?: 'Notification';\n  date?: Maybe<Scalars['Date']['output']>;\n  id?: Maybe<Scalars['ID']['output']>;\n  type?: Maybe<Scalars['String']['output']>;\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  Notifications?: Maybe<Array<Maybe<Notification>>>;\n  NotificationsMeta?: Maybe<Meta>;\n  Tweet?: Maybe<Tweet>;\n  Tweets?: Maybe<Array<Maybe<Tweet>>>;\n  TweetsMeta?: Maybe<Meta>;\n  User?: Maybe<User>;\n};\n\nexport type QueryNotificationsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type QueryTweetArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type QueryTweetsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  skip?: InputMaybe<Scalars['Int']['input']>;\n  sort_field?: InputMaybe<Scalars['String']['input']>;\n  sort_order?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type QueryUserArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type Stat = {\n  __typename?: 'Stat';\n  likes?: Maybe<Scalars['Int']['output']>;\n  responses?: Maybe<Scalars['Int']['output']>;\n  retweets?: Maybe<Scalars['Int']['output']>;\n  views?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type Tweet = {\n  __typename?: 'Tweet';\n  Author?: Maybe<User>;\n  Stats?: Maybe<Stat>;\n  body?: Maybe<Scalars['String']['output']>;\n  date?: Maybe<Scalars['Date']['output']>;\n  id: Scalars['ID']['output'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  avatar_url?: Maybe<Scalars['Url']['output']>;\n  first_name?: Maybe<Scalars['String']['output']>;\n  full_name?: Maybe<Scalars['String']['output']>;\n  id: Scalars['ID']['output'];\n  last_name?: Maybe<Scalars['String']['output']>;\n  /** @deprecated Field no longer supported */\n  name?: Maybe<Scalars['String']['output']>;\n  username?: Maybe<Scalars['String']['output']>;\n};\n\nexport type FooQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type FooQuery = { __typename?: 'Query'; Tweets?: Array<{ __typename?: 'Tweet'; id: string } | null> | null };\n\nexport type LelFragment = { __typename?: 'Tweet'; id: string; body?: string | null } & {\n  ' $fragmentName'?: 'LelFragment';\n};\n\nexport type BarQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type BarQuery = {\n  __typename?: 'Query';\n  Tweets?: Array<({ __typename?: 'Tweet' } & { ' $fragmentRefs'?: { LelFragment: LelFragment } }) | null> | null;\n};\n\nexport const LelFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'Lel' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'body' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<LelFragment, unknown>;\nexport const FooDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'Foo' },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'Tweets' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'Field', name: { kind: 'Name', value: 'id' } }],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FooQuery, FooQueryVariables>;\nexport const BarDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'Bar' },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'Tweets' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'Lel' } }],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'Lel' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'body' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<BarQuery, BarQueryVariables>;\n"
  },
  {
    "path": "dev-test/gql-tag-operations/gql/index.ts",
    "content": "export * from './fragment-masking.js';\nexport * from './gql.js';\n"
  },
  {
    "path": "dev-test/gql-tag-operations/graphql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql.js';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "dev-test/gql-tag-operations/graphql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql.js';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n': typeof types.FooDocument;\n  '\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n': typeof types.LelFragmentDoc;\n  '\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n': typeof types.BarDocument;\n};\nconst documents: Documents = {\n  '\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n': types.FooDocument,\n  '\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n': types.LelFragmentDoc,\n  '\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n': types.BarDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n'\n): (typeof documents)['\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "dev-test/gql-tag-operations/graphql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n  Date: { input: any; output: any };\n  Url: { input: any; output: any };\n};\n\nexport type Meta = {\n  __typename?: 'Meta';\n  count?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  createTweet?: Maybe<Tweet>;\n  deleteTweet?: Maybe<Tweet>;\n  markTweetRead?: Maybe<Scalars['Boolean']['output']>;\n};\n\nexport type MutationCreateTweetArgs = {\n  body?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type MutationDeleteTweetArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type MutationMarkTweetReadArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type Notification = {\n  __typename?: 'Notification';\n  date?: Maybe<Scalars['Date']['output']>;\n  id?: Maybe<Scalars['ID']['output']>;\n  type?: Maybe<Scalars['String']['output']>;\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  Notifications?: Maybe<Array<Maybe<Notification>>>;\n  NotificationsMeta?: Maybe<Meta>;\n  Tweet?: Maybe<Tweet>;\n  Tweets?: Maybe<Array<Maybe<Tweet>>>;\n  TweetsMeta?: Maybe<Meta>;\n  User?: Maybe<User>;\n};\n\nexport type QueryNotificationsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type QueryTweetArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type QueryTweetsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  skip?: InputMaybe<Scalars['Int']['input']>;\n  sort_field?: InputMaybe<Scalars['String']['input']>;\n  sort_order?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type QueryUserArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type Stat = {\n  __typename?: 'Stat';\n  likes?: Maybe<Scalars['Int']['output']>;\n  responses?: Maybe<Scalars['Int']['output']>;\n  retweets?: Maybe<Scalars['Int']['output']>;\n  views?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type Tweet = {\n  __typename?: 'Tweet';\n  Author?: Maybe<User>;\n  Stats?: Maybe<Stat>;\n  body?: Maybe<Scalars['String']['output']>;\n  date?: Maybe<Scalars['Date']['output']>;\n  id: Scalars['ID']['output'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  avatar_url?: Maybe<Scalars['Url']['output']>;\n  first_name?: Maybe<Scalars['String']['output']>;\n  full_name?: Maybe<Scalars['String']['output']>;\n  id: Scalars['ID']['output'];\n  last_name?: Maybe<Scalars['String']['output']>;\n  /** @deprecated Field no longer supported */\n  name?: Maybe<Scalars['String']['output']>;\n  username?: Maybe<Scalars['String']['output']>;\n};\n\nexport type FooQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type FooQuery = { __typename?: 'Query'; Tweets?: Array<{ __typename?: 'Tweet'; id: string } | null> | null };\n\nexport type LelFragment = { __typename?: 'Tweet'; id: string; body?: string | null } & {\n  ' $fragmentName'?: 'LelFragment';\n};\n\nexport type BarQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type BarQuery = {\n  __typename?: 'Query';\n  Tweets?: Array<({ __typename?: 'Tweet' } & { ' $fragmentRefs'?: { LelFragment: LelFragment } }) | null> | null;\n};\n\nexport const LelFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'Lel' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'body' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<LelFragment, unknown>;\nexport const FooDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'Foo' },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'Tweets' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'Field', name: { kind: 'Name', value: 'id' } }],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FooQuery, FooQueryVariables>;\nexport const BarDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'Bar' },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'Tweets' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'Lel' } }],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'Lel' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'body' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<BarQuery, BarQueryVariables>;\n"
  },
  {
    "path": "dev-test/gql-tag-operations/graphql/index.ts",
    "content": "export * from './fragment-masking.js';\nexport * from './gql.js';\n"
  },
  {
    "path": "dev-test/gql-tag-operations/schema.graphql",
    "content": "scalar Url\nscalar Date\n\ntype Tweet {\n  id: ID!\n  body: String\n  date: Date\n  Author: User\n  Stats: Stat\n}\n\ntype User {\n  id: ID!\n  username: String\n  first_name: String\n  last_name: String\n  full_name: String\n  name: String @deprecated\n  avatar_url: Url\n}\n\ntype Stat {\n  views: Int\n  likes: Int\n  retweets: Int\n  responses: Int\n}\n\ntype Notification {\n  id: ID\n  date: Date\n  type: String\n}\n\ntype Meta {\n  count: Int\n}\n\ntype Query {\n  Tweet(id: ID!): Tweet\n  Tweets(limit: Int, skip: Int, sort_field: String, sort_order: String): [Tweet]\n  TweetsMeta: Meta\n  User(id: ID!): User\n  Notifications(limit: Int): [Notification]\n  NotificationsMeta: Meta\n}\n\ntype Mutation {\n  createTweet(body: String): Tweet\n  deleteTweet(id: ID!): Tweet\n  markTweetRead(id: ID!): Boolean\n}\n"
  },
  {
    "path": "dev-test/gql-tag-operations/src/index.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unused-vars */\n\nimport { graphql, DocumentType } from '../gql/gql.js';\n\nconst FooQuery = graphql(/* GraphQL */ `\n  query Foo {\n    Tweets {\n      id\n    }\n  }\n`);\n\nconst LelFragment = graphql(/* GraphQL */ `\n  fragment Lel on Tweet {\n    id\n    body\n  }\n`);\n\nconst BarQuery = graphql(/* GraphQL */ `\n  query Bar {\n    Tweets {\n      ...Lel\n    }\n  }\n`);\n\nconst doSth = (params: { lel: DocumentType<typeof LelFragment> }) => {\n  params.lel.id;\n};\n"
  },
  {
    "path": "dev-test/gql-tag-operations-masking/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql.js';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "dev-test/gql-tag-operations-masking/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql.js';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  fragment TweetFragment on Tweet {\\n    id\\n    body\\n    ...TweetAuthorFragment\\n  }\\n': typeof types.TweetFragmentFragmentDoc;\n  '\\n  fragment TweetAuthorFragment on Tweet {\\n    id\\n    author {\\n      id\\n      username\\n    }\\n  }\\n': typeof types.TweetAuthorFragmentFragmentDoc;\n  '\\n  fragment TweetsFragment on Query {\\n    Tweets {\\n      id\\n      ...TweetFragment\\n    }\\n  }\\n': typeof types.TweetsFragmentFragmentDoc;\n  '\\n  query TweetAppQuery {\\n    ...TweetsFragment\\n  }\\n': typeof types.TweetAppQueryDocument;\n};\nconst documents: Documents = {\n  '\\n  fragment TweetFragment on Tweet {\\n    id\\n    body\\n    ...TweetAuthorFragment\\n  }\\n':\n    types.TweetFragmentFragmentDoc,\n  '\\n  fragment TweetAuthorFragment on Tweet {\\n    id\\n    author {\\n      id\\n      username\\n    }\\n  }\\n':\n    types.TweetAuthorFragmentFragmentDoc,\n  '\\n  fragment TweetsFragment on Query {\\n    Tweets {\\n      id\\n      ...TweetFragment\\n    }\\n  }\\n':\n    types.TweetsFragmentFragmentDoc,\n  '\\n  query TweetAppQuery {\\n    ...TweetsFragment\\n  }\\n': types.TweetAppQueryDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment TweetFragment on Tweet {\\n    id\\n    body\\n    ...TweetAuthorFragment\\n  }\\n'\n): (typeof documents)['\\n  fragment TweetFragment on Tweet {\\n    id\\n    body\\n    ...TweetAuthorFragment\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment TweetAuthorFragment on Tweet {\\n    id\\n    author {\\n      id\\n      username\\n    }\\n  }\\n'\n): (typeof documents)['\\n  fragment TweetAuthorFragment on Tweet {\\n    id\\n    author {\\n      id\\n      username\\n    }\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment TweetsFragment on Query {\\n    Tweets {\\n      id\\n      ...TweetFragment\\n    }\\n  }\\n'\n): (typeof documents)['\\n  fragment TweetsFragment on Query {\\n    Tweets {\\n      id\\n      ...TweetFragment\\n    }\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query TweetAppQuery {\\n    ...TweetsFragment\\n  }\\n'\n): (typeof documents)['\\n  query TweetAppQuery {\\n    ...TweetsFragment\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "dev-test/gql-tag-operations-masking/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n  Date: { input: any; output: any };\n  Url: { input: any; output: any };\n};\n\nexport type Meta = {\n  __typename?: 'Meta';\n  count?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  createTweet?: Maybe<Tweet>;\n  deleteTweet?: Maybe<Tweet>;\n  markTweetRead?: Maybe<Scalars['Boolean']['output']>;\n};\n\nexport type MutationCreateTweetArgs = {\n  body?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type MutationDeleteTweetArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type MutationMarkTweetReadArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type Notification = {\n  __typename?: 'Notification';\n  date?: Maybe<Scalars['Date']['output']>;\n  id?: Maybe<Scalars['ID']['output']>;\n  type?: Maybe<Scalars['String']['output']>;\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  Notifications?: Maybe<Array<Maybe<Notification>>>;\n  NotificationsMeta?: Maybe<Meta>;\n  Tweet?: Maybe<Tweet>;\n  Tweets?: Maybe<Array<Tweet>>;\n  TweetsMeta?: Maybe<Meta>;\n  User?: Maybe<User>;\n};\n\nexport type QueryNotificationsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type QueryTweetArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type QueryTweetsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  skip?: InputMaybe<Scalars['Int']['input']>;\n  sort_field?: InputMaybe<Scalars['String']['input']>;\n  sort_order?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type QueryUserArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type Stat = {\n  __typename?: 'Stat';\n  likes?: Maybe<Scalars['Int']['output']>;\n  responses?: Maybe<Scalars['Int']['output']>;\n  retweets?: Maybe<Scalars['Int']['output']>;\n  views?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type Tweet = {\n  __typename?: 'Tweet';\n  Stats?: Maybe<Stat>;\n  author: User;\n  body: Scalars['String']['output'];\n  date?: Maybe<Scalars['Date']['output']>;\n  id: Scalars['ID']['output'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  avatar_url?: Maybe<Scalars['Url']['output']>;\n  first_name?: Maybe<Scalars['String']['output']>;\n  full_name?: Maybe<Scalars['String']['output']>;\n  id: Scalars['ID']['output'];\n  last_name?: Maybe<Scalars['String']['output']>;\n  /** @deprecated Field no longer supported */\n  name?: Maybe<Scalars['String']['output']>;\n  username?: Maybe<Scalars['String']['output']>;\n};\n\nexport type TweetFragmentFragment = ({ __typename?: 'Tweet'; id: string; body: string } & {\n  ' $fragmentRefs'?: { TweetAuthorFragmentFragment: TweetAuthorFragmentFragment };\n}) & { ' $fragmentName'?: 'TweetFragmentFragment' };\n\nexport type TweetAuthorFragmentFragment = {\n  __typename?: 'Tweet';\n  id: string;\n  author: { __typename?: 'User'; id: string; username?: string | null };\n} & { ' $fragmentName'?: 'TweetAuthorFragmentFragment' };\n\nexport type TweetsFragmentFragment = {\n  __typename?: 'Query';\n  Tweets?: Array<\n    { __typename?: 'Tweet'; id: string } & { ' $fragmentRefs'?: { TweetFragmentFragment: TweetFragmentFragment } }\n  > | null;\n} & { ' $fragmentName'?: 'TweetsFragmentFragment' };\n\nexport type TweetAppQueryQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TweetAppQueryQuery = { __typename?: 'Query' } & {\n  ' $fragmentRefs'?: { TweetsFragmentFragment: TweetsFragmentFragment };\n};\n\nexport const TweetAuthorFragmentFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'TweetAuthorFragment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'author' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'username' } },\n              ],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<TweetAuthorFragmentFragment, unknown>;\nexport const TweetFragmentFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'TweetFragment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'body' } },\n          { kind: 'FragmentSpread', name: { kind: 'Name', value: 'TweetAuthorFragment' } },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'TweetAuthorFragment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'author' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'username' } },\n              ],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<TweetFragmentFragment, unknown>;\nexport const TweetsFragmentFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'TweetsFragment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Query' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'Tweets' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n                { kind: 'FragmentSpread', name: { kind: 'Name', value: 'TweetFragment' } },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'TweetAuthorFragment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'author' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'username' } },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'TweetFragment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'body' } },\n          { kind: 'FragmentSpread', name: { kind: 'Name', value: 'TweetAuthorFragment' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<TweetsFragmentFragment, unknown>;\nexport const TweetAppQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'TweetAppQuery' },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'TweetsFragment' } }],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'TweetAuthorFragment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'author' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n                { kind: 'Field', name: { kind: 'Name', value: 'username' } },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'TweetFragment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'body' } },\n          { kind: 'FragmentSpread', name: { kind: 'Name', value: 'TweetAuthorFragment' } },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'TweetsFragment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Query' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'Tweets' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n                { kind: 'FragmentSpread', name: { kind: 'Name', value: 'TweetFragment' } },\n              ],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<TweetAppQueryQuery, TweetAppQueryQueryVariables>;\n"
  },
  {
    "path": "dev-test/gql-tag-operations-masking/gql/index.ts",
    "content": "export * from './fragment-masking.js';\nexport * from './gql.js';\n"
  },
  {
    "path": "dev-test/gql-tag-operations-masking/schema.graphql",
    "content": "scalar Url\nscalar Date\n\ntype Tweet {\n  id: ID!\n  body: String!\n  date: Date\n  author: User!\n  Stats: Stat\n}\n\ntype User {\n  id: ID!\n  username: String\n  first_name: String\n  last_name: String\n  full_name: String\n  name: String @deprecated\n  avatar_url: Url\n}\n\ntype Stat {\n  views: Int\n  likes: Int\n  retweets: Int\n  responses: Int\n}\n\ntype Notification {\n  id: ID\n  date: Date\n  type: String\n}\n\ntype Meta {\n  count: Int\n}\n\ntype Query {\n  Tweet(id: ID!): Tweet\n  Tweets(limit: Int, skip: Int, sort_field: String, sort_order: String): [Tweet!]\n  TweetsMeta: Meta\n  User(id: ID!): User\n  Notifications(limit: Int): [Notification]\n  NotificationsMeta: Meta\n}\n\ntype Mutation {\n  createTweet(body: String): Tweet\n  deleteTweet(id: ID!): Tweet\n  markTweetRead(id: ID!): Boolean\n}\n"
  },
  {
    "path": "dev-test/gql-tag-operations-masking/src/index.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-unused-vars */\nimport React from 'react';\nimport { graphql, FragmentType, useFragment } from '../gql';\nimport { useQuery } from 'urql';\n\nconst TweetFragment = graphql(/* GraphQL */ `\n  fragment TweetFragment on Tweet {\n    id\n    body\n    ...TweetAuthorFragment\n  }\n`);\n\nconst TweetAuthorFragment = graphql(/* GraphQL */ `\n  fragment TweetAuthorFragment on Tweet {\n    id\n    author {\n      id\n      username\n    }\n  }\n`);\n\nconst TweetsFragment = graphql(/* GraphQL */ `\n  fragment TweetsFragment on Query {\n    Tweets {\n      id\n      ...TweetFragment\n    }\n  }\n`);\n\nconst TweetAppQuery = graphql(/* GraphQL */ `\n  query TweetAppQuery {\n    ...TweetsFragment\n  }\n`);\n\nconst Tweet = (props: { tweet: FragmentType<typeof TweetFragment> }) => {\n  const tweet = useFragment(TweetFragment, props.tweet);\n\n  return (\n    <li>\n      <TweetAuthor tweet={tweet} />\n      {tweet.id} {tweet.body}\n    </li>\n  );\n};\n\nconst TweetAuthor = (props: { tweet: FragmentType<typeof TweetAuthorFragment> }) => {\n  const tweet = useFragment(TweetAuthorFragment, props.tweet);\n\n  return <div>{tweet.author?.username}</div>;\n};\n\nconst Tweets = (props: { tweets: FragmentType<typeof TweetsFragment> | null | undefined }) => {\n  const tweets = useFragment(TweetsFragment, props.tweets);\n\n  return <ul>{tweets?.Tweets?.map(tweet => <Tweet key={tweet.id} tweet={tweet} />) ?? null}</ul>;\n};\n\nconst App = () => {\n  const [query] = useQuery({ query: TweetAppQuery });\n\n  return query.data == null ? null : <Tweets tweets={query.data} />;\n};\n"
  },
  {
    "path": "dev-test/gql-tag-operations-urql/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql.js';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "dev-test/gql-tag-operations-urql/gql/gql.d.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\ndeclare module '@urql/core' {\n  /**\n   * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n   */\n  export function gql(\n    source: '\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n'\n  ): typeof import('./graphql.js').FooDocument;\n  /**\n   * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n   */\n  export function gql(\n    source: '\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n'\n  ): typeof import('./graphql.js').LelFragmentDoc;\n  /**\n   * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n   */\n  export function gql(\n    source: '\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n'\n  ): typeof import('./graphql.js').BarDocument;\n  export function gql(source: string): unknown;\n\n  export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n    infer TType,\n    any\n  >\n    ? TType\n    : never;\n}\n"
  },
  {
    "path": "dev-test/gql-tag-operations-urql/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql.js';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n': typeof types.FooDocument;\n  '\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n': typeof types.LelFragmentDoc;\n  '\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n': typeof types.BarDocument;\n};\nconst documents: Documents = {\n  '\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n': types.FooDocument,\n  '\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n': types.LelFragmentDoc,\n  '\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n': types.BarDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query Foo {\\n    Tweets {\\n      id\\n    }\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n'\n): (typeof documents)['\\n  fragment Lel on Tweet {\\n    id\\n    body\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query Bar {\\n    Tweets {\\n      ...Lel\\n    }\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "dev-test/gql-tag-operations-urql/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n  Date: { input: any; output: any };\n  Url: { input: any; output: any };\n};\n\nexport type Meta = {\n  __typename?: 'Meta';\n  count?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  createTweet?: Maybe<Tweet>;\n  deleteTweet?: Maybe<Tweet>;\n  markTweetRead?: Maybe<Scalars['Boolean']['output']>;\n};\n\nexport type MutationCreateTweetArgs = {\n  body?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type MutationDeleteTweetArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type MutationMarkTweetReadArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type Notification = {\n  __typename?: 'Notification';\n  date?: Maybe<Scalars['Date']['output']>;\n  id?: Maybe<Scalars['ID']['output']>;\n  type?: Maybe<Scalars['String']['output']>;\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  Notifications?: Maybe<Array<Maybe<Notification>>>;\n  NotificationsMeta?: Maybe<Meta>;\n  Tweet?: Maybe<Tweet>;\n  Tweets?: Maybe<Array<Maybe<Tweet>>>;\n  TweetsMeta?: Maybe<Meta>;\n  User?: Maybe<User>;\n};\n\nexport type QueryNotificationsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type QueryTweetArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type QueryTweetsArgs = {\n  limit?: InputMaybe<Scalars['Int']['input']>;\n  skip?: InputMaybe<Scalars['Int']['input']>;\n  sort_field?: InputMaybe<Scalars['String']['input']>;\n  sort_order?: InputMaybe<Scalars['String']['input']>;\n};\n\nexport type QueryUserArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type Stat = {\n  __typename?: 'Stat';\n  likes?: Maybe<Scalars['Int']['output']>;\n  responses?: Maybe<Scalars['Int']['output']>;\n  retweets?: Maybe<Scalars['Int']['output']>;\n  views?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type Tweet = {\n  __typename?: 'Tweet';\n  Author?: Maybe<User>;\n  Stats?: Maybe<Stat>;\n  body?: Maybe<Scalars['String']['output']>;\n  date?: Maybe<Scalars['Date']['output']>;\n  id: Scalars['ID']['output'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  avatar_url?: Maybe<Scalars['Url']['output']>;\n  first_name?: Maybe<Scalars['String']['output']>;\n  full_name?: Maybe<Scalars['String']['output']>;\n  id: Scalars['ID']['output'];\n  last_name?: Maybe<Scalars['String']['output']>;\n  /** @deprecated Field no longer supported */\n  name?: Maybe<Scalars['String']['output']>;\n  username?: Maybe<Scalars['String']['output']>;\n};\n\nexport type FooQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type FooQuery = { __typename?: 'Query'; Tweets?: Array<{ __typename?: 'Tweet'; id: string } | null> | null };\n\nexport type LelFragment = { __typename?: 'Tweet'; id: string; body?: string | null } & {\n  ' $fragmentName'?: 'LelFragment';\n};\n\nexport type BarQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type BarQuery = {\n  __typename?: 'Query';\n  Tweets?: Array<({ __typename?: 'Tweet' } & { ' $fragmentRefs'?: { LelFragment: LelFragment } }) | null> | null;\n};\n\nexport const LelFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'Lel' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'body' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<LelFragment, unknown>;\nexport const FooDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'Foo' },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'Tweets' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'Field', name: { kind: 'Name', value: 'id' } }],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FooQuery, FooQueryVariables>;\nexport const BarDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'Bar' },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'Tweets' },\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'Lel' } }],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'Lel' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Tweet' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'body' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<BarQuery, BarQueryVariables>;\n"
  },
  {
    "path": "dev-test/gql-tag-operations-urql/gql/index.ts",
    "content": "export * from './fragment-masking.js';\nexport * from './gql.js';\n"
  },
  {
    "path": "dev-test/gql-tag-operations-urql/schema.graphql",
    "content": "scalar Url\nscalar Date\n\ntype Tweet {\n  id: ID!\n  body: String\n  date: Date\n  Author: User\n  Stats: Stat\n}\n\ntype User {\n  id: ID!\n  username: String\n  first_name: String\n  last_name: String\n  full_name: String\n  name: String @deprecated\n  avatar_url: Url\n}\n\ntype Stat {\n  views: Int\n  likes: Int\n  retweets: Int\n  responses: Int\n}\n\ntype Notification {\n  id: ID\n  date: Date\n  type: String\n}\n\ntype Meta {\n  count: Int\n}\n\ntype Query {\n  Tweet(id: ID!): Tweet\n  Tweets(limit: Int, skip: Int, sort_field: String, sort_order: String): [Tweet]\n  TweetsMeta: Meta\n  User(id: ID!): User\n  Notifications(limit: Int): [Notification]\n  NotificationsMeta: Meta\n}\n\ntype Mutation {\n  createTweet(body: String): Tweet\n  deleteTweet(id: ID!): Tweet\n  markTweetRead(id: ID!): Boolean\n}\n"
  },
  {
    "path": "dev-test/gql-tag-operations-urql/src/index.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { gql } from 'urql';\n\nconst FooQuery = gql(/* GraphQL */ `\n  query Foo {\n    Tweets {\n      id\n    }\n  }\n`);\n\nconst LelFragment = gql(/* GraphQL */ `\n  fragment Lel on Tweet {\n    id\n    body\n  }\n`);\n\nconst BarQuery = gql(/* GraphQL */ `\n  query Bar {\n    Tweets {\n      ...Lel\n    }\n  }\n`);\n"
  },
  {
    "path": "dev-test/modules/blog/generated.ts",
    "content": "import * as Types from '../types.js';\nimport * as gm from 'graphql-modules';\nexport namespace BlogModule {\n  interface DefinedFields {\n    Article: 'id' | 'title' | 'text' | 'author';\n    Query: 'articles' | 'articleById' | 'articlesByUser';\n  }\n\n  export type Article = Pick<Types.Article, DefinedFields['Article']>;\n  export type User = Types.User;\n  export type Query = Pick<Types.Query, DefinedFields['Query']>;\n\n  export type ArticleResolvers = Pick<Types.ArticleResolvers, DefinedFields['Article']>;\n  export type QueryResolvers = Pick<Types.QueryResolvers, DefinedFields['Query']>;\n\n  export interface Resolvers {\n    Article?: ArticleResolvers;\n    Query?: QueryResolvers;\n  }\n\n  export interface MiddlewareMap {\n    '*'?: {\n      '*'?: gm.Middleware[];\n    };\n    Article?: {\n      '*'?: gm.Middleware[];\n      id?: gm.Middleware[];\n      title?: gm.Middleware[];\n      text?: gm.Middleware[];\n      author?: gm.Middleware[];\n    };\n    Query?: {\n      '*'?: gm.Middleware[];\n      articles?: gm.Middleware[];\n      articleById?: gm.Middleware[];\n      articlesByUser?: gm.Middleware[];\n    };\n  }\n}\n"
  },
  {
    "path": "dev-test/modules/blog/types/blog.graphql",
    "content": "type Article {\n  id: ID!\n  title: String!\n  text: String!\n  author: User!\n}\n\nextend type Query {\n  articles: [Article!]\n  articleById(id: ID!): Article\n  articlesByUser(userId: ID!): [Article!]\n}\n"
  },
  {
    "path": "dev-test/modules/common/generated.ts",
    "content": "import * as Types from '../types.js';\nimport * as gm from 'graphql-modules';\nexport namespace CommonModule {\n  interface DefinedFields {\n    Query: 'ping';\n    Mutation: 'pong';\n  }\n\n  export type Query = Pick<Types.Query, DefinedFields['Query']>;\n  export type Mutation = Pick<Types.Mutation, DefinedFields['Mutation']>;\n\n  export type QueryResolvers = Pick<Types.QueryResolvers, DefinedFields['Query']>;\n  export type MutationResolvers = Pick<Types.MutationResolvers, DefinedFields['Mutation']>;\n\n  export interface Resolvers {\n    Query?: QueryResolvers;\n    Mutation?: MutationResolvers;\n  }\n\n  export interface MiddlewareMap {\n    '*'?: {\n      '*'?: gm.Middleware[];\n    };\n    Query?: {\n      '*'?: gm.Middleware[];\n      ping?: gm.Middleware[];\n    };\n    Mutation?: {\n      '*'?: gm.Middleware[];\n      pong?: gm.Middleware[];\n    };\n  }\n}\n"
  },
  {
    "path": "dev-test/modules/common/types/common.graphql",
    "content": "type Query {\n  ping: Int\n}\n\ntype Mutation {\n  pong: Int\n}\n"
  },
  {
    "path": "dev-test/modules/dotanions/generated.ts",
    "content": "import * as Types from '../types.js';\nimport * as gm from 'graphql-modules';\nexport namespace DotanionsModule {\n  interface DefinedFields {\n    Paypal: 'id' | 'url';\n    CreditCard: 'id' | 'cardNumber' | 'cardOwner';\n    Donation: 'id' | 'sender' | 'recipient' | 'amount';\n    Mutation: 'donate';\n    User: 'paymentOptions';\n  }\n\n  interface DefinedInputFields {\n    DonationInput: 'user' | 'amount' | 'paymentOption';\n  }\n\n  export type Paypal = Pick<Types.Paypal, DefinedFields['Paypal']>;\n  export type CreditCard = Pick<Types.CreditCard, DefinedFields['CreditCard']>;\n  export type PaymentOption = Types.PaymentOption;\n  export type User = Types.User;\n  export type Donation = Pick<Types.Donation, DefinedFields['Donation']>;\n  export type DonationInput = Pick<Types.DonationInput, DefinedInputFields['DonationInput']>;\n  export type Mutation = Pick<Types.Mutation, DefinedFields['Mutation']>;\n\n  export type PaypalResolvers = Pick<Types.PaypalResolvers, DefinedFields['Paypal'] | '__isTypeOf'>;\n  export type CreditCardResolvers = Pick<Types.CreditCardResolvers, DefinedFields['CreditCard'] | '__isTypeOf'>;\n  export type DonationResolvers = Pick<Types.DonationResolvers, DefinedFields['Donation']>;\n  export type MutationResolvers = Pick<Types.MutationResolvers, DefinedFields['Mutation']>;\n  export type UserResolvers = Pick<Types.UserResolvers, DefinedFields['User']>;\n\n  export interface Resolvers {\n    Paypal?: PaypalResolvers;\n    CreditCard?: CreditCardResolvers;\n    Donation?: DonationResolvers;\n    Mutation?: MutationResolvers;\n    User?: UserResolvers;\n  }\n\n  export interface MiddlewareMap {\n    '*'?: {\n      '*'?: gm.Middleware[];\n    };\n    Paypal?: {\n      '*'?: gm.Middleware[];\n      id?: gm.Middleware[];\n      url?: gm.Middleware[];\n    };\n    CreditCard?: {\n      '*'?: gm.Middleware[];\n      id?: gm.Middleware[];\n      cardNumber?: gm.Middleware[];\n      cardOwner?: gm.Middleware[];\n    };\n    User?: {\n      '*'?: gm.Middleware[];\n      paymentOptions?: gm.Middleware[];\n    };\n    Donation?: {\n      '*'?: gm.Middleware[];\n      id?: gm.Middleware[];\n      sender?: gm.Middleware[];\n      recipient?: gm.Middleware[];\n      amount?: gm.Middleware[];\n    };\n    Mutation?: {\n      '*'?: gm.Middleware[];\n      donate?: gm.Middleware[];\n    };\n  }\n}\n"
  },
  {
    "path": "dev-test/modules/dotanions/types/donations.graphql",
    "content": "type Paypal {\n  id: ID!\n  url: String!\n}\n\ntype CreditCard {\n  id: ID!\n  cardNumber: Int!\n  cardOwner: String!\n}\n\nunion PaymentOption = Paypal | CreditCard\n\nextend type User {\n  paymentOptions: [PaymentOption!]\n}\n\ntype Donation {\n  id: ID!\n  sender: User!\n  recipient: User!\n  amount: Float!\n}\n\ninput DonationInput {\n  user: ID!\n  amount: Float!\n  paymentOption: ID!\n}\n\nextend type Mutation {\n  donate(donation: DonationInput): Donation\n}\n"
  },
  {
    "path": "dev-test/modules/types.ts",
    "content": "import { GraphQLResolveInfo } from 'graphql';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\nexport type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;\nexport type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Article = {\n  __typename?: 'Article';\n  author: User;\n  id: Scalars['ID']['output'];\n  text: Scalars['String']['output'];\n  title: Scalars['String']['output'];\n};\n\nexport type CreditCard = {\n  __typename?: 'CreditCard';\n  cardNumber: Scalars['Int']['output'];\n  cardOwner: Scalars['String']['output'];\n  id: Scalars['ID']['output'];\n};\n\nexport type Donation = {\n  __typename?: 'Donation';\n  amount: Scalars['Float']['output'];\n  id: Scalars['ID']['output'];\n  recipient: User;\n  sender: User;\n};\n\nexport type DonationInput = {\n  amount: Scalars['Float']['input'];\n  paymentOption: Scalars['ID']['input'];\n  user: Scalars['ID']['input'];\n};\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  donate?: Maybe<Donation>;\n  pong?: Maybe<Scalars['Int']['output']>;\n};\n\nexport type MutationDonateArgs = {\n  donation?: InputMaybe<DonationInput>;\n};\n\nexport type PaymentOption = CreditCard | Paypal;\n\nexport type Paypal = {\n  __typename?: 'Paypal';\n  id: Scalars['ID']['output'];\n  url: Scalars['String']['output'];\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  articleById?: Maybe<Article>;\n  articles?: Maybe<Array<Article>>;\n  articlesByUser?: Maybe<Array<Article>>;\n  ping?: Maybe<Scalars['Int']['output']>;\n  userById?: Maybe<User>;\n  users?: Maybe<Array<User>>;\n};\n\nexport type QueryArticleByIdArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type QueryArticlesByUserArgs = {\n  userId: Scalars['ID']['input'];\n};\n\nexport type QueryUserByIdArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  firstName: Scalars['String']['output'];\n  id: Scalars['ID']['output'];\n  lastName: Scalars['String']['output'];\n  paymentOptions?: Maybe<Array<PaymentOption>>;\n};\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<\n  TResult,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<\n  TResult,\n  TKey extends string,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  obj: T,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<\n  TResult = Record<PropertyKey, never>,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n/** Mapping of union types */\nexport type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n  PaymentOption: CreditCard | Paypal;\n};\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = {\n  Article: ResolverTypeWrapper<Omit<Article, 'author'> & { author: ResolversTypes['User'] }>;\n  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n  CreditCard: ResolverTypeWrapper<CreditCard>;\n  Donation: ResolverTypeWrapper<\n    Omit<Donation, 'recipient' | 'sender'> & { recipient: ResolversTypes['User']; sender: ResolversTypes['User'] }\n  >;\n  DonationInput: DonationInput;\n  Float: ResolverTypeWrapper<Scalars['Float']['output']>;\n  ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n  Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n  Mutation: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  PaymentOption: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['PaymentOption']>;\n  Paypal: ResolverTypeWrapper<Paypal>;\n  Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  String: ResolverTypeWrapper<Scalars['String']['output']>;\n  User: ResolverTypeWrapper<\n    Omit<User, 'paymentOptions'> & { paymentOptions?: Maybe<Array<ResolversTypes['PaymentOption']>> }\n  >;\n};\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = {\n  Article: Omit<Article, 'author'> & { author: ResolversParentTypes['User'] };\n  Boolean: Scalars['Boolean']['output'];\n  CreditCard: CreditCard;\n  Donation: Omit<Donation, 'recipient' | 'sender'> & {\n    recipient: ResolversParentTypes['User'];\n    sender: ResolversParentTypes['User'];\n  };\n  DonationInput: DonationInput;\n  Float: Scalars['Float']['output'];\n  ID: Scalars['ID']['output'];\n  Int: Scalars['Int']['output'];\n  Mutation: Record<PropertyKey, never>;\n  PaymentOption: ResolversUnionTypes<ResolversParentTypes>['PaymentOption'];\n  Paypal: Paypal;\n  Query: Record<PropertyKey, never>;\n  String: Scalars['String']['output'];\n  User: Omit<User, 'paymentOptions'> & { paymentOptions?: Maybe<Array<ResolversParentTypes['PaymentOption']>> };\n};\n\nexport type ArticleResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Article'] = ResolversParentTypes['Article']\n> = {\n  author?: Resolver<ResolversTypes['User'], ParentType, ContextType>;\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  text?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  title?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n};\n\nexport type CreditCardResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['CreditCard'] = ResolversParentTypes['CreditCard']\n> = {\n  cardNumber?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;\n  cardOwner?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n};\n\nexport type DonationResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Donation'] = ResolversParentTypes['Donation']\n> = {\n  amount?: Resolver<ResolversTypes['Float'], ParentType, ContextType>;\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  recipient?: Resolver<ResolversTypes['User'], ParentType, ContextType>;\n  sender?: Resolver<ResolversTypes['User'], ParentType, ContextType>;\n};\n\nexport type MutationResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']\n> = {\n  donate?: Resolver<Maybe<ResolversTypes['Donation']>, ParentType, ContextType, Partial<MutationDonateArgs>>;\n  pong?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\n};\n\nexport type PaymentOptionResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['PaymentOption'] = ResolversParentTypes['PaymentOption']\n> = {\n  __resolveType: TypeResolveFn<'CreditCard' | 'Paypal', ParentType, ContextType>;\n};\n\nexport type PaypalResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Paypal'] = ResolversParentTypes['Paypal']\n> = {\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  url?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n};\n\nexport type QueryResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']\n> = {\n  articleById?: Resolver<\n    Maybe<ResolversTypes['Article']>,\n    ParentType,\n    ContextType,\n    RequireFields<QueryArticleByIdArgs, 'id'>\n  >;\n  articles?: Resolver<Maybe<Array<ResolversTypes['Article']>>, ParentType, ContextType>;\n  articlesByUser?: Resolver<\n    Maybe<Array<ResolversTypes['Article']>>,\n    ParentType,\n    ContextType,\n    RequireFields<QueryArticlesByUserArgs, 'userId'>\n  >;\n  ping?: Resolver<Maybe<ResolversTypes['Int']>, ParentType, ContextType>;\n  userById?: Resolver<Maybe<ResolversTypes['User']>, ParentType, ContextType, RequireFields<QueryUserByIdArgs, 'id'>>;\n  users?: Resolver<Maybe<Array<ResolversTypes['User']>>, ParentType, ContextType>;\n};\n\nexport type UserResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']\n> = {\n  firstName?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  lastName?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  paymentOptions?: Resolver<Maybe<Array<ResolversTypes['PaymentOption']>>, ParentType, ContextType>;\n};\n\nexport type Resolvers<ContextType = any> = {\n  Article?: ArticleResolvers<ContextType>;\n  CreditCard?: CreditCardResolvers<ContextType>;\n  Donation?: DonationResolvers<ContextType>;\n  Mutation?: MutationResolvers<ContextType>;\n  PaymentOption?: PaymentOptionResolvers<ContextType>;\n  Paypal?: PaypalResolvers<ContextType>;\n  Query?: QueryResolvers<ContextType>;\n  User?: UserResolvers<ContextType>;\n};\n"
  },
  {
    "path": "dev-test/modules/users/generated.ts",
    "content": "import * as Types from '../types.js';\nimport * as gm from 'graphql-modules';\nexport namespace UsersModule {\n  interface DefinedFields {\n    User: 'id' | 'firstName' | 'lastName';\n    Query: 'users' | 'userById';\n  }\n\n  export type User = Pick<Types.User, DefinedFields['User']>;\n  export type Query = Pick<Types.Query, DefinedFields['Query']>;\n\n  export type UserResolvers = Pick<Types.UserResolvers, DefinedFields['User']>;\n  export type QueryResolvers = Pick<Types.QueryResolvers, DefinedFields['Query']>;\n\n  export interface Resolvers {\n    User?: UserResolvers;\n    Query?: QueryResolvers;\n  }\n\n  export interface MiddlewareMap {\n    '*'?: {\n      '*'?: gm.Middleware[];\n    };\n    User?: {\n      '*'?: gm.Middleware[];\n      id?: gm.Middleware[];\n      firstName?: gm.Middleware[];\n      lastName?: gm.Middleware[];\n    };\n    Query?: {\n      '*'?: gm.Middleware[];\n      users?: gm.Middleware[];\n      userById?: gm.Middleware[];\n    };\n  }\n}\n"
  },
  {
    "path": "dev-test/modules/users/types/users.graphql",
    "content": "type User {\n  id: ID!\n  firstName: String!\n  lastName: String!\n}\n\nextend type Query {\n  users: [User!]\n  userById(id: ID!): User\n}\n"
  },
  {
    "path": "dev-test/setup.js",
    "content": "process.on('unhandledRejection', err => {\n  fail(err);\n});\n"
  },
  {
    "path": "dev-test/star-wars/CreateReviewForEpisode.graphql",
    "content": "mutation CreateReviewForEpisode($episode: Episode!, $review: ReviewInput!) {\n  createReview(episode: $episode, review: $review) {\n    stars\n    commentary\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/ExcludeQueryAlpha.graphql",
    "content": "# This file should be excluded by pattern matching in types.excludeQueryAlpha\nquery ExcludeQueryAlpha($episode: Episode) {\n  hero(episode: $episode) {\n    name\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/ExcludeQueryBeta.graphql",
    "content": "# This file should be excluded by pattern matching in types.excludeQueryBeta\nquery ExcludeQueryBeta($episode: Episode) {\n  hero(episode: $episode) {\n    name\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/HeroAndFriendsNames.graphql",
    "content": "query HeroAndFriendsNames($episode: Episode) {\n  hero(episode: $episode) {\n    name\n    friends {\n      name\n    }\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/HeroAppearsIn.graphql",
    "content": "query HeroAppearsIn {\n  hero {\n    name\n    appearsIn\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/HeroDetails.graphql",
    "content": "query HeroDetails($episode: Episode) {\n  hero(episode: $episode) {\n    name\n    ... on Human {\n      height\n    }\n    ... on Droid {\n      primaryFunction\n    }\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/HeroDetailsFragment.graphql",
    "content": "fragment HeroDetails on Character {\n  name\n  ... on Human {\n    height\n  }\n  ... on Droid {\n    primaryFunction\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/HeroDetailsWithFragment.graphql",
    "content": "query HeroDetailsWithFragment($episode: Episode) {\n  hero(episode: $episode) {\n    ...HeroDetails\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/HeroName.graphql",
    "content": "query HeroName($episode: Episode) {\n  hero(episode: $episode) {\n    name\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/HeroNameConditional.graphql",
    "content": "query HeroNameConditionalInclusion($episode: Episode, $includeName: Boolean!) {\n  hero(episode: $episode) {\n    name @include(if: $includeName)\n  }\n}\n\nquery HeroNameConditionalExclusion($episode: Episode, $skipName: Boolean!) {\n  hero(episode: $episode) {\n    name @skip(if: $skipName)\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/HeroParentTypeDependentField.graphql",
    "content": "query HeroParentTypeDependentField($episode: Episode) {\n  hero(episode: $episode) {\n    name\n    ... on Human {\n      friends {\n        name\n        ... on Human {\n          height(unit: FOOT)\n        }\n      }\n    }\n    ... on Droid {\n      friends {\n        name\n        ... on Human {\n          height(unit: METER)\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/HeroTypeDependentAliasedField.graphql",
    "content": "query HeroTypeDependentAliasedField($episode: Episode) {\n  hero(episode: $episode) {\n    ... on Human {\n      property: homePlanet\n    }\n    ... on Droid {\n      property: primaryFunction\n    }\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/HumanFields.graphql",
    "content": "fragment HumanFields on Human {\n  name\n  mass\n}\n"
  },
  {
    "path": "dev-test/star-wars/HumanWithNullWeight.graphql",
    "content": "query HumanWithNullHeight {\n  human(id: 1004) {\n    ...HumanFields\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/TwoHeroes.graphql",
    "content": "query TwoHeroes {\n  r2: hero {\n    name\n  }\n  luke: hero(episode: EMPIRE) {\n    name\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/schema.json",
    "content": "{\n  \"data\": {\n    \"__schema\": {\n      \"queryType\": {\n        \"name\": \"Query\"\n      },\n      \"mutationType\": {\n        \"name\": \"Mutation\"\n      },\n      \"subscriptionType\": null,\n      \"types\": [\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Query\",\n          \"description\": \"The query type, represents all of the entry points into our object graph\",\n          \"fields\": [\n            {\n              \"name\": \"hero\",\n              \"description\": \"\",\n              \"args\": [\n                {\n                  \"name\": \"episode\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"ENUM\",\n                    \"name\": \"Episode\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"INTERFACE\",\n                \"name\": \"Character\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"reviews\",\n              \"description\": \"\",\n              \"args\": [\n                {\n                  \"name\": \"episode\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"ENUM\",\n                      \"name\": \"Episode\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"Review\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"search\",\n              \"description\": \"\",\n              \"args\": [\n                {\n                  \"name\": \"text\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"UNION\",\n                  \"name\": \"SearchResult\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"character\",\n              \"description\": \"\",\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"SCALAR\",\n                      \"name\": \"ID\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"INTERFACE\",\n                \"name\": \"Character\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"droid\",\n              \"description\": \"\",\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"SCALAR\",\n                      \"name\": \"ID\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Droid\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"human\",\n              \"description\": \"\",\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"SCALAR\",\n                      \"name\": \"ID\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Human\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"starship\",\n              \"description\": \"\",\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"SCALAR\",\n                      \"name\": \"ID\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Starship\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"ENUM\",\n          \"name\": \"Episode\",\n          \"description\": \"The episodes in the Star Wars trilogy\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": [\n            {\n              \"name\": \"NEWHOPE\",\n              \"description\": \"Star Wars Episode IV: A New Hope, released in 1977.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"EMPIRE\",\n              \"description\": \"Star Wars Episode V: The Empire Strikes Back, released in 1980.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"JEDI\",\n              \"description\": \"Star Wars Episode VI: Return of the Jedi, released in 1983.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INTERFACE\",\n          \"name\": \"Character\",\n          \"description\": \"A character from the Star Wars universe\",\n          \"fields\": [\n            {\n              \"name\": \"id\",\n              \"description\": \"The ID of the character\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": \"The name of the character\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"friends\",\n              \"description\": \"The friends of the character, or an empty list if they have none\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"INTERFACE\",\n                  \"name\": \"Character\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"friendsConnection\",\n              \"description\": \"The friends of the character exposed as a connection with edges\",\n              \"args\": [\n                {\n                  \"name\": \"first\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Int\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"after\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"ID\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"FriendsConnection\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"appearsIn\",\n              \"description\": \"The movies this character appears in\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"ENUM\",\n                    \"name\": \"Episode\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": [\n            {\n              \"kind\": \"OBJECT\",\n              \"name\": \"Human\",\n              \"ofType\": null\n            },\n            {\n              \"kind\": \"OBJECT\",\n              \"name\": \"Droid\",\n              \"ofType\": null\n            }\n          ]\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"ID\",\n          \"description\": \"The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\\\"4\\\"`) or integer (such as `4`) input value will be accepted as an ID.\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"String\",\n          \"description\": \"The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"Int\",\n          \"description\": \"The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. \",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"FriendsConnection\",\n          \"description\": \"A connection object for a character's friends\",\n          \"fields\": [\n            {\n              \"name\": \"totalCount\",\n              \"description\": \"The total number of friends\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Int\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"edges\",\n              \"description\": \"The edges for each of the character's friends.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"FriendsEdge\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"friends\",\n              \"description\": \"A list of the friends, as a convenience when edges are not needed.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"INTERFACE\",\n                  \"name\": \"Character\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"pageInfo\",\n              \"description\": \"Information for paginating this connection\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"PageInfo\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"FriendsEdge\",\n          \"description\": \"An edge object for a character's friends\",\n          \"fields\": [\n            {\n              \"name\": \"cursor\",\n              \"description\": \"A cursor used for pagination\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"node\",\n              \"description\": \"The character represented by this friendship edge\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"INTERFACE\",\n                \"name\": \"Character\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"PageInfo\",\n          \"description\": \"Information for paginating this connection\",\n          \"fields\": [\n            {\n              \"name\": \"startCursor\",\n              \"description\": \"\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"endCursor\",\n              \"description\": \"\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"ID\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"hasNextPage\",\n              \"description\": \"\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"Boolean\",\n          \"description\": \"The `Boolean` scalar type represents `true` or `false`.\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Review\",\n          \"description\": \"Represents a review for a movie\",\n          \"fields\": [\n            {\n              \"name\": \"stars\",\n              \"description\": \"The number of stars this review gave, 1-5\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Int\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"commentary\",\n              \"description\": \"Comment about the movie\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"UNION\",\n          \"name\": \"SearchResult\",\n          \"description\": \"\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": [\n            {\n              \"kind\": \"OBJECT\",\n              \"name\": \"Human\",\n              \"ofType\": null\n            },\n            {\n              \"kind\": \"OBJECT\",\n              \"name\": \"Droid\",\n              \"ofType\": null\n            },\n            {\n              \"kind\": \"OBJECT\",\n              \"name\": \"Starship\",\n              \"ofType\": null\n            }\n          ]\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Human\",\n          \"description\": \"A humanoid creature from the Star Wars universe\",\n          \"fields\": [\n            {\n              \"name\": \"id\",\n              \"description\": \"The ID of the human\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": \"What this human calls themselves\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"homePlanet\",\n              \"description\": \"The home planet of the human, or null if unknown\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"height\",\n              \"description\": \"Height in the preferred unit, default is meters\",\n              \"args\": [\n                {\n                  \"name\": \"unit\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"ENUM\",\n                    \"name\": \"LengthUnit\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": \"METER\"\n                }\n              ],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"mass\",\n              \"description\": \"Mass in kilograms, or null if unknown\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"friends\",\n              \"description\": \"This human's friends, or an empty list if they have none\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"INTERFACE\",\n                  \"name\": \"Character\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"friendsConnection\",\n              \"description\": \"The friends of the human exposed as a connection with edges\",\n              \"args\": [\n                {\n                  \"name\": \"first\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Int\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"after\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"ID\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"FriendsConnection\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"appearsIn\",\n              \"description\": \"The movies this human appears in\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"ENUM\",\n                    \"name\": \"Episode\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"starships\",\n              \"description\": \"A list of starships this person has piloted, or an empty list if none\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"Starship\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [\n            {\n              \"kind\": \"INTERFACE\",\n              \"name\": \"Character\",\n              \"ofType\": null\n            }\n          ],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"ENUM\",\n          \"name\": \"LengthUnit\",\n          \"description\": \"Units of height\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": [\n            {\n              \"name\": \"METER\",\n              \"description\": \"The standard unit around the world\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FOOT\",\n              \"description\": \"Primarily used in the United States\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"Float\",\n          \"description\": \"The `Float` scalar type represents signed double-precision fractional values as specified by [IEEE 754](http://en.wikipedia.org/wiki/IEEE_floating_point). \",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Starship\",\n          \"description\": \"\",\n          \"fields\": [\n            {\n              \"name\": \"id\",\n              \"description\": \"The ID of the starship\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": \"The name of the starship\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"length\",\n              \"description\": \"Length of the starship, along the longest axis\",\n              \"args\": [\n                {\n                  \"name\": \"unit\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"ENUM\",\n                    \"name\": \"LengthUnit\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": \"METER\"\n                }\n              ],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Float\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Droid\",\n          \"description\": \"An autonomous mechanical character in the Star Wars universe\",\n          \"fields\": [\n            {\n              \"name\": \"id\",\n              \"description\": \"The ID of the droid\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": \"What others call this droid\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"friends\",\n              \"description\": \"This droid's friends, or an empty list if they have none\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"INTERFACE\",\n                  \"name\": \"Character\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"friendsConnection\",\n              \"description\": \"The friends of the droid exposed as a connection with edges\",\n              \"args\": [\n                {\n                  \"name\": \"first\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Int\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"after\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"ID\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"FriendsConnection\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"appearsIn\",\n              \"description\": \"The movies this droid appears in\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"ENUM\",\n                    \"name\": \"Episode\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"primaryFunction\",\n              \"description\": \"This droid's primary function\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [\n            {\n              \"kind\": \"INTERFACE\",\n              \"name\": \"Character\",\n              \"ofType\": null\n            }\n          ],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Mutation\",\n          \"description\": \"The mutation type, represents all updates we can make to our data\",\n          \"fields\": [\n            {\n              \"name\": \"createReview\",\n              \"description\": \"\",\n              \"args\": [\n                {\n                  \"name\": \"episode\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"ENUM\",\n                    \"name\": \"Episode\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"review\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"ReviewInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Review\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"ReviewInput\",\n          \"description\": \"The input object sent when someone is creating a new review\",\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"stars\",\n              \"description\": \"0-5 stars\",\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Int\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"commentary\",\n              \"description\": \"Comment about the movie, optional\",\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"favoriteColor\",\n              \"description\": \"Favorite color, optional\",\n              \"type\": {\n                \"kind\": \"INPUT_OBJECT\",\n                \"name\": \"ColorInput\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"ColorInput\",\n          \"description\": \"The input object sent when passing a color\",\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"red\",\n              \"description\": \"\",\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Int\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"green\",\n              \"description\": \"\",\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Int\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"blue\",\n              \"description\": \"\",\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Int\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Schema\",\n          \"description\": \"A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.\",\n          \"fields\": [\n            {\n              \"name\": \"types\",\n              \"description\": \"A list of all types supported by this server.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__Type\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"queryType\",\n              \"description\": \"The type that query operations will be rooted at.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"mutationType\",\n              \"description\": \"If this server supports mutation, the type that mutation operations will be rooted at.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"subscriptionType\",\n              \"description\": \"If this server support subscription, the type that subscription operations will be rooted at.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"directives\",\n              \"description\": \"A list of all directives supported by this server.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__Directive\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Type\",\n          \"description\": \"The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\\n\\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name and description, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.\",\n          \"fields\": [\n            {\n              \"name\": \"kind\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"ENUM\",\n                  \"name\": \"__TypeKind\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"fields\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"includeDeprecated\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Boolean\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": \"false\"\n                }\n              ],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Field\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"interfaces\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Type\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"possibleTypes\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Type\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"enumValues\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"includeDeprecated\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Boolean\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": \"false\"\n                }\n              ],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__EnumValue\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"inputFields\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__InputValue\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ofType\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"ENUM\",\n          \"name\": \"__TypeKind\",\n          \"description\": \"An enum describing what kind of type a given `__Type` is.\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": [\n            {\n              \"name\": \"SCALAR\",\n              \"description\": \"Indicates this type is a scalar.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"OBJECT\",\n              \"description\": \"Indicates this type is an object. `fields` and `interfaces` are valid fields.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INTERFACE\",\n              \"description\": \"Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"UNION\",\n              \"description\": \"Indicates this type is a union. `possibleTypes` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ENUM\",\n              \"description\": \"Indicates this type is an enum. `enumValues` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INPUT_OBJECT\",\n              \"description\": \"Indicates this type is an input object. `inputFields` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"LIST\",\n              \"description\": \"Indicates this type is a list. `ofType` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"NON_NULL\",\n              \"description\": \"Indicates this type is a non-null. `ofType` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Field\",\n          \"description\": \"Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.\",\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"args\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__InputValue\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"type\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"isDeprecated\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"deprecationReason\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__InputValue\",\n          \"description\": \"Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.\",\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"type\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"defaultValue\",\n              \"description\": \"A GraphQL-formatted string representing the default value for this input value.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__EnumValue\",\n          \"description\": \"One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.\",\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"isDeprecated\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"deprecationReason\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Directive\",\n          \"description\": \"A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\\n\\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.\",\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"locations\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"ENUM\",\n                      \"name\": \"__DirectiveLocation\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"args\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__InputValue\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onOperation\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": true,\n              \"deprecationReason\": \"Use `locations`.\"\n            },\n            {\n              \"name\": \"onFragment\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": true,\n              \"deprecationReason\": \"Use `locations`.\"\n            },\n            {\n              \"name\": \"onField\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": true,\n              \"deprecationReason\": \"Use `locations`.\"\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"ENUM\",\n          \"name\": \"__DirectiveLocation\",\n          \"description\": \"A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": [\n            {\n              \"name\": \"QUERY\",\n              \"description\": \"Location adjacent to a query operation.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"MUTATION\",\n              \"description\": \"Location adjacent to a mutation operation.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"SUBSCRIPTION\",\n              \"description\": \"Location adjacent to a subscription operation.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FIELD\",\n              \"description\": \"Location adjacent to a field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FRAGMENT_DEFINITION\",\n              \"description\": \"Location adjacent to a fragment definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FRAGMENT_SPREAD\",\n              \"description\": \"Location adjacent to a fragment spread.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INLINE_FRAGMENT\",\n              \"description\": \"Location adjacent to an inline fragment.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"SCHEMA\",\n              \"description\": \"Location adjacent to a schema definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"SCALAR\",\n              \"description\": \"Location adjacent to a scalar definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"OBJECT\",\n              \"description\": \"Location adjacent to an object type definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FIELD_DEFINITION\",\n              \"description\": \"Location adjacent to a field definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ARGUMENT_DEFINITION\",\n              \"description\": \"Location adjacent to an argument definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INTERFACE\",\n              \"description\": \"Location adjacent to an interface definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"UNION\",\n              \"description\": \"Location adjacent to a union definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ENUM\",\n              \"description\": \"Location adjacent to an enum definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ENUM_VALUE\",\n              \"description\": \"Location adjacent to an enum value definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INPUT_OBJECT\",\n              \"description\": \"Location adjacent to an input object type definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INPUT_FIELD_DEFINITION\",\n              \"description\": \"Location adjacent to an input object field definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"possibleTypes\": null\n        }\n      ],\n      \"directives\": [\n        {\n          \"name\": \"skip\",\n          \"description\": \"Directs the executor to skip this field or fragment when the `if` argument is true.\",\n          \"locations\": [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"],\n          \"args\": [\n            {\n              \"name\": \"if\",\n              \"description\": \"Skipped when true.\",\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ]\n        },\n        {\n          \"name\": \"include\",\n          \"description\": \"Directs the executor to include this field or fragment only when the `if` argument is true.\",\n          \"locations\": [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"],\n          \"args\": [\n            {\n              \"name\": \"if\",\n              \"description\": \"Included when true.\",\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ]\n        },\n        {\n          \"name\": \"deprecated\",\n          \"description\": \"Marks an element of a GraphQL schema as no longer supported.\",\n          \"locations\": [\"FIELD_DEFINITION\", \"ENUM_VALUE\"],\n          \"args\": [\n            {\n              \"name\": \"reason\",\n              \"description\": \"Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted in [Markdown](https://daringfireball.net/projects/markdown/).\",\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": \"\\\"No longer supported\\\"\"\n            }\n          ]\n        }\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "dev-test/star-wars/types.OnlyEnums.ts",
    "content": "/** The episodes in the Star Wars trilogy */\nexport enum Episode {\n  /** Star Wars Episode V: The Empire Strikes Back, released in 1980. */\n  Empire = 'EMPIRE',\n  /** Star Wars Episode VI: Return of the Jedi, released in 1983. */\n  Jedi = 'JEDI',\n  /** Star Wars Episode IV: A New Hope, released in 1977. */\n  Newhope = 'NEWHOPE',\n}\n\n/** Units of height */\nexport enum LengthUnit {\n  /** Primarily used in the United States */\n  Foot = 'FOOT',\n  /** The standard unit around the world */\n  Meter = 'METER',\n}\n"
  },
  {
    "path": "dev-test/star-wars/types.avoidOptionals.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A character from the Star Wars universe */\nexport type Character = {\n  /** The movies this character appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** The friends of the character, or an empty list if they have none */\n  friends: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the character exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the character */\n  id: Scalars['ID']['output'];\n  /** The name of the character */\n  name: Scalars['String']['output'];\n};\n\n/** A character from the Star Wars universe */\nexport type CharacterFriendsConnectionArgs = {\n  after: InputMaybe<Scalars['ID']['input']>;\n  first: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The input object sent when passing a color */\nexport type ColorInput = {\n  blue: Scalars['Int']['input'];\n  green: Scalars['Int']['input'];\n  red: Scalars['Int']['input'];\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type Droid = Character & {\n  __typename?: 'Droid';\n  /** The movies this droid appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This droid's friends, or an empty list if they have none */\n  friends: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the droid exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the droid */\n  id: Scalars['ID']['output'];\n  /** What others call this droid */\n  name: Scalars['String']['output'];\n  /** This droid's primary function */\n  primaryFunction: Maybe<Scalars['String']['output']>;\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type DroidFriendsConnectionArgs = {\n  after: InputMaybe<Scalars['ID']['input']>;\n  first: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The episodes in the Star Wars trilogy */\nexport enum Episode {\n  /** Star Wars Episode V: The Empire Strikes Back, released in 1980. */\n  Empire = 'EMPIRE',\n  /** Star Wars Episode VI: Return of the Jedi, released in 1983. */\n  Jedi = 'JEDI',\n  /** Star Wars Episode IV: A New Hope, released in 1977. */\n  Newhope = 'NEWHOPE',\n}\n\n/** A connection object for a character's friends */\nexport type FriendsConnection = {\n  __typename?: 'FriendsConnection';\n  /** The edges for each of the character's friends. */\n  edges: Maybe<Array<Maybe<FriendsEdge>>>;\n  /** A list of the friends, as a convenience when edges are not needed. */\n  friends: Maybe<Array<Maybe<Character>>>;\n  /** Information for paginating this connection */\n  pageInfo: PageInfo;\n  /** The total number of friends */\n  totalCount: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge object for a character's friends */\nexport type FriendsEdge = {\n  __typename?: 'FriendsEdge';\n  /** A cursor used for pagination */\n  cursor: Scalars['ID']['output'];\n  /** The character represented by this friendship edge */\n  node: Maybe<Character>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type Human = Character & {\n  __typename?: 'Human';\n  /** The movies this human appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This human's friends, or an empty list if they have none */\n  friends: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the human exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** Height in the preferred unit, default is meters */\n  height: Maybe<Scalars['Float']['output']>;\n  /** The home planet of the human, or null if unknown */\n  homePlanet: Maybe<Scalars['String']['output']>;\n  /** The ID of the human */\n  id: Scalars['ID']['output'];\n  /** Mass in kilograms, or null if unknown */\n  mass: Maybe<Scalars['Float']['output']>;\n  /** What this human calls themselves */\n  name: Scalars['String']['output'];\n  /** A list of starships this person has piloted, or an empty list if none */\n  starships: Maybe<Array<Maybe<Starship>>>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanFriendsConnectionArgs = {\n  after: InputMaybe<Scalars['ID']['input']>;\n  first: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanHeightArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\n/** Units of height */\nexport enum LengthUnit {\n  /** Primarily used in the United States */\n  Foot = 'FOOT',\n  /** The standard unit around the world */\n  Meter = 'METER',\n}\n\n/** The mutation type, represents all updates we can make to our data */\nexport type Mutation = {\n  __typename?: 'Mutation';\n  createReview: Maybe<Review>;\n};\n\n/** The mutation type, represents all updates we can make to our data */\nexport type MutationCreateReviewArgs = {\n  episode: InputMaybe<Episode>;\n  review: ReviewInput;\n};\n\n/** Information for paginating this connection */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  endCursor: Maybe<Scalars['ID']['output']>;\n  hasNextPage: Scalars['Boolean']['output'];\n  startCursor: Maybe<Scalars['ID']['output']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type Query = {\n  __typename?: 'Query';\n  character: Maybe<Character>;\n  droid: Maybe<Droid>;\n  hero: Maybe<Character>;\n  human: Maybe<Human>;\n  reviews: Maybe<Array<Maybe<Review>>>;\n  search: Maybe<Array<Maybe<SearchResult>>>;\n  starship: Maybe<Starship>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryCharacterArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryDroidArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHeroArgs = {\n  episode: InputMaybe<Episode>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHumanArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryReviewsArgs = {\n  episode: Episode;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QuerySearchArgs = {\n  text: InputMaybe<Scalars['String']['input']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryStarshipArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** Represents a review for a movie */\nexport type Review = {\n  __typename?: 'Review';\n  /** Comment about the movie */\n  commentary: Maybe<Scalars['String']['output']>;\n  /** The number of stars this review gave, 1-5 */\n  stars: Scalars['Int']['output'];\n};\n\n/** The input object sent when someone is creating a new review */\nexport type ReviewInput = {\n  /** Comment about the movie, optional */\n  commentary: InputMaybe<Scalars['String']['input']>;\n  /** Favorite color, optional */\n  favoriteColor: InputMaybe<ColorInput>;\n  /** 0-5 stars */\n  stars: Scalars['Int']['input'];\n};\n\nexport type SearchResult = Droid | Human | Starship;\n\nexport type Starship = {\n  __typename?: 'Starship';\n  /** The ID of the starship */\n  id: Scalars['ID']['output'];\n  /** Length of the starship, along the longest axis */\n  length: Maybe<Scalars['Float']['output']>;\n  /** The name of the starship */\n  name: Scalars['String']['output'];\n};\n\nexport type StarshipLengthArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\nexport type CreateReviewForEpisodeMutationVariables = Exact<{\n  episode: Episode;\n  review: ReviewInput;\n}>;\n\nexport type CreateReviewForEpisodeMutation = {\n  __typename?: 'Mutation';\n  createReview: { __typename?: 'Review'; stars: number; commentary: string | null } | null;\n};\n\nexport type ExcludeQueryAlphaQueryVariables = Exact<{\n  episode: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryAlphaQuery = {\n  __typename?: 'Query';\n  hero: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type ExcludeQueryBetaQueryVariables = Exact<{\n  episode: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryBetaQuery = {\n  __typename?: 'Query';\n  hero: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroAndFriendsNamesQueryVariables = Exact<{\n  episode: InputMaybe<Episode>;\n}>;\n\nexport type HeroAndFriendsNamesQuery = {\n  __typename?: 'Query';\n  hero:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | null;\n};\n\nexport type HeroAppearsInQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HeroAppearsInQuery = {\n  __typename?: 'Query';\n  hero:\n    | { __typename?: 'Droid'; name: string; appearsIn: Array<Episode | null> }\n    | { __typename?: 'Human'; name: string; appearsIn: Array<Episode | null> }\n    | null;\n};\n\nexport type HeroDetailsQueryVariables = Exact<{\n  episode: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsQuery = {\n  __typename?: 'Query';\n  hero:\n    | { __typename?: 'Droid'; primaryFunction: string | null; name: string }\n    | { __typename?: 'Human'; height: number | null; name: string }\n    | null;\n};\n\ntype HeroDetails_Droid_Fragment = { __typename?: 'Droid'; primaryFunction: string | null; name: string };\n\ntype HeroDetails_Human_Fragment = { __typename?: 'Human'; height: number | null; name: string };\n\nexport type HeroDetailsFragment = HeroDetails_Droid_Fragment | HeroDetails_Human_Fragment;\n\nexport type HeroDetailsWithFragmentQueryVariables = Exact<{\n  episode: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsWithFragmentQuery = {\n  __typename?: 'Query';\n  hero:\n    | { __typename?: 'Droid'; primaryFunction: string | null; name: string }\n    | { __typename?: 'Human'; height: number | null; name: string }\n    | null;\n};\n\nexport type HeroNameQueryVariables = Exact<{\n  episode: InputMaybe<Episode>;\n}>;\n\nexport type HeroNameQuery = {\n  __typename?: 'Query';\n  hero: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroNameConditionalInclusionQueryVariables = Exact<{\n  episode: InputMaybe<Episode>;\n  includeName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalInclusionQuery = {\n  __typename?: 'Query';\n  hero: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroNameConditionalExclusionQueryVariables = Exact<{\n  episode: InputMaybe<Episode>;\n  skipName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalExclusionQuery = {\n  __typename?: 'Query';\n  hero: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroParentTypeDependentFieldQueryVariables = Exact<{\n  episode: InputMaybe<Episode>;\n}>;\n\nexport type HeroParentTypeDependentFieldQuery = {\n  __typename?: 'Query';\n  hero:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height: number | null; name: string } | null\n        > | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height: number | null; name: string } | null\n        > | null;\n      }\n    | null;\n};\n\nexport type HeroTypeDependentAliasedFieldQueryVariables = Exact<{\n  episode: InputMaybe<Episode>;\n}>;\n\nexport type HeroTypeDependentAliasedFieldQuery = {\n  __typename?: 'Query';\n  hero: { __typename?: 'Droid'; property: string | null } | { __typename?: 'Human'; property: string | null } | null;\n};\n\nexport type HumanFieldsFragment = { __typename?: 'Human'; name: string; mass: number | null };\n\nexport type HumanWithNullHeightQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HumanWithNullHeightQuery = {\n  __typename?: 'Query';\n  human: { __typename?: 'Human'; name: string; mass: number | null } | null;\n};\n\nexport type TwoHeroesQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TwoHeroesQuery = {\n  __typename?: 'Query';\n  r2: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n  luke: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n"
  },
  {
    "path": "dev-test/star-wars/types.d.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A character from the Star Wars universe */\nexport type Character = {\n  /** The movies this character appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** The friends of the character, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the character exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the character */\n  id: Scalars['ID']['output'];\n  /** The name of the character */\n  name: Scalars['String']['output'];\n};\n\n/** A character from the Star Wars universe */\nexport type CharacterFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The input object sent when passing a color */\nexport type ColorInput = {\n  blue: Scalars['Int']['input'];\n  green: Scalars['Int']['input'];\n  red: Scalars['Int']['input'];\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type Droid = Character & {\n  __typename?: 'Droid';\n  /** The movies this droid appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This droid's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the droid exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the droid */\n  id: Scalars['ID']['output'];\n  /** What others call this droid */\n  name: Scalars['String']['output'];\n  /** This droid's primary function */\n  primaryFunction?: Maybe<Scalars['String']['output']>;\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type DroidFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The episodes in the Star Wars trilogy */\nexport type Episode =\n  /** Star Wars Episode V: The Empire Strikes Back, released in 1980. */\n  | 'EMPIRE'\n  /** Star Wars Episode VI: Return of the Jedi, released in 1983. */\n  | 'JEDI'\n  /** Star Wars Episode IV: A New Hope, released in 1977. */\n  | 'NEWHOPE';\n\n/** A connection object for a character's friends */\nexport type FriendsConnection = {\n  __typename?: 'FriendsConnection';\n  /** The edges for each of the character's friends. */\n  edges?: Maybe<Array<Maybe<FriendsEdge>>>;\n  /** A list of the friends, as a convenience when edges are not needed. */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** Information for paginating this connection */\n  pageInfo: PageInfo;\n  /** The total number of friends */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge object for a character's friends */\nexport type FriendsEdge = {\n  __typename?: 'FriendsEdge';\n  /** A cursor used for pagination */\n  cursor: Scalars['ID']['output'];\n  /** The character represented by this friendship edge */\n  node?: Maybe<Character>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type Human = Character & {\n  __typename?: 'Human';\n  /** The movies this human appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This human's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the human exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** Height in the preferred unit, default is meters */\n  height?: Maybe<Scalars['Float']['output']>;\n  /** The home planet of the human, or null if unknown */\n  homePlanet?: Maybe<Scalars['String']['output']>;\n  /** The ID of the human */\n  id: Scalars['ID']['output'];\n  /** Mass in kilograms, or null if unknown */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** What this human calls themselves */\n  name: Scalars['String']['output'];\n  /** A list of starships this person has piloted, or an empty list if none */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanHeightArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\n/** Units of height */\nexport type LengthUnit =\n  /** Primarily used in the United States */\n  | 'FOOT'\n  /** The standard unit around the world */\n  | 'METER';\n\n/** The mutation type, represents all updates we can make to our data */\nexport type Mutation = {\n  __typename?: 'Mutation';\n  createReview?: Maybe<Review>;\n};\n\n/** The mutation type, represents all updates we can make to our data */\nexport type MutationCreateReviewArgs = {\n  episode?: InputMaybe<Episode>;\n  review: ReviewInput;\n};\n\n/** Information for paginating this connection */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  endCursor?: Maybe<Scalars['ID']['output']>;\n  hasNextPage: Scalars['Boolean']['output'];\n  startCursor?: Maybe<Scalars['ID']['output']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type Query = {\n  __typename?: 'Query';\n  character?: Maybe<Character>;\n  droid?: Maybe<Droid>;\n  hero?: Maybe<Character>;\n  human?: Maybe<Human>;\n  reviews?: Maybe<Array<Maybe<Review>>>;\n  search?: Maybe<Array<Maybe<SearchResult>>>;\n  starship?: Maybe<Starship>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryCharacterArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryDroidArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHeroArgs = {\n  episode?: InputMaybe<Episode>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHumanArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryReviewsArgs = {\n  episode: Episode;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QuerySearchArgs = {\n  text?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryStarshipArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** Represents a review for a movie */\nexport type Review = {\n  __typename?: 'Review';\n  /** Comment about the movie */\n  commentary?: Maybe<Scalars['String']['output']>;\n  /** The number of stars this review gave, 1-5 */\n  stars: Scalars['Int']['output'];\n};\n\n/** The input object sent when someone is creating a new review */\nexport type ReviewInput = {\n  /** Comment about the movie, optional */\n  commentary?: InputMaybe<Scalars['String']['input']>;\n  /** Favorite color, optional */\n  favoriteColor?: InputMaybe<ColorInput>;\n  /** 0-5 stars */\n  stars: Scalars['Int']['input'];\n};\n\nexport type SearchResult = Droid | Human | Starship;\n\nexport type Starship = {\n  __typename?: 'Starship';\n  /** The ID of the starship */\n  id: Scalars['ID']['output'];\n  /** Length of the starship, along the longest axis */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The name of the starship */\n  name: Scalars['String']['output'];\n};\n\nexport type StarshipLengthArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n"
  },
  {
    "path": "dev-test/star-wars/types.excludeQueryAlpha.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A character from the Star Wars universe */\nexport type Character = {\n  /** The movies this character appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** The friends of the character, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the character exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the character */\n  id: Scalars['ID']['output'];\n  /** The name of the character */\n  name: Scalars['String']['output'];\n};\n\n/** A character from the Star Wars universe */\nexport type CharacterFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The input object sent when passing a color */\nexport type ColorInput = {\n  blue: Scalars['Int']['input'];\n  green: Scalars['Int']['input'];\n  red: Scalars['Int']['input'];\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type Droid = Character & {\n  __typename?: 'Droid';\n  /** The movies this droid appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This droid's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the droid exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the droid */\n  id: Scalars['ID']['output'];\n  /** What others call this droid */\n  name: Scalars['String']['output'];\n  /** This droid's primary function */\n  primaryFunction?: Maybe<Scalars['String']['output']>;\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type DroidFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The episodes in the Star Wars trilogy */\nexport enum Episode {\n  /** Star Wars Episode V: The Empire Strikes Back, released in 1980. */\n  Empire = 'EMPIRE',\n  /** Star Wars Episode VI: Return of the Jedi, released in 1983. */\n  Jedi = 'JEDI',\n  /** Star Wars Episode IV: A New Hope, released in 1977. */\n  Newhope = 'NEWHOPE',\n}\n\n/** A connection object for a character's friends */\nexport type FriendsConnection = {\n  __typename?: 'FriendsConnection';\n  /** The edges for each of the character's friends. */\n  edges?: Maybe<Array<Maybe<FriendsEdge>>>;\n  /** A list of the friends, as a convenience when edges are not needed. */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** Information for paginating this connection */\n  pageInfo: PageInfo;\n  /** The total number of friends */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge object for a character's friends */\nexport type FriendsEdge = {\n  __typename?: 'FriendsEdge';\n  /** A cursor used for pagination */\n  cursor: Scalars['ID']['output'];\n  /** The character represented by this friendship edge */\n  node?: Maybe<Character>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type Human = Character & {\n  __typename?: 'Human';\n  /** The movies this human appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This human's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the human exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** Height in the preferred unit, default is meters */\n  height?: Maybe<Scalars['Float']['output']>;\n  /** The home planet of the human, or null if unknown */\n  homePlanet?: Maybe<Scalars['String']['output']>;\n  /** The ID of the human */\n  id: Scalars['ID']['output'];\n  /** Mass in kilograms, or null if unknown */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** What this human calls themselves */\n  name: Scalars['String']['output'];\n  /** A list of starships this person has piloted, or an empty list if none */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanHeightArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\n/** Units of height */\nexport enum LengthUnit {\n  /** Primarily used in the United States */\n  Foot = 'FOOT',\n  /** The standard unit around the world */\n  Meter = 'METER',\n}\n\n/** The mutation type, represents all updates we can make to our data */\nexport type Mutation = {\n  __typename?: 'Mutation';\n  createReview?: Maybe<Review>;\n};\n\n/** The mutation type, represents all updates we can make to our data */\nexport type MutationCreateReviewArgs = {\n  episode?: InputMaybe<Episode>;\n  review: ReviewInput;\n};\n\n/** Information for paginating this connection */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  endCursor?: Maybe<Scalars['ID']['output']>;\n  hasNextPage: Scalars['Boolean']['output'];\n  startCursor?: Maybe<Scalars['ID']['output']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type Query = {\n  __typename?: 'Query';\n  character?: Maybe<Character>;\n  droid?: Maybe<Droid>;\n  hero?: Maybe<Character>;\n  human?: Maybe<Human>;\n  reviews?: Maybe<Array<Maybe<Review>>>;\n  search?: Maybe<Array<Maybe<SearchResult>>>;\n  starship?: Maybe<Starship>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryCharacterArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryDroidArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHeroArgs = {\n  episode?: InputMaybe<Episode>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHumanArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryReviewsArgs = {\n  episode: Episode;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QuerySearchArgs = {\n  text?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryStarshipArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** Represents a review for a movie */\nexport type Review = {\n  __typename?: 'Review';\n  /** Comment about the movie */\n  commentary?: Maybe<Scalars['String']['output']>;\n  /** The number of stars this review gave, 1-5 */\n  stars: Scalars['Int']['output'];\n};\n\n/** The input object sent when someone is creating a new review */\nexport type ReviewInput = {\n  /** Comment about the movie, optional */\n  commentary?: InputMaybe<Scalars['String']['input']>;\n  /** Favorite color, optional */\n  favoriteColor?: InputMaybe<ColorInput>;\n  /** 0-5 stars */\n  stars: Scalars['Int']['input'];\n};\n\nexport type SearchResult = Droid | Human | Starship;\n\nexport type Starship = {\n  __typename?: 'Starship';\n  /** The ID of the starship */\n  id: Scalars['ID']['output'];\n  /** Length of the starship, along the longest axis */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The name of the starship */\n  name: Scalars['String']['output'];\n};\n\nexport type StarshipLengthArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\nexport type CreateReviewForEpisodeMutationVariables = Exact<{\n  episode: Episode;\n  review: ReviewInput;\n}>;\n\nexport type CreateReviewForEpisodeMutation = {\n  __typename?: 'Mutation';\n  createReview?: { __typename?: 'Review'; stars: number; commentary?: string | null } | null;\n};\n\nexport type ExcludeQueryBetaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryBetaQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroAndFriendsNamesQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroAndFriendsNamesQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | null;\n};\n\nexport type HeroAppearsInQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HeroAppearsInQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; name: string; appearsIn: Array<Episode | null> }\n    | { __typename?: 'Human'; name: string; appearsIn: Array<Episode | null> }\n    | null;\n};\n\nexport type HeroDetailsQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\ntype HeroDetails_Droid_Fragment = { __typename?: 'Droid'; primaryFunction?: string | null; name: string };\n\ntype HeroDetails_Human_Fragment = { __typename?: 'Human'; height?: number | null; name: string };\n\nexport type HeroDetailsFragment = HeroDetails_Droid_Fragment | HeroDetails_Human_Fragment;\n\nexport type HeroDetailsWithFragmentQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsWithFragmentQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\nexport type HeroNameQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroNameQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroNameConditionalInclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  includeName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalInclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroNameConditionalExclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  skipName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalExclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroParentTypeDependentFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroParentTypeDependentFieldQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | null;\n};\n\nexport type HeroTypeDependentAliasedFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroTypeDependentAliasedFieldQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; property?: string | null } | { __typename?: 'Human'; property?: string | null } | null;\n};\n\nexport type HumanFieldsFragment = { __typename?: 'Human'; name: string; mass?: number | null };\n\nexport type HumanWithNullHeightQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HumanWithNullHeightQuery = {\n  __typename?: 'Query';\n  human?: { __typename?: 'Human'; name: string; mass?: number | null } | null;\n};\n\nexport type TwoHeroesQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TwoHeroesQuery = {\n  __typename?: 'Query';\n  r2?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n  luke?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n"
  },
  {
    "path": "dev-test/star-wars/types.excludeQueryBeta.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A character from the Star Wars universe */\nexport type Character = {\n  /** The movies this character appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** The friends of the character, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the character exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the character */\n  id: Scalars['ID']['output'];\n  /** The name of the character */\n  name: Scalars['String']['output'];\n};\n\n/** A character from the Star Wars universe */\nexport type CharacterFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The input object sent when passing a color */\nexport type ColorInput = {\n  blue: Scalars['Int']['input'];\n  green: Scalars['Int']['input'];\n  red: Scalars['Int']['input'];\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type Droid = Character & {\n  __typename?: 'Droid';\n  /** The movies this droid appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This droid's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the droid exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the droid */\n  id: Scalars['ID']['output'];\n  /** What others call this droid */\n  name: Scalars['String']['output'];\n  /** This droid's primary function */\n  primaryFunction?: Maybe<Scalars['String']['output']>;\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type DroidFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The episodes in the Star Wars trilogy */\nexport enum Episode {\n  /** Star Wars Episode V: The Empire Strikes Back, released in 1980. */\n  Empire = 'EMPIRE',\n  /** Star Wars Episode VI: Return of the Jedi, released in 1983. */\n  Jedi = 'JEDI',\n  /** Star Wars Episode IV: A New Hope, released in 1977. */\n  Newhope = 'NEWHOPE',\n}\n\n/** A connection object for a character's friends */\nexport type FriendsConnection = {\n  __typename?: 'FriendsConnection';\n  /** The edges for each of the character's friends. */\n  edges?: Maybe<Array<Maybe<FriendsEdge>>>;\n  /** A list of the friends, as a convenience when edges are not needed. */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** Information for paginating this connection */\n  pageInfo: PageInfo;\n  /** The total number of friends */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge object for a character's friends */\nexport type FriendsEdge = {\n  __typename?: 'FriendsEdge';\n  /** A cursor used for pagination */\n  cursor: Scalars['ID']['output'];\n  /** The character represented by this friendship edge */\n  node?: Maybe<Character>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type Human = Character & {\n  __typename?: 'Human';\n  /** The movies this human appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This human's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the human exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** Height in the preferred unit, default is meters */\n  height?: Maybe<Scalars['Float']['output']>;\n  /** The home planet of the human, or null if unknown */\n  homePlanet?: Maybe<Scalars['String']['output']>;\n  /** The ID of the human */\n  id: Scalars['ID']['output'];\n  /** Mass in kilograms, or null if unknown */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** What this human calls themselves */\n  name: Scalars['String']['output'];\n  /** A list of starships this person has piloted, or an empty list if none */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanHeightArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\n/** Units of height */\nexport enum LengthUnit {\n  /** Primarily used in the United States */\n  Foot = 'FOOT',\n  /** The standard unit around the world */\n  Meter = 'METER',\n}\n\n/** The mutation type, represents all updates we can make to our data */\nexport type Mutation = {\n  __typename?: 'Mutation';\n  createReview?: Maybe<Review>;\n};\n\n/** The mutation type, represents all updates we can make to our data */\nexport type MutationCreateReviewArgs = {\n  episode?: InputMaybe<Episode>;\n  review: ReviewInput;\n};\n\n/** Information for paginating this connection */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  endCursor?: Maybe<Scalars['ID']['output']>;\n  hasNextPage: Scalars['Boolean']['output'];\n  startCursor?: Maybe<Scalars['ID']['output']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type Query = {\n  __typename?: 'Query';\n  character?: Maybe<Character>;\n  droid?: Maybe<Droid>;\n  hero?: Maybe<Character>;\n  human?: Maybe<Human>;\n  reviews?: Maybe<Array<Maybe<Review>>>;\n  search?: Maybe<Array<Maybe<SearchResult>>>;\n  starship?: Maybe<Starship>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryCharacterArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryDroidArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHeroArgs = {\n  episode?: InputMaybe<Episode>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHumanArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryReviewsArgs = {\n  episode: Episode;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QuerySearchArgs = {\n  text?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryStarshipArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** Represents a review for a movie */\nexport type Review = {\n  __typename?: 'Review';\n  /** Comment about the movie */\n  commentary?: Maybe<Scalars['String']['output']>;\n  /** The number of stars this review gave, 1-5 */\n  stars: Scalars['Int']['output'];\n};\n\n/** The input object sent when someone is creating a new review */\nexport type ReviewInput = {\n  /** Comment about the movie, optional */\n  commentary?: InputMaybe<Scalars['String']['input']>;\n  /** Favorite color, optional */\n  favoriteColor?: InputMaybe<ColorInput>;\n  /** 0-5 stars */\n  stars: Scalars['Int']['input'];\n};\n\nexport type SearchResult = Droid | Human | Starship;\n\nexport type Starship = {\n  __typename?: 'Starship';\n  /** The ID of the starship */\n  id: Scalars['ID']['output'];\n  /** Length of the starship, along the longest axis */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The name of the starship */\n  name: Scalars['String']['output'];\n};\n\nexport type StarshipLengthArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\nexport type CreateReviewForEpisodeMutationVariables = Exact<{\n  episode: Episode;\n  review: ReviewInput;\n}>;\n\nexport type CreateReviewForEpisodeMutation = {\n  __typename?: 'Mutation';\n  createReview?: { __typename?: 'Review'; stars: number; commentary?: string | null } | null;\n};\n\nexport type ExcludeQueryAlphaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryAlphaQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroAndFriendsNamesQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroAndFriendsNamesQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | null;\n};\n\nexport type HeroAppearsInQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HeroAppearsInQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; name: string; appearsIn: Array<Episode | null> }\n    | { __typename?: 'Human'; name: string; appearsIn: Array<Episode | null> }\n    | null;\n};\n\nexport type HeroDetailsQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\ntype HeroDetails_Droid_Fragment = { __typename?: 'Droid'; primaryFunction?: string | null; name: string };\n\ntype HeroDetails_Human_Fragment = { __typename?: 'Human'; height?: number | null; name: string };\n\nexport type HeroDetailsFragment = HeroDetails_Droid_Fragment | HeroDetails_Human_Fragment;\n\nexport type HeroDetailsWithFragmentQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsWithFragmentQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\nexport type HeroNameQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroNameQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroNameConditionalInclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  includeName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalInclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroNameConditionalExclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  skipName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalExclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroParentTypeDependentFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroParentTypeDependentFieldQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | null;\n};\n\nexport type HeroTypeDependentAliasedFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroTypeDependentAliasedFieldQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; property?: string | null } | { __typename?: 'Human'; property?: string | null } | null;\n};\n\nexport type HumanFieldsFragment = { __typename?: 'Human'; name: string; mass?: number | null };\n\nexport type HumanWithNullHeightQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HumanWithNullHeightQuery = {\n  __typename?: 'Query';\n  human?: { __typename?: 'Human'; name: string; mass?: number | null } | null;\n};\n\nexport type TwoHeroesQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TwoHeroesQuery = {\n  __typename?: 'Query';\n  r2?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n  luke?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n"
  },
  {
    "path": "dev-test/star-wars/types.globallyAvailable.d.ts",
    "content": "type Maybe<T> = T | null;\ntype InputMaybe<T> = Maybe<T>;\ntype Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\ntype MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\ntype MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\ntype MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\ntype Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\ntype Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A character from the Star Wars universe */\ntype Character = {\n  /** The movies this character appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** The friends of the character, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the character exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the character */\n  id: Scalars['ID']['output'];\n  /** The name of the character */\n  name: Scalars['String']['output'];\n};\n\n/** A character from the Star Wars universe */\ntype CharacterFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The input object sent when passing a color */\ntype ColorInput = {\n  blue: Scalars['Int']['input'];\n  green: Scalars['Int']['input'];\n  red: Scalars['Int']['input'];\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\ntype Droid = Character & {\n  __typename?: 'Droid';\n  /** The movies this droid appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This droid's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the droid exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the droid */\n  id: Scalars['ID']['output'];\n  /** What others call this droid */\n  name: Scalars['String']['output'];\n  /** This droid's primary function */\n  primaryFunction?: Maybe<Scalars['String']['output']>;\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\ntype DroidFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The episodes in the Star Wars trilogy */\ntype Episode =\n  /** Star Wars Episode V: The Empire Strikes Back, released in 1980. */\n  | 'EMPIRE'\n  /** Star Wars Episode VI: Return of the Jedi, released in 1983. */\n  | 'JEDI'\n  /** Star Wars Episode IV: A New Hope, released in 1977. */\n  | 'NEWHOPE';\n\n/** A connection object for a character's friends */\ntype FriendsConnection = {\n  __typename?: 'FriendsConnection';\n  /** The edges for each of the character's friends. */\n  edges?: Maybe<Array<Maybe<FriendsEdge>>>;\n  /** A list of the friends, as a convenience when edges are not needed. */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** Information for paginating this connection */\n  pageInfo: PageInfo;\n  /** The total number of friends */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge object for a character's friends */\ntype FriendsEdge = {\n  __typename?: 'FriendsEdge';\n  /** A cursor used for pagination */\n  cursor: Scalars['ID']['output'];\n  /** The character represented by this friendship edge */\n  node?: Maybe<Character>;\n};\n\n/** A humanoid creature from the Star Wars universe */\ntype Human = Character & {\n  __typename?: 'Human';\n  /** The movies this human appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This human's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the human exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** Height in the preferred unit, default is meters */\n  height?: Maybe<Scalars['Float']['output']>;\n  /** The home planet of the human, or null if unknown */\n  homePlanet?: Maybe<Scalars['String']['output']>;\n  /** The ID of the human */\n  id: Scalars['ID']['output'];\n  /** Mass in kilograms, or null if unknown */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** What this human calls themselves */\n  name: Scalars['String']['output'];\n  /** A list of starships this person has piloted, or an empty list if none */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n};\n\n/** A humanoid creature from the Star Wars universe */\ntype HumanFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A humanoid creature from the Star Wars universe */\ntype HumanHeightArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\n/** Units of height */\ntype LengthUnit =\n  /** Primarily used in the United States */\n  | 'FOOT'\n  /** The standard unit around the world */\n  | 'METER';\n\n/** The mutation type, represents all updates we can make to our data */\ntype Mutation = {\n  __typename?: 'Mutation';\n  createReview?: Maybe<Review>;\n};\n\n/** The mutation type, represents all updates we can make to our data */\ntype MutationCreateReviewArgs = {\n  episode?: InputMaybe<Episode>;\n  review: ReviewInput;\n};\n\n/** Information for paginating this connection */\ntype PageInfo = {\n  __typename?: 'PageInfo';\n  endCursor?: Maybe<Scalars['ID']['output']>;\n  hasNextPage: Scalars['Boolean']['output'];\n  startCursor?: Maybe<Scalars['ID']['output']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\ntype Query = {\n  __typename?: 'Query';\n  character?: Maybe<Character>;\n  droid?: Maybe<Droid>;\n  hero?: Maybe<Character>;\n  human?: Maybe<Human>;\n  reviews?: Maybe<Array<Maybe<Review>>>;\n  search?: Maybe<Array<Maybe<SearchResult>>>;\n  starship?: Maybe<Starship>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\ntype QueryCharacterArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\ntype QueryDroidArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\ntype QueryHeroArgs = {\n  episode?: InputMaybe<Episode>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\ntype QueryHumanArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\ntype QueryReviewsArgs = {\n  episode: Episode;\n};\n\n/** The query type, represents all of the entry points into our object graph */\ntype QuerySearchArgs = {\n  text?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\ntype QueryStarshipArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** Represents a review for a movie */\ntype Review = {\n  __typename?: 'Review';\n  /** Comment about the movie */\n  commentary?: Maybe<Scalars['String']['output']>;\n  /** The number of stars this review gave, 1-5 */\n  stars: Scalars['Int']['output'];\n};\n\n/** The input object sent when someone is creating a new review */\ntype ReviewInput = {\n  /** Comment about the movie, optional */\n  commentary?: InputMaybe<Scalars['String']['input']>;\n  /** Favorite color, optional */\n  favoriteColor?: InputMaybe<ColorInput>;\n  /** 0-5 stars */\n  stars: Scalars['Int']['input'];\n};\n\ntype SearchResult = Droid | Human | Starship;\n\ntype Starship = {\n  __typename?: 'Starship';\n  /** The ID of the starship */\n  id: Scalars['ID']['output'];\n  /** Length of the starship, along the longest axis */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The name of the starship */\n  name: Scalars['String']['output'];\n};\n\ntype StarshipLengthArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\ntype CreateReviewForEpisodeMutationVariables = Exact<{\n  episode: Episode;\n  review: ReviewInput;\n}>;\n\ntype CreateReviewForEpisodeMutation = {\n  __typename?: 'Mutation';\n  createReview?: { __typename?: 'Review'; stars: number; commentary?: string | null } | null;\n};\n\ntype ExcludeQueryAlphaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\ntype ExcludeQueryAlphaQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\ntype ExcludeQueryBetaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\ntype ExcludeQueryBetaQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\ntype HeroAndFriendsNamesQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\ntype HeroAndFriendsNamesQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | null;\n};\n\ntype HeroAppearsInQueryVariables = Exact<{ [key: string]: never }>;\n\ntype HeroAppearsInQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; name: string; appearsIn: Array<Episode | null> }\n    | { __typename?: 'Human'; name: string; appearsIn: Array<Episode | null> }\n    | null;\n};\n\ntype HeroDetailsQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\ntype HeroDetailsQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\ntype HeroDetails_Droid_Fragment = { __typename?: 'Droid'; primaryFunction?: string | null; name: string };\n\ntype HeroDetails_Human_Fragment = { __typename?: 'Human'; height?: number | null; name: string };\n\ntype HeroDetailsFragment = HeroDetails_Droid_Fragment | HeroDetails_Human_Fragment;\n\ntype HeroDetailsWithFragmentQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\ntype HeroDetailsWithFragmentQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\ntype HeroNameQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\ntype HeroNameQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\ntype HeroNameConditionalInclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  includeName: Scalars['Boolean']['input'];\n}>;\n\ntype HeroNameConditionalInclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\ntype HeroNameConditionalExclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  skipName: Scalars['Boolean']['input'];\n}>;\n\ntype HeroNameConditionalExclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\ntype HeroParentTypeDependentFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\ntype HeroParentTypeDependentFieldQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | null;\n};\n\ntype HeroTypeDependentAliasedFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\ntype HeroTypeDependentAliasedFieldQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; property?: string | null } | { __typename?: 'Human'; property?: string | null } | null;\n};\n\ntype HumanFieldsFragment = { __typename?: 'Human'; name: string; mass?: number | null };\n\ntype HumanWithNullHeightQueryVariables = Exact<{ [key: string]: never }>;\n\ntype HumanWithNullHeightQuery = {\n  __typename?: 'Query';\n  human?: { __typename?: 'Human'; name: string; mass?: number | null } | null;\n};\n\ntype TwoHeroesQueryVariables = Exact<{ [key: string]: never }>;\n\ntype TwoHeroesQuery = {\n  __typename?: 'Query';\n  r2?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n  luke?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n"
  },
  {
    "path": "dev-test/star-wars/types.immutableTypes.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A character from the Star Wars universe */\nexport type Character = {\n  /** The movies this character appears in */\n  readonly appearsIn: ReadonlyArray<Maybe<Episode>>;\n  /** The friends of the character, or an empty list if they have none */\n  readonly friends?: Maybe<ReadonlyArray<Maybe<Character>>>;\n  /** The friends of the character exposed as a connection with edges */\n  readonly friendsConnection: FriendsConnection;\n  /** The ID of the character */\n  readonly id: Scalars['ID']['output'];\n  /** The name of the character */\n  readonly name: Scalars['String']['output'];\n};\n\n/** A character from the Star Wars universe */\nexport type CharacterFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The input object sent when passing a color */\nexport type ColorInput = {\n  readonly blue: Scalars['Int']['input'];\n  readonly green: Scalars['Int']['input'];\n  readonly red: Scalars['Int']['input'];\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type Droid = Character & {\n  readonly __typename?: 'Droid';\n  /** The movies this droid appears in */\n  readonly appearsIn: ReadonlyArray<Maybe<Episode>>;\n  /** This droid's friends, or an empty list if they have none */\n  readonly friends?: Maybe<ReadonlyArray<Maybe<Character>>>;\n  /** The friends of the droid exposed as a connection with edges */\n  readonly friendsConnection: FriendsConnection;\n  /** The ID of the droid */\n  readonly id: Scalars['ID']['output'];\n  /** What others call this droid */\n  readonly name: Scalars['String']['output'];\n  /** This droid's primary function */\n  readonly primaryFunction?: Maybe<Scalars['String']['output']>;\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type DroidFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The episodes in the Star Wars trilogy */\nexport enum Episode {\n  /** Star Wars Episode V: The Empire Strikes Back, released in 1980. */\n  Empire = 'EMPIRE',\n  /** Star Wars Episode VI: Return of the Jedi, released in 1983. */\n  Jedi = 'JEDI',\n  /** Star Wars Episode IV: A New Hope, released in 1977. */\n  Newhope = 'NEWHOPE',\n}\n\n/** A connection object for a character's friends */\nexport type FriendsConnection = {\n  readonly __typename?: 'FriendsConnection';\n  /** The edges for each of the character's friends. */\n  readonly edges?: Maybe<ReadonlyArray<Maybe<FriendsEdge>>>;\n  /** A list of the friends, as a convenience when edges are not needed. */\n  readonly friends?: Maybe<ReadonlyArray<Maybe<Character>>>;\n  /** Information for paginating this connection */\n  readonly pageInfo: PageInfo;\n  /** The total number of friends */\n  readonly totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge object for a character's friends */\nexport type FriendsEdge = {\n  readonly __typename?: 'FriendsEdge';\n  /** A cursor used for pagination */\n  readonly cursor: Scalars['ID']['output'];\n  /** The character represented by this friendship edge */\n  readonly node?: Maybe<Character>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type Human = Character & {\n  readonly __typename?: 'Human';\n  /** The movies this human appears in */\n  readonly appearsIn: ReadonlyArray<Maybe<Episode>>;\n  /** This human's friends, or an empty list if they have none */\n  readonly friends?: Maybe<ReadonlyArray<Maybe<Character>>>;\n  /** The friends of the human exposed as a connection with edges */\n  readonly friendsConnection: FriendsConnection;\n  /** Height in the preferred unit, default is meters */\n  readonly height?: Maybe<Scalars['Float']['output']>;\n  /** The home planet of the human, or null if unknown */\n  readonly homePlanet?: Maybe<Scalars['String']['output']>;\n  /** The ID of the human */\n  readonly id: Scalars['ID']['output'];\n  /** Mass in kilograms, or null if unknown */\n  readonly mass?: Maybe<Scalars['Float']['output']>;\n  /** What this human calls themselves */\n  readonly name: Scalars['String']['output'];\n  /** A list of starships this person has piloted, or an empty list if none */\n  readonly starships?: Maybe<ReadonlyArray<Maybe<Starship>>>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanHeightArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\n/** Units of height */\nexport enum LengthUnit {\n  /** Primarily used in the United States */\n  Foot = 'FOOT',\n  /** The standard unit around the world */\n  Meter = 'METER',\n}\n\n/** The mutation type, represents all updates we can make to our data */\nexport type Mutation = {\n  readonly __typename?: 'Mutation';\n  readonly createReview?: Maybe<Review>;\n};\n\n/** The mutation type, represents all updates we can make to our data */\nexport type MutationCreateReviewArgs = {\n  episode?: InputMaybe<Episode>;\n  review: ReviewInput;\n};\n\n/** Information for paginating this connection */\nexport type PageInfo = {\n  readonly __typename?: 'PageInfo';\n  readonly endCursor?: Maybe<Scalars['ID']['output']>;\n  readonly hasNextPage: Scalars['Boolean']['output'];\n  readonly startCursor?: Maybe<Scalars['ID']['output']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type Query = {\n  readonly __typename?: 'Query';\n  readonly character?: Maybe<Character>;\n  readonly droid?: Maybe<Droid>;\n  readonly hero?: Maybe<Character>;\n  readonly human?: Maybe<Human>;\n  readonly reviews?: Maybe<ReadonlyArray<Maybe<Review>>>;\n  readonly search?: Maybe<ReadonlyArray<Maybe<SearchResult>>>;\n  readonly starship?: Maybe<Starship>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryCharacterArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryDroidArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHeroArgs = {\n  episode?: InputMaybe<Episode>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHumanArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryReviewsArgs = {\n  episode: Episode;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QuerySearchArgs = {\n  text?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryStarshipArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** Represents a review for a movie */\nexport type Review = {\n  readonly __typename?: 'Review';\n  /** Comment about the movie */\n  readonly commentary?: Maybe<Scalars['String']['output']>;\n  /** The number of stars this review gave, 1-5 */\n  readonly stars: Scalars['Int']['output'];\n};\n\n/** The input object sent when someone is creating a new review */\nexport type ReviewInput = {\n  /** Comment about the movie, optional */\n  readonly commentary?: InputMaybe<Scalars['String']['input']>;\n  /** Favorite color, optional */\n  readonly favoriteColor?: InputMaybe<ColorInput>;\n  /** 0-5 stars */\n  readonly stars: Scalars['Int']['input'];\n};\n\nexport type SearchResult = Droid | Human | Starship;\n\nexport type Starship = {\n  readonly __typename?: 'Starship';\n  /** The ID of the starship */\n  readonly id: Scalars['ID']['output'];\n  /** Length of the starship, along the longest axis */\n  readonly length?: Maybe<Scalars['Float']['output']>;\n  /** The name of the starship */\n  readonly name: Scalars['String']['output'];\n};\n\nexport type StarshipLengthArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\nexport type CreateReviewForEpisodeMutationVariables = Exact<{\n  episode: Episode;\n  review: ReviewInput;\n}>;\n\nexport type CreateReviewForEpisodeMutation = {\n  readonly __typename?: 'Mutation';\n  readonly createReview?: {\n    readonly __typename?: 'Review';\n    readonly stars: number;\n    readonly commentary?: string | null;\n  } | null;\n};\n\nexport type ExcludeQueryAlphaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryAlphaQuery = {\n  readonly __typename?: 'Query';\n  readonly hero?:\n    | { readonly __typename?: 'Droid'; readonly name: string }\n    | { readonly __typename?: 'Human'; readonly name: string }\n    | null;\n};\n\nexport type ExcludeQueryBetaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryBetaQuery = {\n  readonly __typename?: 'Query';\n  readonly hero?:\n    | { readonly __typename?: 'Droid'; readonly name: string }\n    | { readonly __typename?: 'Human'; readonly name: string }\n    | null;\n};\n\nexport type HeroAndFriendsNamesQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroAndFriendsNamesQuery = {\n  readonly __typename?: 'Query';\n  readonly hero?:\n    | {\n        readonly __typename?: 'Droid';\n        readonly name: string;\n        readonly friends?: ReadonlyArray<\n          | { readonly __typename?: 'Droid'; readonly name: string }\n          | { readonly __typename?: 'Human'; readonly name: string }\n          | null\n        > | null;\n      }\n    | {\n        readonly __typename?: 'Human';\n        readonly name: string;\n        readonly friends?: ReadonlyArray<\n          | { readonly __typename?: 'Droid'; readonly name: string }\n          | { readonly __typename?: 'Human'; readonly name: string }\n          | null\n        > | null;\n      }\n    | null;\n};\n\nexport type HeroAppearsInQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HeroAppearsInQuery = {\n  readonly __typename?: 'Query';\n  readonly hero?:\n    | { readonly __typename?: 'Droid'; readonly name: string; readonly appearsIn: ReadonlyArray<Episode | null> }\n    | { readonly __typename?: 'Human'; readonly name: string; readonly appearsIn: ReadonlyArray<Episode | null> }\n    | null;\n};\n\nexport type HeroDetailsQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsQuery = {\n  readonly __typename?: 'Query';\n  readonly hero?:\n    | { readonly __typename?: 'Droid'; readonly primaryFunction?: string | null; readonly name: string }\n    | { readonly __typename?: 'Human'; readonly height?: number | null; readonly name: string }\n    | null;\n};\n\ntype HeroDetails_Droid_Fragment = {\n  readonly __typename?: 'Droid';\n  readonly primaryFunction?: string | null;\n  readonly name: string;\n};\n\ntype HeroDetails_Human_Fragment = {\n  readonly __typename?: 'Human';\n  readonly height?: number | null;\n  readonly name: string;\n};\n\nexport type HeroDetailsFragment = HeroDetails_Droid_Fragment | HeroDetails_Human_Fragment;\n\nexport type HeroDetailsWithFragmentQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsWithFragmentQuery = {\n  readonly __typename?: 'Query';\n  readonly hero?:\n    | { readonly __typename?: 'Droid'; readonly primaryFunction?: string | null; readonly name: string }\n    | { readonly __typename?: 'Human'; readonly height?: number | null; readonly name: string }\n    | null;\n};\n\nexport type HeroNameQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroNameQuery = {\n  readonly __typename?: 'Query';\n  readonly hero?:\n    | { readonly __typename?: 'Droid'; readonly name: string }\n    | { readonly __typename?: 'Human'; readonly name: string }\n    | null;\n};\n\nexport type HeroNameConditionalInclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  includeName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalInclusionQuery = {\n  readonly __typename?: 'Query';\n  readonly hero?:\n    | { readonly __typename?: 'Droid'; readonly name?: string }\n    | { readonly __typename?: 'Human'; readonly name?: string }\n    | null;\n};\n\nexport type HeroNameConditionalExclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  skipName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalExclusionQuery = {\n  readonly __typename?: 'Query';\n  readonly hero?:\n    | { readonly __typename?: 'Droid'; readonly name?: string }\n    | { readonly __typename?: 'Human'; readonly name?: string }\n    | null;\n};\n\nexport type HeroParentTypeDependentFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroParentTypeDependentFieldQuery = {\n  readonly __typename?: 'Query';\n  readonly hero?:\n    | {\n        readonly __typename?: 'Droid';\n        readonly name: string;\n        readonly friends?: ReadonlyArray<\n          | { readonly __typename?: 'Droid'; readonly name: string }\n          | { readonly __typename?: 'Human'; readonly height?: number | null; readonly name: string }\n          | null\n        > | null;\n      }\n    | {\n        readonly __typename?: 'Human';\n        readonly name: string;\n        readonly friends?: ReadonlyArray<\n          | { readonly __typename?: 'Droid'; readonly name: string }\n          | { readonly __typename?: 'Human'; readonly height?: number | null; readonly name: string }\n          | null\n        > | null;\n      }\n    | null;\n};\n\nexport type HeroTypeDependentAliasedFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroTypeDependentAliasedFieldQuery = {\n  readonly __typename?: 'Query';\n  readonly hero?:\n    | { readonly __typename?: 'Droid'; readonly property?: string | null }\n    | { readonly __typename?: 'Human'; readonly property?: string | null }\n    | null;\n};\n\nexport type HumanFieldsFragment = {\n  readonly __typename?: 'Human';\n  readonly name: string;\n  readonly mass?: number | null;\n};\n\nexport type HumanWithNullHeightQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HumanWithNullHeightQuery = {\n  readonly __typename?: 'Query';\n  readonly human?: { readonly __typename?: 'Human'; readonly name: string; readonly mass?: number | null } | null;\n};\n\nexport type TwoHeroesQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TwoHeroesQuery = {\n  readonly __typename?: 'Query';\n  readonly r2?:\n    | { readonly __typename?: 'Droid'; readonly name: string }\n    | { readonly __typename?: 'Human'; readonly name: string }\n    | null;\n  readonly luke?:\n    | { readonly __typename?: 'Droid'; readonly name: string }\n    | { readonly __typename?: 'Human'; readonly name: string }\n    | null;\n};\n"
  },
  {
    "path": "dev-test/star-wars/types.preResolveTypes.onlyOperationTypes.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** The input object sent when passing a color */\nexport type ColorInput = {\n  blue: Scalars['Int']['input'];\n  green: Scalars['Int']['input'];\n  red: Scalars['Int']['input'];\n};\n\n/** The episodes in the Star Wars trilogy */\nexport enum Episode {\n  /** Star Wars Episode V: The Empire Strikes Back, released in 1980. */\n  Empire = 'EMPIRE',\n  /** Star Wars Episode VI: Return of the Jedi, released in 1983. */\n  Jedi = 'JEDI',\n  /** Star Wars Episode IV: A New Hope, released in 1977. */\n  Newhope = 'NEWHOPE',\n}\n\n/** Units of height */\nexport enum LengthUnit {\n  /** Primarily used in the United States */\n  Foot = 'FOOT',\n  /** The standard unit around the world */\n  Meter = 'METER',\n}\n\n/** The input object sent when someone is creating a new review */\nexport type ReviewInput = {\n  /** Comment about the movie, optional */\n  commentary?: InputMaybe<Scalars['String']['input']>;\n  /** Favorite color, optional */\n  favoriteColor?: InputMaybe<ColorInput>;\n  /** 0-5 stars */\n  stars: Scalars['Int']['input'];\n};\n\nexport type CreateReviewForEpisodeMutationVariables = Exact<{\n  episode: Episode;\n  review: ReviewInput;\n}>;\n\nexport type CreateReviewForEpisodeMutation = {\n  __typename?: 'Mutation';\n  createReview?: { __typename?: 'Review'; stars: number; commentary?: string | null } | null;\n};\n\nexport type ExcludeQueryAlphaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryAlphaQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type ExcludeQueryBetaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryBetaQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroAndFriendsNamesQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroAndFriendsNamesQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | null;\n};\n\nexport type HeroAppearsInQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HeroAppearsInQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; name: string; appearsIn: Array<Episode | null> }\n    | { __typename?: 'Human'; name: string; appearsIn: Array<Episode | null> }\n    | null;\n};\n\nexport type HeroDetailsQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\ntype HeroDetails_Droid_Fragment = { __typename?: 'Droid'; primaryFunction?: string | null; name: string };\n\ntype HeroDetails_Human_Fragment = { __typename?: 'Human'; height?: number | null; name: string };\n\nexport type HeroDetailsFragment = HeroDetails_Droid_Fragment | HeroDetails_Human_Fragment;\n\nexport type HeroDetailsWithFragmentQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsWithFragmentQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\nexport type HeroNameQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroNameQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroNameConditionalInclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  includeName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalInclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroNameConditionalExclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  skipName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalExclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroParentTypeDependentFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroParentTypeDependentFieldQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | null;\n};\n\nexport type HeroTypeDependentAliasedFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroTypeDependentAliasedFieldQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; property?: string | null } | { __typename?: 'Human'; property?: string | null } | null;\n};\n\nexport type HumanFieldsFragment = { __typename?: 'Human'; name: string; mass?: number | null };\n\nexport type HumanWithNullHeightQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HumanWithNullHeightQuery = {\n  __typename?: 'Query';\n  human?: { __typename?: 'Human'; name: string; mass?: number | null } | null;\n};\n\nexport type TwoHeroesQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TwoHeroesQuery = {\n  __typename?: 'Query';\n  r2?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n  luke?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n"
  },
  {
    "path": "dev-test/star-wars/types.preResolveTypes.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A character from the Star Wars universe */\nexport type Character = {\n  /** The movies this character appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** The friends of the character, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the character exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the character */\n  id: Scalars['ID']['output'];\n  /** The name of the character */\n  name: Scalars['String']['output'];\n};\n\n/** A character from the Star Wars universe */\nexport type CharacterFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The input object sent when passing a color */\nexport type ColorInput = {\n  blue: Scalars['Int']['input'];\n  green: Scalars['Int']['input'];\n  red: Scalars['Int']['input'];\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type Droid = Character & {\n  __typename?: 'Droid';\n  /** The movies this droid appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This droid's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the droid exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the droid */\n  id: Scalars['ID']['output'];\n  /** What others call this droid */\n  name: Scalars['String']['output'];\n  /** This droid's primary function */\n  primaryFunction?: Maybe<Scalars['String']['output']>;\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type DroidFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The episodes in the Star Wars trilogy */\nexport enum Episode {\n  /** Star Wars Episode V: The Empire Strikes Back, released in 1980. */\n  Empire = 'EMPIRE',\n  /** Star Wars Episode VI: Return of the Jedi, released in 1983. */\n  Jedi = 'JEDI',\n  /** Star Wars Episode IV: A New Hope, released in 1977. */\n  Newhope = 'NEWHOPE',\n}\n\n/** A connection object for a character's friends */\nexport type FriendsConnection = {\n  __typename?: 'FriendsConnection';\n  /** The edges for each of the character's friends. */\n  edges?: Maybe<Array<Maybe<FriendsEdge>>>;\n  /** A list of the friends, as a convenience when edges are not needed. */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** Information for paginating this connection */\n  pageInfo: PageInfo;\n  /** The total number of friends */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge object for a character's friends */\nexport type FriendsEdge = {\n  __typename?: 'FriendsEdge';\n  /** A cursor used for pagination */\n  cursor: Scalars['ID']['output'];\n  /** The character represented by this friendship edge */\n  node?: Maybe<Character>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type Human = Character & {\n  __typename?: 'Human';\n  /** The movies this human appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This human's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the human exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** Height in the preferred unit, default is meters */\n  height?: Maybe<Scalars['Float']['output']>;\n  /** The home planet of the human, or null if unknown */\n  homePlanet?: Maybe<Scalars['String']['output']>;\n  /** The ID of the human */\n  id: Scalars['ID']['output'];\n  /** Mass in kilograms, or null if unknown */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** What this human calls themselves */\n  name: Scalars['String']['output'];\n  /** A list of starships this person has piloted, or an empty list if none */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanHeightArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\n/** Units of height */\nexport enum LengthUnit {\n  /** Primarily used in the United States */\n  Foot = 'FOOT',\n  /** The standard unit around the world */\n  Meter = 'METER',\n}\n\n/** The mutation type, represents all updates we can make to our data */\nexport type Mutation = {\n  __typename?: 'Mutation';\n  createReview?: Maybe<Review>;\n};\n\n/** The mutation type, represents all updates we can make to our data */\nexport type MutationCreateReviewArgs = {\n  episode?: InputMaybe<Episode>;\n  review: ReviewInput;\n};\n\n/** Information for paginating this connection */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  endCursor?: Maybe<Scalars['ID']['output']>;\n  hasNextPage: Scalars['Boolean']['output'];\n  startCursor?: Maybe<Scalars['ID']['output']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type Query = {\n  __typename?: 'Query';\n  character?: Maybe<Character>;\n  droid?: Maybe<Droid>;\n  hero?: Maybe<Character>;\n  human?: Maybe<Human>;\n  reviews?: Maybe<Array<Maybe<Review>>>;\n  search?: Maybe<Array<Maybe<SearchResult>>>;\n  starship?: Maybe<Starship>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryCharacterArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryDroidArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHeroArgs = {\n  episode?: InputMaybe<Episode>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHumanArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryReviewsArgs = {\n  episode: Episode;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QuerySearchArgs = {\n  text?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryStarshipArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** Represents a review for a movie */\nexport type Review = {\n  __typename?: 'Review';\n  /** Comment about the movie */\n  commentary?: Maybe<Scalars['String']['output']>;\n  /** The number of stars this review gave, 1-5 */\n  stars: Scalars['Int']['output'];\n};\n\n/** The input object sent when someone is creating a new review */\nexport type ReviewInput = {\n  /** Comment about the movie, optional */\n  commentary?: InputMaybe<Scalars['String']['input']>;\n  /** Favorite color, optional */\n  favoriteColor?: InputMaybe<ColorInput>;\n  /** 0-5 stars */\n  stars: Scalars['Int']['input'];\n};\n\nexport type SearchResult = Droid | Human | Starship;\n\nexport type Starship = {\n  __typename?: 'Starship';\n  /** The ID of the starship */\n  id: Scalars['ID']['output'];\n  /** Length of the starship, along the longest axis */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The name of the starship */\n  name: Scalars['String']['output'];\n};\n\nexport type StarshipLengthArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\nexport type CreateReviewForEpisodeMutationVariables = Exact<{\n  episode: Episode;\n  review: ReviewInput;\n}>;\n\nexport type CreateReviewForEpisodeMutation = {\n  __typename?: 'Mutation';\n  createReview?: { __typename?: 'Review'; stars: number; commentary?: string | null } | null;\n};\n\nexport type ExcludeQueryAlphaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryAlphaQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type ExcludeQueryBetaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryBetaQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroAndFriendsNamesQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroAndFriendsNamesQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | null;\n};\n\nexport type HeroAppearsInQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HeroAppearsInQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; name: string; appearsIn: Array<Episode | null> }\n    | { __typename?: 'Human'; name: string; appearsIn: Array<Episode | null> }\n    | null;\n};\n\nexport type HeroDetailsQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\ntype HeroDetails_Droid_Fragment = { __typename?: 'Droid'; primaryFunction?: string | null; name: string };\n\ntype HeroDetails_Human_Fragment = { __typename?: 'Human'; height?: number | null; name: string };\n\nexport type HeroDetailsFragment = HeroDetails_Droid_Fragment | HeroDetails_Human_Fragment;\n\nexport type HeroDetailsWithFragmentQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsWithFragmentQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\nexport type HeroNameQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroNameQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroNameConditionalInclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  includeName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalInclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroNameConditionalExclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  skipName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalExclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroParentTypeDependentFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroParentTypeDependentFieldQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | null;\n};\n\nexport type HeroTypeDependentAliasedFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroTypeDependentAliasedFieldQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; property?: string | null } | { __typename?: 'Human'; property?: string | null } | null;\n};\n\nexport type HumanFieldsFragment = { __typename?: 'Human'; name: string; mass?: number | null };\n\nexport type HumanWithNullHeightQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HumanWithNullHeightQuery = {\n  __typename?: 'Query';\n  human?: { __typename?: 'Human'; name: string; mass?: number | null } | null;\n};\n\nexport type TwoHeroesQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TwoHeroesQuery = {\n  __typename?: 'Query';\n  r2?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n  luke?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n"
  },
  {
    "path": "dev-test/star-wars/types.skipSchema.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A character from the Star Wars universe */\nexport type Character = {\n  /** The movies this character appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** The friends of the character, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the character exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the character */\n  id: Scalars['ID']['output'];\n  /** The name of the character */\n  name: Scalars['String']['output'];\n};\n\n/** A character from the Star Wars universe */\nexport type CharacterFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The input object sent when passing a color */\nexport type ColorInput = {\n  blue: Scalars['Int']['input'];\n  green: Scalars['Int']['input'];\n  red: Scalars['Int']['input'];\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type Droid = Character & {\n  __typename?: 'Droid';\n  /** The movies this droid appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This droid's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the droid exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the droid */\n  id: Scalars['ID']['output'];\n  /** What others call this droid */\n  name: Scalars['String']['output'];\n  /** This droid's primary function */\n  primaryFunction?: Maybe<Scalars['String']['output']>;\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type DroidFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The episodes in the Star Wars trilogy */\nexport enum Episode {\n  /** Star Wars Episode V: The Empire Strikes Back, released in 1980. */\n  Empire = 'EMPIRE',\n  /** Star Wars Episode VI: Return of the Jedi, released in 1983. */\n  Jedi = 'JEDI',\n  /** Star Wars Episode IV: A New Hope, released in 1977. */\n  Newhope = 'NEWHOPE',\n}\n\n/** A connection object for a character's friends */\nexport type FriendsConnection = {\n  __typename?: 'FriendsConnection';\n  /** The edges for each of the character's friends. */\n  edges?: Maybe<Array<Maybe<FriendsEdge>>>;\n  /** A list of the friends, as a convenience when edges are not needed. */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** Information for paginating this connection */\n  pageInfo: PageInfo;\n  /** The total number of friends */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge object for a character's friends */\nexport type FriendsEdge = {\n  __typename?: 'FriendsEdge';\n  /** A cursor used for pagination */\n  cursor: Scalars['ID']['output'];\n  /** The character represented by this friendship edge */\n  node?: Maybe<Character>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type Human = Character & {\n  __typename?: 'Human';\n  /** The movies this human appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This human's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the human exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** Height in the preferred unit, default is meters */\n  height?: Maybe<Scalars['Float']['output']>;\n  /** The home planet of the human, or null if unknown */\n  homePlanet?: Maybe<Scalars['String']['output']>;\n  /** The ID of the human */\n  id: Scalars['ID']['output'];\n  /** Mass in kilograms, or null if unknown */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** What this human calls themselves */\n  name: Scalars['String']['output'];\n  /** A list of starships this person has piloted, or an empty list if none */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanHeightArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\n/** Units of height */\nexport enum LengthUnit {\n  /** Primarily used in the United States */\n  Foot = 'FOOT',\n  /** The standard unit around the world */\n  Meter = 'METER',\n}\n\n/** The mutation type, represents all updates we can make to our data */\nexport type Mutation = {\n  __typename?: 'Mutation';\n  createReview?: Maybe<Review>;\n};\n\n/** The mutation type, represents all updates we can make to our data */\nexport type MutationCreateReviewArgs = {\n  episode?: InputMaybe<Episode>;\n  review: ReviewInput;\n};\n\n/** Information for paginating this connection */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  endCursor?: Maybe<Scalars['ID']['output']>;\n  hasNextPage: Scalars['Boolean']['output'];\n  startCursor?: Maybe<Scalars['ID']['output']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type Query = {\n  __typename?: 'Query';\n  character?: Maybe<Character>;\n  droid?: Maybe<Droid>;\n  hero?: Maybe<Character>;\n  human?: Maybe<Human>;\n  reviews?: Maybe<Array<Maybe<Review>>>;\n  search?: Maybe<Array<Maybe<SearchResult>>>;\n  starship?: Maybe<Starship>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryCharacterArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryDroidArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHeroArgs = {\n  episode?: InputMaybe<Episode>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHumanArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryReviewsArgs = {\n  episode: Episode;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QuerySearchArgs = {\n  text?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryStarshipArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** Represents a review for a movie */\nexport type Review = {\n  __typename?: 'Review';\n  /** Comment about the movie */\n  commentary?: Maybe<Scalars['String']['output']>;\n  /** The number of stars this review gave, 1-5 */\n  stars: Scalars['Int']['output'];\n};\n\n/** The input object sent when someone is creating a new review */\nexport type ReviewInput = {\n  /** Comment about the movie, optional */\n  commentary?: InputMaybe<Scalars['String']['input']>;\n  /** Favorite color, optional */\n  favoriteColor?: InputMaybe<ColorInput>;\n  /** 0-5 stars */\n  stars: Scalars['Int']['input'];\n};\n\nexport type SearchResult = Droid | Human | Starship;\n\nexport type Starship = {\n  __typename?: 'Starship';\n  /** The ID of the starship */\n  id: Scalars['ID']['output'];\n  /** Length of the starship, along the longest axis */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The name of the starship */\n  name: Scalars['String']['output'];\n};\n\nexport type StarshipLengthArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\nexport type CreateReviewForEpisodeMutationVariables = Exact<{\n  episode: Episode;\n  review: ReviewInput;\n}>;\n\nexport type CreateReviewForEpisodeMutation = {\n  __typename?: 'Mutation';\n  createReview?: { __typename?: 'Review'; stars: number; commentary?: string | null } | null;\n};\n\nexport type ExcludeQueryAlphaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryAlphaQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type ExcludeQueryBetaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryBetaQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroAndFriendsNamesQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroAndFriendsNamesQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | null;\n};\n\nexport type HeroAppearsInQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HeroAppearsInQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; name: string; appearsIn: Array<Episode | null> }\n    | { __typename?: 'Human'; name: string; appearsIn: Array<Episode | null> }\n    | null;\n};\n\nexport type HeroDetailsQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\ntype HeroDetails_Droid_Fragment = { __typename?: 'Droid'; primaryFunction?: string | null; name: string };\n\ntype HeroDetails_Human_Fragment = { __typename?: 'Human'; height?: number | null; name: string };\n\nexport type HeroDetailsFragment = HeroDetails_Droid_Fragment | HeroDetails_Human_Fragment;\n\nexport type HeroDetailsWithFragmentQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsWithFragmentQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\nexport type HeroNameQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroNameQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroNameConditionalInclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  includeName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalInclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroNameConditionalExclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  skipName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalExclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroParentTypeDependentFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroParentTypeDependentFieldQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | null;\n};\n\nexport type HeroTypeDependentAliasedFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroTypeDependentAliasedFieldQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; property?: string | null } | { __typename?: 'Human'; property?: string | null } | null;\n};\n\nexport type HumanFieldsFragment = { __typename?: 'Human'; name: string; mass?: number | null };\n\nexport type HumanWithNullHeightQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HumanWithNullHeightQuery = {\n  __typename?: 'Query';\n  human?: { __typename?: 'Human'; name: string; mass?: number | null } | null;\n};\n\nexport type TwoHeroesQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TwoHeroesQuery = {\n  __typename?: 'Query';\n  r2?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n  luke?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n"
  },
  {
    "path": "dev-test/star-wars/types.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A character from the Star Wars universe */\nexport type Character = {\n  /** The movies this character appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** The friends of the character, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the character exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the character */\n  id: Scalars['ID']['output'];\n  /** The name of the character */\n  name: Scalars['String']['output'];\n};\n\n/** A character from the Star Wars universe */\nexport type CharacterFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The input object sent when passing a color */\nexport type ColorInput = {\n  blue: Scalars['Int']['input'];\n  green: Scalars['Int']['input'];\n  red: Scalars['Int']['input'];\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type Droid = Character & {\n  __typename?: 'Droid';\n  /** The movies this droid appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This droid's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the droid exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** The ID of the droid */\n  id: Scalars['ID']['output'];\n  /** What others call this droid */\n  name: Scalars['String']['output'];\n  /** This droid's primary function */\n  primaryFunction?: Maybe<Scalars['String']['output']>;\n};\n\n/** An autonomous mechanical character in the Star Wars universe */\nexport type DroidFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** The episodes in the Star Wars trilogy */\nexport enum Episode {\n  /** Star Wars Episode V: The Empire Strikes Back, released in 1980. */\n  Empire = 'EMPIRE',\n  /** Star Wars Episode VI: Return of the Jedi, released in 1983. */\n  Jedi = 'JEDI',\n  /** Star Wars Episode IV: A New Hope, released in 1977. */\n  Newhope = 'NEWHOPE',\n}\n\n/** A connection object for a character's friends */\nexport type FriendsConnection = {\n  __typename?: 'FriendsConnection';\n  /** The edges for each of the character's friends. */\n  edges?: Maybe<Array<Maybe<FriendsEdge>>>;\n  /** A list of the friends, as a convenience when edges are not needed. */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** Information for paginating this connection */\n  pageInfo: PageInfo;\n  /** The total number of friends */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge object for a character's friends */\nexport type FriendsEdge = {\n  __typename?: 'FriendsEdge';\n  /** A cursor used for pagination */\n  cursor: Scalars['ID']['output'];\n  /** The character represented by this friendship edge */\n  node?: Maybe<Character>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type Human = Character & {\n  __typename?: 'Human';\n  /** The movies this human appears in */\n  appearsIn: Array<Maybe<Episode>>;\n  /** This human's friends, or an empty list if they have none */\n  friends?: Maybe<Array<Maybe<Character>>>;\n  /** The friends of the human exposed as a connection with edges */\n  friendsConnection: FriendsConnection;\n  /** Height in the preferred unit, default is meters */\n  height?: Maybe<Scalars['Float']['output']>;\n  /** The home planet of the human, or null if unknown */\n  homePlanet?: Maybe<Scalars['String']['output']>;\n  /** The ID of the human */\n  id: Scalars['ID']['output'];\n  /** Mass in kilograms, or null if unknown */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** What this human calls themselves */\n  name: Scalars['String']['output'];\n  /** A list of starships this person has piloted, or an empty list if none */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanFriendsConnectionArgs = {\n  after?: InputMaybe<Scalars['ID']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A humanoid creature from the Star Wars universe */\nexport type HumanHeightArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\n/** Units of height */\nexport enum LengthUnit {\n  /** Primarily used in the United States */\n  Foot = 'FOOT',\n  /** The standard unit around the world */\n  Meter = 'METER',\n}\n\n/** The mutation type, represents all updates we can make to our data */\nexport type Mutation = {\n  __typename?: 'Mutation';\n  createReview?: Maybe<Review>;\n};\n\n/** The mutation type, represents all updates we can make to our data */\nexport type MutationCreateReviewArgs = {\n  episode?: InputMaybe<Episode>;\n  review: ReviewInput;\n};\n\n/** Information for paginating this connection */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  endCursor?: Maybe<Scalars['ID']['output']>;\n  hasNextPage: Scalars['Boolean']['output'];\n  startCursor?: Maybe<Scalars['ID']['output']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type Query = {\n  __typename?: 'Query';\n  character?: Maybe<Character>;\n  droid?: Maybe<Droid>;\n  hero?: Maybe<Character>;\n  human?: Maybe<Human>;\n  reviews?: Maybe<Array<Maybe<Review>>>;\n  search?: Maybe<Array<Maybe<SearchResult>>>;\n  starship?: Maybe<Starship>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryCharacterArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryDroidArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHeroArgs = {\n  episode?: InputMaybe<Episode>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryHumanArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryReviewsArgs = {\n  episode: Episode;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QuerySearchArgs = {\n  text?: InputMaybe<Scalars['String']['input']>;\n};\n\n/** The query type, represents all of the entry points into our object graph */\nexport type QueryStarshipArgs = {\n  id: Scalars['ID']['input'];\n};\n\n/** Represents a review for a movie */\nexport type Review = {\n  __typename?: 'Review';\n  /** Comment about the movie */\n  commentary?: Maybe<Scalars['String']['output']>;\n  /** The number of stars this review gave, 1-5 */\n  stars: Scalars['Int']['output'];\n};\n\n/** The input object sent when someone is creating a new review */\nexport type ReviewInput = {\n  /** Comment about the movie, optional */\n  commentary?: InputMaybe<Scalars['String']['input']>;\n  /** Favorite color, optional */\n  favoriteColor?: InputMaybe<ColorInput>;\n  /** 0-5 stars */\n  stars: Scalars['Int']['input'];\n};\n\nexport type SearchResult = Droid | Human | Starship;\n\nexport type Starship = {\n  __typename?: 'Starship';\n  /** The ID of the starship */\n  id: Scalars['ID']['output'];\n  /** Length of the starship, along the longest axis */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The name of the starship */\n  name: Scalars['String']['output'];\n};\n\nexport type StarshipLengthArgs = {\n  unit?: InputMaybe<LengthUnit>;\n};\n\nexport type CreateReviewForEpisodeMutationVariables = Exact<{\n  episode: Episode;\n  review: ReviewInput;\n}>;\n\nexport type CreateReviewForEpisodeMutation = {\n  __typename?: 'Mutation';\n  createReview?: { __typename?: 'Review'; stars: number; commentary?: string | null } | null;\n};\n\nexport type ExcludeQueryAlphaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryAlphaQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type ExcludeQueryBetaQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type ExcludeQueryBetaQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroAndFriendsNamesQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroAndFriendsNamesQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<{ __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null> | null;\n      }\n    | null;\n};\n\nexport type HeroAppearsInQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HeroAppearsInQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; name: string; appearsIn: Array<Episode | null> }\n    | { __typename?: 'Human'; name: string; appearsIn: Array<Episode | null> }\n    | null;\n};\n\nexport type HeroDetailsQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\ntype HeroDetails_Droid_Fragment = { __typename?: 'Droid'; primaryFunction?: string | null; name: string };\n\ntype HeroDetails_Human_Fragment = { __typename?: 'Human'; height?: number | null; name: string };\n\nexport type HeroDetailsFragment = HeroDetails_Droid_Fragment | HeroDetails_Human_Fragment;\n\nexport type HeroDetailsWithFragmentQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroDetailsWithFragmentQuery = {\n  __typename?: 'Query';\n  hero?:\n    | { __typename?: 'Droid'; primaryFunction?: string | null; name: string }\n    | { __typename?: 'Human'; height?: number | null; name: string }\n    | null;\n};\n\nexport type HeroNameQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroNameQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n\nexport type HeroNameConditionalInclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  includeName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalInclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroNameConditionalExclusionQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n  skipName: Scalars['Boolean']['input'];\n}>;\n\nexport type HeroNameConditionalExclusionQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; name?: string } | { __typename?: 'Human'; name?: string } | null;\n};\n\nexport type HeroParentTypeDependentFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroParentTypeDependentFieldQuery = {\n  __typename?: 'Query';\n  hero?:\n    | {\n        __typename?: 'Droid';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | {\n        __typename?: 'Human';\n        name: string;\n        friends?: Array<\n          { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; height?: number | null; name: string } | null\n        > | null;\n      }\n    | null;\n};\n\nexport type HeroTypeDependentAliasedFieldQueryVariables = Exact<{\n  episode?: InputMaybe<Episode>;\n}>;\n\nexport type HeroTypeDependentAliasedFieldQuery = {\n  __typename?: 'Query';\n  hero?: { __typename?: 'Droid'; property?: string | null } | { __typename?: 'Human'; property?: string | null } | null;\n};\n\nexport type HumanFieldsFragment = { __typename?: 'Human'; name: string; mass?: number | null };\n\nexport type HumanWithNullHeightQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HumanWithNullHeightQuery = {\n  __typename?: 'Query';\n  human?: { __typename?: 'Human'; name: string; mass?: number | null } | null;\n};\n\nexport type TwoHeroesQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TwoHeroesQuery = {\n  __typename?: 'Query';\n  r2?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n  luke?: { __typename?: 'Droid'; name: string } | { __typename?: 'Human'; name: string } | null;\n};\n"
  },
  {
    "path": "dev-test/subpath-import/result.d.ts",
    "content": "import { RoleStatus } from '#changeName/server/drizzle/schema';\nimport { GraphQLResolveInfo } from 'graphql';\nimport { TestContext } from '#test-null-value/context';\nimport { FiedContextType } from '#test/root';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\nexport type EnumResolverSignature<T, AllowedValues = any> = { [key in keyof T]?: AllowedValues };\nexport type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport { RoleStatus };\n\nexport type User = {\n  __typename?: 'User';\n  createdAt: Scalars['String']['output'];\n  email: Scalars['String']['output'];\n  id: Scalars['ID']['output'];\n  name: Scalars['String']['output'];\n  password: Scalars['String']['output'];\n  updatedAt: Scalars['String']['output'];\n};\n\nexport type Mutation = {\n  __typename?: 'mutation';\n  createUser: User;\n};\n\nexport type MutationCreateUserArgs = {\n  email: Scalars['String']['input'];\n  name: Scalars['String']['input'];\n  password: Scalars['String']['input'];\n};\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<\n  TResult,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<\n  TResult,\n  TKey extends string,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  obj: T,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<\n  TResult = Record<PropertyKey, never>,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = {\n  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n  ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n  RoleStatus: RoleStatus;\n  String: ResolverTypeWrapper<Scalars['String']['output']>;\n  User: ResolverTypeWrapper<User>;\n  mutation: ResolverTypeWrapper<Mutation>;\n};\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = {\n  Boolean: Scalars['Boolean']['output'];\n  ID: Scalars['ID']['output'];\n  String: Scalars['String']['output'];\n  User: User;\n  mutation: Mutation;\n};\n\nexport type RoleStatusResolvers = EnumResolverSignature<{ ADMIN?: any; USER?: any }, ResolversTypes['RoleStatus']>;\n\nexport type UserResolvers<\n  ContextType = TestContext,\n  ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']\n> = {\n  createdAt?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  email?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  password?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  updatedAt?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n};\n\nexport type MutationResolvers<\n  ContextType = TestContext,\n  ParentType extends ResolversParentTypes['mutation'] = ResolversParentTypes['mutation']\n> = {\n  createUser?: Resolver<\n    ResolversTypes['User'],\n    ParentType,\n    FiedContextType,\n    RequireFields<MutationCreateUserArgs, 'email' | 'name' | 'password'>\n  >;\n};\n\nexport type Resolvers<ContextType = TestContext> = {\n  RoleStatus?: RoleStatusResolvers;\n  User?: UserResolvers<ContextType>;\n  mutation?: MutationResolvers<ContextType>;\n};\n"
  },
  {
    "path": "dev-test/subpath-import/schema.graphql",
    "content": "type User {\n  id: ID!\n  name: String!\n  email: String!\n  password: String!\n  createdAt: String!\n  updatedAt: String!\n}\n\nenum RoleStatus {\n  ADMIN\n  USER\n}\n\ntype mutation {\n  createUser(name: String!, email: String!, password: String!): User!\n}\n"
  },
  {
    "path": "dev-test/test-federation/generated/types.ts",
    "content": "import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql';\nexport type Maybe<T> = T | null | undefined;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n  /** Represents a car */\n  CarKey: { input: string; output: string };\n};\n\nexport type Car = {\n  __typename?: 'Car';\n  carKey: Scalars['CarKey']['output'];\n  /** Extend Car with a simple \"dummy\" field */\n  dummy?: Maybe<Scalars['String']['output']>;\n};\n\nexport type WithIndex<TObject> = TObject & Record<string, any>;\nexport type ResolversObject<TObject> = WithIndex<TObject>;\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<\n  TResult,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<\n  TResult,\n  TKey extends string,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  obj: T,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<\n  TResult = Record<PropertyKey, never>,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = ResolversObject<{\n  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n  Car: ResolverTypeWrapper<Car>;\n  CarKey: ResolverTypeWrapper<Scalars['CarKey']['output']>;\n  String: ResolverTypeWrapper<Scalars['String']['output']>;\n}>;\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = ResolversObject<{\n  Boolean: Scalars['Boolean']['output'];\n  Car: Car;\n  CarKey: Scalars['CarKey']['output'];\n  String: Scalars['String']['output'];\n}>;\n\nexport type CarResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Car'] = ResolversParentTypes['Car']\n> = ResolversObject<{\n  carKey?: Resolver<ResolversTypes['CarKey'], ParentType, ContextType>;\n  dummy?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n}>;\n\nexport interface CarKeyScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['CarKey'], any> {\n  name: 'CarKey';\n}\n\nexport type Resolvers<ContextType = any> = ResolversObject<{\n  Car?: CarResolvers<ContextType>;\n  CarKey?: GraphQLScalarType;\n}>;\n"
  },
  {
    "path": "dev-test/test-federation/schema.gql",
    "content": "extend schema\n  @link(url: \"https://specs.apollo.dev/link/v1.0\")\n  @link(url: \"https://specs.apollo.dev/federation/v2.6\", import: [\"@key\", \"@extends\"])\n\ntype Car @extends @key(fields: \"carKey\") {\n  carKey: CarKey!\n  \"\"\"\n  Extend Car with a simple \"dummy\" field\n  \"\"\"\n  dummy: String\n}\n\n\"\"\"\nRepresents a car\n\"\"\"\nscalar CarKey\n"
  },
  {
    "path": "dev-test/test-message/schema.graphql",
    "content": "type Message {\n  id: String!\n}\n\ntype Query {\n  messages(tab: String!): [Message]\n}\n\ninput CreateMessageInput {\n  description: String!\n}\n\ntype Mutation {\n  createMessage(args: CreateMessageInput!): Message\n  approve(id: ID!): Message\n  decline(id: ID!, reason: String!): Message\n  escalate(id: ID!): Message\n}\n\nschema {\n  query: Query\n  mutation: Mutation\n}\n"
  },
  {
    "path": "dev-test/test-mongodb/schema.graphql",
    "content": "enum Role {\n  ADMIN\n  WRITER\n  READER\n}\n\nscalar Date\n\ntype Post @entity {\n  id: ID @id\n  title: String @column\n  content: String @column\n  createdAt: Date @column\n  author: User @link @map(path: \"userId\")\n}\n\ninterface User @abstractEntity(discriminatorField: \"role\") {\n  id: ID @id\n  username: String @column\n  role: Role @column\n  likedPosts: [Post]\n  followerUsers(skip: Int, limit: Int): [User]\n  followingUsers(skip: Int, limit: Int): [User] @link @map(path: \"followingUserIds\")\n}\n\ntype AdminUser implements User @entity {\n  id: ID @id\n  username: String @column\n  role: Role @column\n  likedPosts: [Post]\n  followerUsers(skip: Int, limit: Int): [User]\n  followingUsers(skip: Int, limit: Int): [User] @link @map(path: \"followingUserIds\")\n  posts(skip: Int, limit: Int): [Post]\n}\n\ntype WriterUser @entity {\n  id: ID @id\n  username: String @column\n  role: Role @column\n  likedPosts(skip: Int, limit: Int): [Post]\n  followerUsers(skip: Int, limit: Int): [User]\n  followingUsers(skip: Int, limit: Int): [User] @link @map(path: \"followingUserIds\")\n  posts(skip: Int, limit: Int): [Post]\n}\n\ntype ReaderUser @entity {\n  id: ID @id\n  username: String @column\n  role: Role @column\n  likedPosts(skip: Int, limit: Int): [Post]\n  followerUsers(skip: Int, limit: Int): [User]\n  followingUsers(skip: Int, limit: Int): [User] @link @map(path: \"followingUserIds\")\n}\n"
  },
  {
    "path": "dev-test/test-null-value/query.ts",
    "content": "export const MY_QUERY = /* GraphQL */ `\n  fragment CartLine on CartLine {\n    id\n    quantity\n  }\n\n  query Test {\n    cart {\n      lines {\n        nodes {\n          ...CartLine\n        }\n      }\n    }\n  }\n`;\n"
  },
  {
    "path": "dev-test/test-null-value/result.d.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type BaseCartLine = {\n  id: Scalars['String']['output'];\n  quantity: Scalars['Int']['output'];\n};\n\nexport type BaseCartLineConnection = {\n  id: Scalars['String']['output'];\n  nodes: Array<BaseCartLine>;\n};\n\nexport type Cart = {\n  id: Scalars['String']['output'];\n  lines: BaseCartLineConnection;\n};\n\nexport type CartLine = BaseCartLine & {\n  id: Scalars['String']['output'];\n  quantity: Scalars['Int']['output'];\n};\n\nexport type ComponentizableCartLine = BaseCartLine & {\n  id: Scalars['String']['output'];\n  quantity: Scalars['Int']['output'];\n};\n\nexport type QueryRoot = {\n  cart?: Maybe<Cart>;\n};\n\nexport type CartLineFragment = { id: string; quantity: number };\n\nexport type TestQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TestQuery = { cart?: { lines: { nodes: Array<{ id: string; quantity: number }> } } | null };\n"
  },
  {
    "path": "dev-test/test-null-value/schema.graphql",
    "content": "schema {\n  query: QueryRoot\n}\n\ninterface BaseCartLine {\n  id: String!\n  quantity: Int!\n}\n\ntype BaseCartLineConnection {\n  id: String!\n  nodes: [BaseCartLine!]!\n}\n\ntype Cart {\n  id: String!\n  lines: BaseCartLineConnection!\n}\n\ntype CartLine implements BaseCartLine {\n  id: String!\n  quantity: Int!\n}\n\ntype ComponentizableCartLine implements BaseCartLine {\n  id: String!\n  quantity: Int!\n}\n\ntype QueryRoot {\n  cart: Cart\n}\n"
  },
  {
    "path": "dev-test/test-schema/env.types.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  allUsers: Array<Maybe<User>>;\n  /**\n   *  Generates a new answer for th\n   * guessing game\n   */\n  answer: Array<Scalars['Int']['output']>;\n  testArr1?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  testArr2: Array<Maybe<Scalars['String']['output']>>;\n  testArr3: Array<Scalars['String']['output']>;\n  userById?: Maybe<User>;\n};\n\nexport type QueryUserByIdArgs = {\n  id: Scalars['Int']['input'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  email: Scalars['String']['output'];\n  id: Scalars['Int']['output'];\n  name: Scalars['String']['output'];\n};\n"
  },
  {
    "path": "dev-test/test-schema/flow-types.flow.js",
    "content": "// @flow\n\nimport { type GraphQLResolveInfo } from 'graphql';\nexport type $RequireFields<Origin, Keys> = $Diff<Origin, Keys> &\n  $ObjMapi<Keys, <Key>(k: Key) => $NonMaybeType<$ElementType<Origin, Key>>>;\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {|\n  ID: string,\n  String: string,\n  Boolean: boolean,\n  Int: number,\n  Float: number,\n|};\n\nexport type Query = {|\n  __typename?: 'Query',\n  allUsers: Array<?User>,\n  userById?: ?User,\n|};\n\nexport type QueryUserByIdArgs = {|\n  id: $ElementType<Scalars, 'Int'>,\n|};\n\nexport type User = {|\n  __typename?: 'User',\n  email: $ElementType<Scalars, 'String'>,\n  id: $ElementType<Scalars, 'Int'>,\n  name: $ElementType<Scalars, 'String'>,\n|};\n\nexport type Resolver<Result, Parent = {}, Context = {}, Args = {}> = (\n  parent: Parent,\n  args: Args,\n  context: Context,\n  info: GraphQLResolveInfo\n) => Promise<Result> | Result;\n\nexport type SubscriptionSubscribeFn<Result, Parent, Context, Args> = (\n  parent: Parent,\n  args: Args,\n  context: Context,\n  info: GraphQLResolveInfo\n) => AsyncIterator<Result> | Promise<AsyncIterator<Result>>;\n\nexport type SubscriptionResolveFn<Result, Parent, Context, Args> = (\n  parent: Parent,\n  args: Args,\n  context: Context,\n  info: GraphQLResolveInfo\n) => Result | Promise<Result>;\n\nexport interface SubscriptionSubscriberObject<Result, Key: string, Parent, Context, Args> {\n  subscribe: SubscriptionSubscribeFn<{ [key: Key]: Result }, Parent, Context, Args>;\n  resolve?: SubscriptionResolveFn<Result, { [key: Key]: Result }, Context, Args>;\n}\n\nexport interface SubscriptionResolverObject<Result, Parent, Context, Args> {\n  subscribe: SubscriptionSubscribeFn<mixed, Parent, Context, Args>;\n  resolve: SubscriptionResolveFn<Result, mixed, Context, Args>;\n}\n\nexport type SubscriptionObject<Result, Key: string, Parent, Context, Args> =\n  | SubscriptionSubscriberObject<Result, Key, Parent, Context, Args>\n  | SubscriptionResolverObject<Result, Parent, Context, Args>;\n\nexport type SubscriptionResolver<Result, Key: string, Parent = {}, Context = {}, Args = {}> =\n  | ((...args: Array<any>) => SubscriptionObject<Result, Key, Parent, Context, Args>)\n  | SubscriptionObject<Result, Key, Parent, Context, Args>;\n\nexport type TypeResolveFn<Types, Parent = {}, Context = {}> = (\n  parent: Parent,\n  context: Context,\n  info: GraphQLResolveInfo\n) => ?Types | Promise<?Types>;\n\nexport type IsTypeOfResolverFn<T = {}, Context = {}> = (\n  obj: T,\n  context: Context,\n  info: GraphQLResolveInfo\n) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<Result = {}, Parent = {}, Args = {}, Context = {}> = (\n  next: NextResolverFn<Result>,\n  parent: Parent,\n  args: Args,\n  context: Context,\n  info: GraphQLResolveInfo\n) => Result | Promise<Result>;\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = {\n  Boolean: ResolverTypeWrapper<$ElementType<Scalars, 'Boolean'>>,\n  Int: ResolverTypeWrapper<$ElementType<Scalars, 'Int'>>,\n  Query: ResolverTypeWrapper<{}>,\n  String: ResolverTypeWrapper<$ElementType<Scalars, 'String'>>,\n  User: ResolverTypeWrapper<User>,\n};\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = {\n  Boolean: $ElementType<Scalars, 'Boolean'>,\n  Int: $ElementType<Scalars, 'Int'>,\n  Query: {},\n  String: $ElementType<Scalars, 'String'>,\n  User: User,\n};\n\nexport type QueryResolvers<ContextType = any, ParentType = $ElementType<ResolversParentTypes, 'Query'>> = {\n  allUsers?: Resolver<Array<?$ElementType<ResolversTypes, 'User'>>, ParentType, ContextType>,\n  userById?: Resolver<\n    ?$ElementType<ResolversTypes, 'User'>,\n    ParentType,\n    ContextType,\n    $RequireFields<QueryUserByIdArgs, { id: * }>\n  >,\n};\n\nexport type UserResolvers<ContextType = any, ParentType = $ElementType<ResolversParentTypes, 'User'>> = {\n  email?: Resolver<$ElementType<ResolversTypes, 'String'>, ParentType, ContextType>,\n  id?: Resolver<$ElementType<ResolversTypes, 'Int'>, ParentType, ContextType>,\n  name?: Resolver<$ElementType<ResolversTypes, 'String'>, ParentType, ContextType>,\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>,\n};\n\nexport type Resolvers<ContextType = any> = {\n  Query?: QueryResolvers<ContextType>,\n  User?: UserResolvers<ContextType>,\n};\n"
  },
  {
    "path": "dev-test/test-schema/local/schema-ast.js",
    "content": "const schemaFormats = require('./schema-formats');\nmodule.exports.schema = schemaFormats.schemaAst;\n"
  },
  {
    "path": "dev-test/test-schema/local/schema-formats.js",
    "content": "/**\n * There are four formats the schema can be in:\n * 1. GraphQLSchema object\n * 2. Text (the GraphQL schema language textual format)\n * 3. AST (the GraphQL schema language textual format parsed into an AST)\n *\n * This file imports the textual and introspection json files and\n * exports all four formats to be used in tests.\n */\n\nconst GraphQL = require('graphql');\nconst fs = require('fs');\nconst path = require('path');\nconst schemaText = fs.readFileSync(path.join(__dirname, 'schema.graphql'), 'utf8');\nconst schemaObject = GraphQL.buildSchema(schemaText);\nconst schemaAst = GraphQL.parse(schemaText);\n\nmodule.exports.schemaText = schemaText;\nmodule.exports.schemaAst = schemaAst;\nmodule.exports.schemaObject = schemaObject;\n"
  },
  {
    "path": "dev-test/test-schema/local/schema-object.js",
    "content": "const schemaFormats = require('./schema-formats');\nmodule.exports.schema = schemaFormats.schemaObject;\n"
  },
  {
    "path": "dev-test/test-schema/local/schema-text.js",
    "content": "const schemaFormats = require('./schema-formats');\nmodule.exports.schema = schemaFormats.schemaText;\n"
  },
  {
    "path": "dev-test/test-schema/local/schema.graphql",
    "content": "type Post {\n  id: Int!\n  title: String!\n}\n\ntype Query {\n  allPosts: [Post]!\n}\n"
  },
  {
    "path": "dev-test/test-schema/resolvers-federation.ts",
    "content": "import { GraphQLResolveInfo } from 'graphql';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n  _FieldSet: { input: any; output: any };\n};\n\nexport type Address = {\n  __typename?: 'Address';\n  city?: Maybe<Scalars['String']['output']>;\n  lines: Lines;\n  state?: Maybe<Scalars['String']['output']>;\n};\n\nexport type Book = {\n  __typename?: 'Book';\n  id: Scalars['ID']['output'];\n};\n\nexport type Lines = {\n  __typename?: 'Lines';\n  line1: Scalars['String']['output'];\n  line2?: Maybe<Scalars['String']['output']>;\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  users?: Maybe<Array<Maybe<User>>>;\n};\n\nexport type User = {\n  __typename?: 'User';\n  address?: Maybe<Address>;\n  email: Scalars['String']['output'];\n  id: Scalars['Int']['output'];\n  name: Scalars['String']['output'];\n};\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\nexport type ReferenceResolver<TResult, TReference, TContext> = (\n  reference: TReference,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\ntype ScalarCheck<T, S> = S extends true ? T : NullableCheck<T, S>;\ntype NullableCheck<T, S> = Maybe<T> extends T ? Maybe<ListCheck<NonNullable<T>, S>> : ListCheck<T, S>;\ntype ListCheck<T, S> = T extends (infer U)[] ? NullableCheck<U, S>[] : GraphQLRecursivePick<T, S>;\nexport type GraphQLRecursivePick<T, S> = { [K in keyof T & keyof S]: ScalarCheck<T[K], S[K]> };\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<\n  TResult,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<\n  TResult,\n  TKey extends string,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  obj: T,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<\n  TResult = Record<PropertyKey, never>,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n/** Mapping of federation types */\nexport type FederationTypes = {\n  User: User;\n};\n\n/** Mapping of federation reference types */\nexport type FederationReferenceTypes = {\n  User: { __typename: 'User' } & (\n    | GraphQLRecursivePick<FederationTypes['User'], { id: true }>\n    | GraphQLRecursivePick<FederationTypes['User'], { name: true }>\n  ) &\n    (\n      | Record<PropertyKey, never>\n      | GraphQLRecursivePick<FederationTypes['User'], { address: { city: true; lines: { line2: true } } }>\n    );\n};\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = {\n  Address: ResolverTypeWrapper<Address>;\n  String: ResolverTypeWrapper<Scalars['String']['output']>;\n  Book: ResolverTypeWrapper<Book>;\n  ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n  Lines: ResolverTypeWrapper<Lines>;\n  Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  User: ResolverTypeWrapper<User>;\n  Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n};\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = {\n  Address: Address;\n  String: Scalars['String']['output'];\n  Book: Book;\n  ID: Scalars['ID']['output'];\n  Lines: Lines;\n  Query: Record<PropertyKey, never>;\n  User: User | FederationReferenceTypes['User'];\n  Int: Scalars['Int']['output'];\n  Boolean: Scalars['Boolean']['output'];\n};\n\nexport type AddressResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Address'] = ResolversParentTypes['Address']\n> = {\n  city?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n  lines?: Resolver<ResolversTypes['Lines'], ParentType, ContextType>;\n  state?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n};\n\nexport type BookResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Book'] = ResolversParentTypes['Book']\n> = {\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n};\n\nexport type LinesResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Lines'] = ResolversParentTypes['Lines']\n> = {\n  line1?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  line2?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n};\n\nexport type QueryResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']\n> = {\n  users?: Resolver<Maybe<Array<Maybe<ResolversTypes['User']>>>, ParentType, ContextType>;\n};\n\nexport type UserResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'],\n  FederationReferenceType extends FederationReferenceTypes['User'] = FederationReferenceTypes['User']\n> = {\n  __resolveReference?: ReferenceResolver<\n    Maybe<ResolversTypes['User']> | FederationReferenceType,\n    FederationReferenceType,\n    ContextType\n  >;\n  email?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n};\n\nexport type Resolvers<ContextType = any> = {\n  Address?: AddressResolvers<ContextType>;\n  Book?: BookResolvers<ContextType>;\n  Lines?: LinesResolvers<ContextType>;\n  Query?: QueryResolvers<ContextType>;\n  User?: UserResolvers<ContextType>;\n};\n"
  },
  {
    "path": "dev-test/test-schema/resolvers-root.ts",
    "content": "import { GraphQLResolveInfo } from 'graphql';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\nexport type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  someDummyField: Scalars['Int']['output'];\n};\n\nexport type QueryRoot = {\n  __typename?: 'QueryRoot';\n  allUsers: Array<Maybe<User>>;\n  answer: Array<Scalars['Int']['output']>;\n  userById?: Maybe<User>;\n};\n\nexport type QueryRootUserByIdArgs = {\n  id: Scalars['Int']['input'];\n};\n\nexport type SubscriptionRoot = {\n  __typename?: 'SubscriptionRoot';\n  newUser?: Maybe<User>;\n};\n\nexport type User = {\n  __typename?: 'User';\n  email: Scalars['String']['output'];\n  id: Scalars['Int']['output'];\n  name: Scalars['String']['output'];\n};\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<\n  TResult,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<\n  TResult,\n  TKey extends string,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  obj: T,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<\n  TResult = Record<PropertyKey, never>,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = {\n  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n  Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n  Query: ResolverTypeWrapper<Query>;\n  QueryRoot: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  String: ResolverTypeWrapper<Scalars['String']['output']>;\n  SubscriptionRoot: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  User: ResolverTypeWrapper<User>;\n};\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = {\n  Boolean: Scalars['Boolean']['output'];\n  Int: Scalars['Int']['output'];\n  Query: Query;\n  QueryRoot: Record<PropertyKey, never>;\n  String: Scalars['String']['output'];\n  SubscriptionRoot: Record<PropertyKey, never>;\n  User: User;\n};\n\nexport type QueryResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']\n> = {\n  someDummyField?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;\n};\n\nexport type QueryRootResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['QueryRoot'] = ResolversParentTypes['QueryRoot']\n> = {\n  allUsers?: Resolver<Array<Maybe<ResolversTypes['User']>>, ParentType, ContextType>;\n  answer?: Resolver<Array<ResolversTypes['Int']>, ParentType, ContextType>;\n  userById?: Resolver<\n    Maybe<ResolversTypes['User']>,\n    ParentType,\n    ContextType,\n    RequireFields<QueryRootUserByIdArgs, 'id'>\n  >;\n};\n\nexport type SubscriptionRootResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['SubscriptionRoot'] = ResolversParentTypes['SubscriptionRoot']\n> = {\n  newUser?: SubscriptionResolver<Maybe<ResolversTypes['User']>, 'newUser', ParentType, ContextType>;\n};\n\nexport type UserResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']\n> = {\n  email?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  id?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;\n  name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n};\n\nexport type Resolvers<ContextType = any> = {\n  Query?: QueryResolvers<ContextType>;\n  QueryRoot?: QueryRootResolvers<ContextType>;\n  SubscriptionRoot?: SubscriptionRootResolvers<ContextType>;\n  User?: UserResolvers<ContextType>;\n};\n"
  },
  {
    "path": "dev-test/test-schema/resolvers-stitching.ts",
    "content": "import { GraphQLResolveInfo, SelectionSetNode, FieldNode } from 'graphql';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\nexport type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  allUsers: Array<Maybe<User>>;\n  /**\n   *  Generates a new answer for th\n   * guessing game\n   */\n  answer: Array<Scalars['Int']['output']>;\n  testArr1?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  testArr2: Array<Maybe<Scalars['String']['output']>>;\n  testArr3: Array<Scalars['String']['output']>;\n  userById?: Maybe<User>;\n};\n\nexport type QueryUserByIdArgs = {\n  id: Scalars['Int']['input'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  email: Scalars['String']['output'];\n  id: Scalars['Int']['output'];\n  name: Scalars['String']['output'];\n};\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\n\nexport type LegacyStitchingResolver<TResult, TParent, TContext, TArgs> = {\n  fragment: string;\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\n\nexport type NewStitchingResolver<TResult, TParent, TContext, TArgs> = {\n  selectionSet: string | ((fieldNode: FieldNode) => SelectionSetNode);\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type StitchingResolver<TResult, TParent, TContext, TArgs> =\n  | LegacyStitchingResolver<TResult, TParent, TContext, TArgs>\n  | NewStitchingResolver<TResult, TParent, TContext, TArgs>;\nexport type Resolver<\n  TResult,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> =\n  | ResolverFn<TResult, TParent, TContext, TArgs>\n  | ResolverWithResolve<TResult, TParent, TContext, TArgs>\n  | StitchingResolver<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<\n  TResult,\n  TKey extends string,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  obj: T,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<\n  TResult = Record<PropertyKey, never>,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = {\n  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n  Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n  Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  String: ResolverTypeWrapper<Scalars['String']['output']>;\n  User: ResolverTypeWrapper<User>;\n};\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = {\n  Boolean: Scalars['Boolean']['output'];\n  Int: Scalars['Int']['output'];\n  Query: Record<PropertyKey, never>;\n  String: Scalars['String']['output'];\n  User: User;\n};\n\nexport type QueryResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']\n> = {\n  allUsers?: Resolver<Array<Maybe<ResolversTypes['User']>>, ParentType, ContextType>;\n  answer?: Resolver<Array<ResolversTypes['Int']>, ParentType, ContextType>;\n  testArr1?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\n  testArr2?: Resolver<Array<Maybe<ResolversTypes['String']>>, ParentType, ContextType>;\n  testArr3?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;\n  userById?: Resolver<Maybe<ResolversTypes['User']>, ParentType, ContextType, RequireFields<QueryUserByIdArgs, 'id'>>;\n};\n\nexport type UserResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']\n> = {\n  email?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  id?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;\n  name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n};\n\nexport type Resolvers<ContextType = any> = {\n  Query?: QueryResolvers<ContextType>;\n  User?: UserResolvers<ContextType>;\n};\n"
  },
  {
    "path": "dev-test/test-schema/resolvers-types.ts",
    "content": "import { GraphQLResolveInfo } from 'graphql';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\nexport type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  allUsers: Array<Maybe<User>>;\n  /**\n   *  Generates a new answer for th\n   * guessing game\n   */\n  answer: Array<Scalars['Int']['output']>;\n  testArr1?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  testArr2: Array<Maybe<Scalars['String']['output']>>;\n  testArr3: Array<Scalars['String']['output']>;\n  userById?: Maybe<User>;\n};\n\nexport type QueryUserByIdArgs = {\n  id: Scalars['Int']['input'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  email: Scalars['String']['output'];\n  id: Scalars['Int']['output'];\n  name: Scalars['String']['output'];\n};\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<\n  TResult,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<\n  TResult,\n  TKey extends string,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  obj: T,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<\n  TResult = Record<PropertyKey, never>,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = {\n  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n  Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n  Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  String: ResolverTypeWrapper<Scalars['String']['output']>;\n  User: ResolverTypeWrapper<User>;\n};\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = {\n  Boolean: Scalars['Boolean']['output'];\n  Int: Scalars['Int']['output'];\n  Query: Record<PropertyKey, never>;\n  String: Scalars['String']['output'];\n  User: User;\n};\n\nexport type QueryResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']\n> = {\n  allUsers?: Resolver<Array<Maybe<ResolversTypes['User']>>, ParentType, ContextType>;\n  answer?: Resolver<Array<ResolversTypes['Int']>, ParentType, ContextType>;\n  testArr1?: Resolver<Maybe<Array<Maybe<ResolversTypes['String']>>>, ParentType, ContextType>;\n  testArr2?: Resolver<Array<Maybe<ResolversTypes['String']>>, ParentType, ContextType>;\n  testArr3?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;\n  userById?: Resolver<Maybe<ResolversTypes['User']>, ParentType, ContextType, RequireFields<QueryUserByIdArgs, 'id'>>;\n};\n\nexport type UserResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']\n> = {\n  email?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  id?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;\n  name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n};\n\nexport type Resolvers<ContextType = any> = {\n  Query?: QueryResolvers<ContextType>;\n  User?: UserResolvers<ContextType>;\n};\n"
  },
  {
    "path": "dev-test/test-schema/schema-ast.js",
    "content": "const schemaFormats = require('./schema-formats');\nmodule.exports.schema = schemaFormats.schemaAst;\n"
  },
  {
    "path": "dev-test/test-schema/schema-federation.graphql",
    "content": "extend type Query {\n  users: [User]\n}\n\nextend type User @key(fields: \"id\") @key(fields: \"name\") {\n  id: Int! @external\n  name: String! @external\n  email: String!\n    @requires(\n      fields: \"\"\"\n      address(works: \"with params!\") { city lines { line2 } }\n      \"\"\"\n    )\n  address: Address @external\n}\n\nextend type Address {\n  lines: Lines!\n  city: String\n  state: String\n}\n\nextend type Lines {\n  line1: String!\n  line2: String\n}\n\ntype Book {\n  id: ID!\n}\n"
  },
  {
    "path": "dev-test/test-schema/schema-formats.js",
    "content": "/**\n * There are four formats the schema can be in:\n * 1. GraphQLSchema object\n * 2. Text (the GraphQL schema language textual format)\n * 3. AST (the GraphQL schema language textual format parsed into an AST)\n * 4. Introspection JSON (result returned by introspection query)\n *\n * This file imports the textual and introspection json files and\n * exports all four formats to be used in tests.\n */\n\nconst GraphQL = require('graphql');\nconst fs = require('fs');\nconst path = require('path');\nconst schemaText = fs.readFileSync(path.join(__dirname, 'schema.graphql'), 'utf8');\nconst schemaObject = new GraphQL.GraphQLSchema({\n  query: new GraphQL.GraphQLObjectType({\n    name: 'Query',\n    fields: {\n      foo: {\n        type: new GraphQL.GraphQLEnumType({\n          name: 'Foo',\n          values: {\n            BAR: {\n              value: 'QUX',\n            },\n          },\n        }),\n      },\n    },\n  }),\n});\nconst schemaAst = GraphQL.parse(schemaText);\nconst schemaJson = require('./schema.json');\nmodule.exports.schemaText = schemaText;\nmodule.exports.schemaAst = schemaAst;\nmodule.exports.schemaObject = schemaObject;\nmodule.exports.schemaJson = schemaJson;\n"
  },
  {
    "path": "dev-test/test-schema/schema-json.js",
    "content": "const schemaFormats = require('./schema-formats');\nmodule.exports.schema = schemaFormats.schemaJson;\n"
  },
  {
    "path": "dev-test/test-schema/schema-object.js",
    "content": "const schemaFormats = require('./schema-formats');\nmodule.exports.schema = schemaFormats.schemaObject;\n"
  },
  {
    "path": "dev-test/test-schema/schema-text.js",
    "content": "const schemaFormats = require('./schema-formats');\nmodule.exports.schema = schemaFormats.schemaText;\n"
  },
  {
    "path": "dev-test/test-schema/schema-with-imports.graphql",
    "content": "# import User from './schema.graphql'\n\ntype Query {\n  allUsers: [User]!\n  userById(id: Int!): User\n\n  # Generates a new answer for the guessing game\n  answer: [Int!]!\n}\n"
  },
  {
    "path": "dev-test/test-schema/schema-with-root.graphql",
    "content": "schema {\n  query: QueryRoot\n  subscription: SubscriptionRoot\n}\n\ntype Query {\n  someDummyField: Int!\n}\n\ntype QueryRoot {\n  allUsers: [User]!\n  userById(id: Int!): User\n\n  # Generates a new answer for the guessing game\n  answer: [Int!]!\n}\n\ntype User {\n  id: Int!\n  name: String!\n  email: String!\n}\n\ntype SubscriptionRoot {\n  newUser: User\n}\n"
  },
  {
    "path": "dev-test/test-schema/schema.graphql",
    "content": "type User {\n  id: Int!\n  name: String!\n  email: String!\n}\n\ntype Query {\n  allUsers: [User]!\n  userById(id: Int!): User\n\n  \"\"\"\n   Generates a new answer for th\n  guessing game\n  \"\"\"\n  answer: [Int!]!\n  testArr1: [String]\n  testArr2: [String]!\n  testArr3: [String!]!\n}\n"
  },
  {
    "path": "dev-test/test-schema/schema.json",
    "content": "{\n  \"data\": {\n    \"__schema\": {\n      \"queryType\": {\n        \"name\": \"Query\"\n      },\n      \"mutationType\": null,\n      \"subscriptionType\": null,\n      \"types\": [\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Query\",\n          \"description\": \"\",\n          \"fields\": [\n            {\n              \"name\": \"allUsers\",\n              \"description\": \"\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"User\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"userById\",\n              \"description\": \"\",\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": \"\",\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"SCALAR\",\n                      \"name\": \"Int\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"User\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"User\",\n          \"description\": \"\",\n          \"fields\": [\n            {\n              \"name\": \"id\",\n              \"description\": \"\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Int\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": \"\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"email\",\n              \"description\": \"\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"Int\",\n          \"description\": \"The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. \",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"String\",\n          \"description\": \"The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Schema\",\n          \"description\": \"A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.\",\n          \"fields\": [\n            {\n              \"name\": \"types\",\n              \"description\": \"A list of all types supported by this server.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__Type\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"queryType\",\n              \"description\": \"The type that query operations will be rooted at.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"mutationType\",\n              \"description\": \"If this server supports mutation, the type that mutation operations will be rooted at.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"subscriptionType\",\n              \"description\": \"If this server support subscription, the type that subscription operations will be rooted at.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"directives\",\n              \"description\": \"A list of all directives supported by this server.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__Directive\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Type\",\n          \"description\": \"The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\\n\\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name and description, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.\",\n          \"fields\": [\n            {\n              \"name\": \"kind\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"ENUM\",\n                  \"name\": \"__TypeKind\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"fields\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"includeDeprecated\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Boolean\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": \"false\"\n                }\n              ],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Field\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"interfaces\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Type\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"possibleTypes\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Type\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"enumValues\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"includeDeprecated\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Boolean\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": \"false\"\n                }\n              ],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__EnumValue\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"inputFields\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__InputValue\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ofType\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"ENUM\",\n          \"name\": \"__TypeKind\",\n          \"description\": \"An enum describing what kind of type a given `__Type` is.\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": [\n            {\n              \"name\": \"SCALAR\",\n              \"description\": \"Indicates this type is a scalar.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"OBJECT\",\n              \"description\": \"Indicates this type is an object. `fields` and `interfaces` are valid fields.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INTERFACE\",\n              \"description\": \"Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"UNION\",\n              \"description\": \"Indicates this type is a union. `possibleTypes` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ENUM\",\n              \"description\": \"Indicates this type is an enum. `enumValues` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INPUT_OBJECT\",\n              \"description\": \"Indicates this type is an input object. `inputFields` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"LIST\",\n              \"description\": \"Indicates this type is a list. `ofType` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"NON_NULL\",\n              \"description\": \"Indicates this type is a non-null. `ofType` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"Boolean\",\n          \"description\": \"The `Boolean` scalar type represents `true` or `false`.\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Field\",\n          \"description\": \"Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.\",\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"args\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__InputValue\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"type\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"isDeprecated\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"deprecationReason\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__InputValue\",\n          \"description\": \"Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.\",\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"type\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"defaultValue\",\n              \"description\": \"A GraphQL-formatted string representing the default value for this input value.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__EnumValue\",\n          \"description\": \"One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.\",\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"isDeprecated\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"deprecationReason\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Directive\",\n          \"description\": \"A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\\n\\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.\",\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"locations\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"ENUM\",\n                      \"name\": \"__DirectiveLocation\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"args\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__InputValue\",\n                      \"ofType\": null\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onOperation\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": true,\n              \"deprecationReason\": \"Use `locations`.\"\n            },\n            {\n              \"name\": \"onFragment\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": true,\n              \"deprecationReason\": \"Use `locations`.\"\n            },\n            {\n              \"name\": \"onField\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": true,\n              \"deprecationReason\": \"Use `locations`.\"\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"ENUM\",\n          \"name\": \"__DirectiveLocation\",\n          \"description\": \"A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": [\n            {\n              \"name\": \"QUERY\",\n              \"description\": \"Location adjacent to a query operation.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"MUTATION\",\n              \"description\": \"Location adjacent to a mutation operation.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"SUBSCRIPTION\",\n              \"description\": \"Location adjacent to a subscription operation.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FIELD\",\n              \"description\": \"Location adjacent to a field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FRAGMENT_DEFINITION\",\n              \"description\": \"Location adjacent to a fragment definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FRAGMENT_SPREAD\",\n              \"description\": \"Location adjacent to a fragment spread.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INLINE_FRAGMENT\",\n              \"description\": \"Location adjacent to an inline fragment.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"SCHEMA\",\n              \"description\": \"Location adjacent to a schema definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"SCALAR\",\n              \"description\": \"Location adjacent to a scalar definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"OBJECT\",\n              \"description\": \"Location adjacent to an object type definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FIELD_DEFINITION\",\n              \"description\": \"Location adjacent to a field definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ARGUMENT_DEFINITION\",\n              \"description\": \"Location adjacent to an argument definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INTERFACE\",\n              \"description\": \"Location adjacent to an interface definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"UNION\",\n              \"description\": \"Location adjacent to a union definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ENUM\",\n              \"description\": \"Location adjacent to an enum definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ENUM_VALUE\",\n              \"description\": \"Location adjacent to an enum value definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INPUT_OBJECT\",\n              \"description\": \"Location adjacent to an input object type definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INPUT_FIELD_DEFINITION\",\n              \"description\": \"Location adjacent to an input object field definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"possibleTypes\": null\n        }\n      ],\n      \"directives\": [\n        {\n          \"name\": \"skip\",\n          \"description\": \"Directs the executor to skip this field or fragment when the `if` argument is true.\",\n          \"locations\": [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"],\n          \"args\": [\n            {\n              \"name\": \"if\",\n              \"description\": \"Skipped when true.\",\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ]\n        },\n        {\n          \"name\": \"include\",\n          \"description\": \"Directs the executor to include this field or fragment only when the `if` argument is true.\",\n          \"locations\": [\"FIELD\", \"FRAGMENT_SPREAD\", \"INLINE_FRAGMENT\"],\n          \"args\": [\n            {\n              \"name\": \"if\",\n              \"description\": \"Included when true.\",\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ]\n        },\n        {\n          \"name\": \"deprecated\",\n          \"description\": \"Marks an element of a GraphQL schema as no longer supported.\",\n          \"locations\": [\"FIELD_DEFINITION\", \"ENUM_VALUE\"],\n          \"args\": [\n            {\n              \"name\": \"reason\",\n              \"description\": \"Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted in [Markdown](https://daringfireball.net/projects/markdown/).\",\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": \"\\\"No longer supported\\\"\"\n            }\n          ]\n        }\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "dev-test/test-schema/types.onlyEnums.ts",
    "content": "export type TestQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TestQuery = {\n  __typename?: 'Query';\n  testArr1?: Array<string | null> | null;\n  testArr2: Array<string | null>;\n  testArr3: Array<string>;\n};\n"
  },
  {
    "path": "dev-test/test-schema/types.preResolveTypes.onlyOperationTypes.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type TestQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TestQuery = {\n  __typename?: 'Query';\n  testArr1?: Array<string | null> | null;\n  testArr2: Array<string | null>;\n  testArr3: Array<string>;\n};\n"
  },
  {
    "path": "dev-test/test-schema/types.preResolveTypes.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  allUsers: Array<Maybe<User>>;\n  /**\n   *  Generates a new answer for th\n   * guessing game\n   */\n  answer: Array<Scalars['Int']['output']>;\n  testArr1?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  testArr2: Array<Maybe<Scalars['String']['output']>>;\n  testArr3: Array<Scalars['String']['output']>;\n  userById?: Maybe<User>;\n};\n\nexport type QueryUserByIdArgs = {\n  id: Scalars['Int']['input'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  email: Scalars['String']['output'];\n  id: Scalars['Int']['output'];\n  name: Scalars['String']['output'];\n};\n\nexport type TestQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type TestQuery = {\n  __typename?: 'Query';\n  testArr1?: Array<string | null> | null;\n  testArr2: Array<string | null>;\n  testArr3: Array<string>;\n};\n"
  },
  {
    "path": "dev-test/test-schema/typings.avoidOptionals.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  allUsers: Array<Maybe<User>>;\n  userById: Maybe<User>;\n};\n\nexport type QueryUserByIdArgs = {\n  id: Scalars['Int']['input'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  email: Scalars['String']['output'];\n  id: Scalars['Int']['output'];\n  name: Scalars['String']['output'];\n};\n"
  },
  {
    "path": "dev-test/test-schema/typings.enum.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport enum Foo {\n  Bar = 'QUX',\n}\n\nexport type Query = {\n  __typename?: 'Query';\n  foo?: Maybe<Foo>;\n};\n"
  },
  {
    "path": "dev-test/test-schema/typings.immutableTypes.ts",
    "content": "export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  allUsers: Array<Maybe<User>>;\n  userById?: Maybe<User>;\n};\n\nexport type QueryUserByIdArgs = {\n  id: Scalars['Int']['input'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  email: Scalars['String']['output'];\n  id: Scalars['Int']['output'];\n  name: Scalars['String']['output'];\n};\n"
  },
  {
    "path": "dev-test/test-schema/typings.ts",
    "content": "import { GraphQLResolveInfo } from 'graphql';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\nexport type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  allUsers: Array<Maybe<User>>;\n  userById?: Maybe<User>;\n};\n\nexport type QueryUserByIdArgs = {\n  id: Scalars['Int']['input'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  email: Scalars['String']['output'];\n  id: Scalars['Int']['output'];\n  name: Scalars['String']['output'];\n};\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<\n  TResult,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<\n  TResult,\n  TKey extends string,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  obj: T,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<\n  TResult = Record<PropertyKey, never>,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = {\n  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n  Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n  Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  String: ResolverTypeWrapper<Scalars['String']['output']>;\n  User: ResolverTypeWrapper<User>;\n};\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = {\n  Boolean: Scalars['Boolean']['output'];\n  Int: Scalars['Int']['output'];\n  Query: Record<PropertyKey, never>;\n  String: Scalars['String']['output'];\n  User: User;\n};\n\nexport type QueryResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']\n> = {\n  allUsers?: Resolver<Array<Maybe<ResolversTypes['User']>>, ParentType, ContextType>;\n  userById?: Resolver<Maybe<ResolversTypes['User']>, ParentType, ContextType, RequireFields<QueryUserByIdArgs, 'id'>>;\n};\n\nexport type UserResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']\n> = {\n  email?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  id?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;\n  name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n};\n\nexport type Resolvers<ContextType = any> = {\n  Query?: QueryResolvers<ContextType>;\n  User?: UserResolvers<ContextType>;\n};\n"
  },
  {
    "path": "dev-test/test-schema/typings.wrapped.ts",
    "content": "declare namespace GraphQL {\n  export type Maybe<T> = T | null;\n  export type InputMaybe<T> = Maybe<T>;\n  export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n  export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n  export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n  export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n  export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n  /** All built-in and custom scalars, mapped to their actual values */\n  export type Scalars = {\n    ID: { input: string; output: string };\n    String: { input: string; output: string };\n    Boolean: { input: boolean; output: boolean };\n    Int: { input: number; output: number };\n    Float: { input: number; output: number };\n  };\n\n  export type Query = {\n    __typename?: 'Query';\n    allUsers: Array<Maybe<User>>;\n    userById?: Maybe<User>;\n  };\n\n  export type QueryUserByIdArgs = {\n    id: Scalars['Int']['input'];\n  };\n\n  export type User = {\n    __typename?: 'User';\n    email: Scalars['String']['output'];\n    id: Scalars['Int']['output'];\n    name: Scalars['String']['output'];\n  };\n}\n"
  },
  {
    "path": "dev-test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"esModuleInterop\": true,\n    \"lib\": [\"esnext\", \"DOM\"],\n    \"jsx\": \"react\",\n    \"jsxFactory\": \"React.createElement\",\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"noImplicitAny\": true,\n    \"noImplicitThis\": true,\n    \"alwaysStrict\": true,\n    \"noImplicitReturns\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"experimentalDecorators\": true\n  },\n  \"include\": [\"**/*.ts\", \"**/*.tsx\"]\n}\n"
  },
  {
    "path": "dev-test-outer-dir/githunt/current-user.query.graphql",
    "content": "# When running `yarn watch:examples`, updating this file should trigger rebuild,\n# even though it's \"outside\" of the CWD of `dev-test/codegen.ts`\nquery CurrentUserForProfileFromOutsideDirectory {\n  currentUser {\n    login\n    avatar_url\n  }\n}\n"
  },
  {
    "path": "dev-test-outer-dir/githunt/nothing-should-use-this-query.graphql",
    "content": "# This file should be excluded by all dev-test/codegen.ts patterns that otherwise\n# include files from dev-test-outer-dir, so that when running `yarn watch:examples`,\n# updating this file should _never_ trigger rebuild\nquery NothingShouldUseThisQuery {\n  currentUser {\n    login\n    avatar_url\n  }\n}\n"
  },
  {
    "path": "examples/persisted-documents/README.md",
    "content": "# Yoga Persisted Documents Example\n\nExample for showing how to use GraphQL Code Generator for only allowing the execution of persisted operations.\n\n[Learn more about Yoga Persisted Operations](https://the-guild.dev/graphql/yoga-server/docs/features/persisted-operations)\n\n## Usage\n\nRun `yarn codegen --watch` for starting GraphQL Code Generator in watch mode.\n\nRun `yarn test` for running a tests located within `yoga.spec.ts`.\n"
  },
  {
    "path": "examples/persisted-documents/babel.config.js",
    "content": "module.exports = {\n  presets: [\n    ['@babel/preset-env', { targets: { node: process.versions.node.split('.')[0] } }],\n    '@babel/preset-typescript',\n  ],\n};\n"
  },
  {
    "path": "examples/persisted-documents/codegen.ts",
    "content": "import { type CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: './src/yoga.ts',\n  documents: ['src/**/*.ts'],\n  generates: {\n    './src/gql/': {\n      preset: 'client-preset',\n      presetConfig: {\n        persistedDocuments: true,\n      },\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/persisted-documents/package.json",
    "content": "{\n  \"name\": \"example-persisted-documents\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"graphql-yoga\": \"5.7.0\",\n    \"@graphql-yoga/plugin-persisted-operations\": \"3.7.0\"\n  },\n  \"devDependencies\": {\n    \"@graphql-typed-document-node/core\": \"3.2.0\",\n    \"@graphql-codegen/cli\": \"6.2.1\",\n    \"@babel/core\": \"7.25.2\",\n    \"@babel/preset-env\": \"7.25.3\",\n    \"@babel/preset-typescript\": \"7.28.5\"\n  },\n  \"scripts\": {\n    \"test\": \"vitest --no-watch\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\",\n    \"build\": \"tsc\",\n    \"test:end2end\": \"yarn test\"\n  },\n  \"bob\": false\n}\n"
  },
  {
    "path": "examples/persisted-documents/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/persisted-documents/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  query HelloQuery {\\n    hello\\n  }\\n': typeof types.HelloQueryDocument;\n};\nconst documents: Documents = {\n  '\\n  query HelloQuery {\\n    hello\\n  }\\n': types.HelloQueryDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query HelloQuery {\\n    hello\\n  }\\n'\n): (typeof documents)['\\n  query HelloQuery {\\n    hello\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/persisted-documents/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  echo: Scalars['String']['output'];\n};\n\nexport type MutationEchoArgs = {\n  message: Scalars['String']['input'];\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  hello: Scalars['String']['output'];\n};\n\nexport type HelloQueryQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HelloQueryQuery = { __typename?: 'Query'; hello: string };\n\nexport const HelloQueryDocument = {\n  __meta__: { hash: '86f01e23de1c770cabbc35b2d87f2e5fd7557b6f' },\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'HelloQuery' },\n      selectionSet: { kind: 'SelectionSet', selections: [{ kind: 'Field', name: { kind: 'Name', value: 'hello' } }] },\n    },\n  ],\n} as unknown as DocumentNode<HelloQueryQuery, HelloQueryQueryVariables>;\n"
  },
  {
    "path": "examples/persisted-documents/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/persisted-documents/src/gql/persisted-documents.json",
    "content": "{\n  \"86f01e23de1c770cabbc35b2d87f2e5fd7557b6f\": \"query HelloQuery { hello }\"\n}\n"
  },
  {
    "path": "examples/persisted-documents/src/main.ts",
    "content": "import { createServer } from 'http';\nimport { makeYoga } from './yoga.js';\n\nimport persistedDocumentsDictionary from './gql/persisted-documents.json';\n\nconst persistedDocuments = new Map<string, string>(Object.entries(persistedDocumentsDictionary));\n\nconst yoga = makeYoga({ persistedDocuments });\nconst server = createServer(yoga);\n\n// Start the server and you're done!\nserver.listen(4000, () => {\n  // eslint-disable-next-line no-console\n  console.info('Server is running on http://localhost:4000/graphql');\n});\n"
  },
  {
    "path": "examples/persisted-documents/src/yoga.spec.ts",
    "content": "import { describe, it, expect } from 'vitest';\nimport { graphql } from './gql/index';\nimport { makeYoga } from './yoga';\nimport persistedDocumentsDictionary from './gql/persisted-documents.json';\nimport { print } from 'graphql';\n\nconst persistedDocuments = new Map<string, string>(Object.entries(persistedDocumentsDictionary));\n\nconst HelloQuery = graphql(/* GraphQL */ `\n  query HelloQuery {\n    hello\n  }\n`);\n\ndescribe('Persisted Documents', () => {\n  it('execute document without persisted operation enabled', async () => {\n    const yoga = makeYoga({ persistedDocuments: null });\n    const result = await yoga.fetch('http://yoga/graphql', {\n      method: 'POST',\n      headers: {\n        'content-type': 'application/json',\n        accept: 'application/json',\n      },\n      body: JSON.stringify({\n        query: print(HelloQuery),\n      }),\n    });\n    expect(await result.json()).toMatchInlineSnapshot(`\n      {\n        \"data\": {\n          \"hello\": \"Hello world!\",\n        },\n      }\n    `);\n  });\n\n  it('can not execute arbitrary operation with persisted operations enabled', async () => {\n    const yoga = makeYoga({ persistedDocuments });\n    const result = await yoga.fetch('http://yoga/graphql', {\n      method: 'POST',\n      headers: {\n        'content-type': 'application/json',\n        accept: 'application/json',\n      },\n      body: JSON.stringify({\n        query: print(HelloQuery),\n      }),\n    });\n    expect(await result.json()).toMatchInlineSnapshot(`\n      {\n        \"errors\": [\n          {\n            \"message\": \"PersistedQueryOnly\",\n          },\n        ],\n      }\n    `);\n  });\n\n  it('can execute persisted operation with persisted operations enabled', async () => {\n    const yoga = makeYoga({ persistedDocuments });\n    const result = await yoga.fetch('http://yoga/graphql', {\n      method: 'POST',\n      headers: {\n        'content-type': 'application/json',\n        accept: 'application/json',\n      },\n      body: JSON.stringify({\n        extensions: {\n          persistedQuery: {\n            version: 1,\n            sha256Hash: (HelloQuery as any)['__meta__']['hash'],\n          },\n        },\n      }),\n    });\n\n    expect(await result.json()).toMatchInlineSnapshot(`\n      {\n        \"data\": {\n          \"hello\": \"Hello world!\",\n        },\n      }\n    `);\n  });\n});\n"
  },
  {
    "path": "examples/persisted-documents/src/yoga.ts",
    "content": "import { createSchema, createYoga, type Plugin } from 'graphql-yoga';\nimport { usePersistedOperations } from '@graphql-yoga/plugin-persisted-operations';\n\nconst schema = createSchema({\n  typeDefs: /* GraphQL */ `\n    type Query {\n      hello: String!\n    }\n\n    type Mutation {\n      echo(message: String!): String!\n    }\n  `,\n  resolvers: {\n    Query: {\n      hello: () => 'Hello world!',\n    },\n    Mutation: {\n      echo: (_, args) => args.message,\n    },\n  },\n});\n\nexport function makeYoga(args: { persistedDocuments: null | Map<string, string> }) {\n  const plugins: Array<Plugin<any, any, any>> = [];\n  if (args.persistedDocuments !== null) {\n    const { persistedDocuments } = args;\n    plugins.push(\n      usePersistedOperations({\n        getPersistedOperation: hash => persistedDocuments.get(hash),\n      })\n    );\n  }\n  return createYoga({\n    schema,\n    plugins,\n  });\n}\n"
  },
  {
    "path": "examples/persisted-documents/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"module\": \"Node16\",\n    \"outDir\": \"dist\",\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true\n  },\n  \"include\": [\"src/**/*\"]\n}\n"
  },
  {
    "path": "examples/persisted-documents/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'examples-persisted-documents',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/README.md",
    "content": "# Yoga Persisted Documents Example\n\nExample for showing how to use GraphQL Code Generator for only allowing the execution of persisted operations.\n\n[Learn more about Yoga Persisted Operations](https://the-guild.dev/graphql/yoga-server/docs/features/persisted-operations)\n\n## Usage\n\nRun `yarn codegen --watch` for starting GraphQL Code Generator in watch mode.\n\nRun `yarn test` for running a tests located within `yoga.spec.ts`.\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/babel.config.js",
    "content": "module.exports = {\n  presets: [\n    ['@babel/preset-env', { targets: { node: process.versions.node.split('.')[0] } }],\n    '@babel/preset-typescript',\n  ],\n};\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/codegen.ts",
    "content": "import { type CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: './src/yoga.ts',\n  documents: ['src/**/*.ts'],\n  generates: {\n    './src/gql/': {\n      preset: 'client-preset',\n      presetConfig: {\n        persistedDocuments: true,\n      },\n      config: {\n        documentMode: 'string',\n      },\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/package.json",
    "content": "{\n  \"name\": \"example-persisted-documents-string-mode\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"graphql-yoga\": \"5.7.0\",\n    \"@graphql-yoga/plugin-persisted-operations\": \"3.7.0\"\n  },\n  \"devDependencies\": {\n    \"@graphql-typed-document-node/core\": \"3.2.0\",\n    \"@graphql-codegen/cli\": \"6.2.1\",\n    \"@babel/core\": \"7.25.2\",\n    \"@babel/preset-env\": \"7.25.3\",\n    \"@babel/preset-typescript\": \"7.28.5\"\n  },\n  \"scripts\": {\n    \"test\": \"vitest --no-watch\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\",\n    \"build\": \"tsc\",\n    \"test:end2end\": \"yarn test\"\n  },\n  \"bob\": false\n}\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration } from '@graphql-typed-document-node/core';\nimport { Incremental, TypedDocumentString } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: TypedDocumentString<TQuery, any>,\n  fragmentNode: TypedDocumentString<TFrag, any>,\n  data: FragmentType<TypedDocumentString<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = queryNode.__meta__?.deferredFields as Record<string, (keyof TFrag)[]>;\n  const fragName = fragmentNode.__meta__?.fragmentName as string | undefined;\n\n  if (!deferredFields || !fragName) return true;\n\n  const fields = deferredFields[fragName] ?? [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  query HelloQuery {\\n    hello\\n  }\\n': typeof types.HelloQueryDocument;\n};\nconst documents: Documents = {\n  '\\n  query HelloQuery {\\n    hello\\n  }\\n': types.HelloQueryDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query HelloQuery {\\n    hello\\n  }\\n'\n): typeof import('./graphql').HelloQueryDocument;\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { DocumentTypeDecoration } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  echo: Scalars['String']['output'];\n};\n\nexport type MutationEchoArgs = {\n  message: Scalars['String']['input'];\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  hello: Scalars['String']['output'];\n};\n\nexport type HelloQueryQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HelloQueryQuery = { __typename?: 'Query'; hello: string };\n\nexport class TypedDocumentString<TResult, TVariables>\n  extends String\n  implements DocumentTypeDecoration<TResult, TVariables>\n{\n  __apiType?: NonNullable<DocumentTypeDecoration<TResult, TVariables>['__apiType']>;\n  private value: string;\n  public __meta__?: Record<string, any> | undefined;\n\n  constructor(value: string, __meta__?: Record<string, any> | undefined) {\n    super(value);\n    this.value = value;\n    this.__meta__ = __meta__;\n  }\n\n  override toString(): string & DocumentTypeDecoration<TResult, TVariables> {\n    return this.value;\n  }\n}\n\nexport const HelloQueryDocument = new TypedDocumentString(\n  `\n    query HelloQuery {\n  hello\n}\n    `,\n  { hash: '86f01e23de1c770cabbc35b2d87f2e5fd7557b6f' }\n) as unknown as TypedDocumentString<HelloQueryQuery, HelloQueryQueryVariables>;\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/src/gql/persisted-documents.json",
    "content": "{\n  \"86f01e23de1c770cabbc35b2d87f2e5fd7557b6f\": \"query HelloQuery { hello }\"\n}\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/src/main.ts",
    "content": "import { createServer } from 'http';\nimport { makeYoga } from './yoga.js';\n\nimport persistedDocumentsDictionary from './gql/persisted-documents.json';\n\nconst persistedDocuments = new Map<string, string>(Object.entries(persistedDocumentsDictionary));\n\nconst yoga = makeYoga({ persistedDocuments });\nconst server = createServer(yoga);\n\n// Start the server and you're done!\nserver.listen(4000, () => {\n  // eslint-disable-next-line no-console\n  console.info('Server is running on http://localhost:4000/graphql');\n});\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/src/yoga.spec.ts",
    "content": "import { describe, it, expect } from 'vitest';\nimport { graphql } from './gql/index';\nimport { makeYoga } from './yoga';\nimport persistedDocumentsDictionary from './gql/persisted-documents.json';\n\nconst persistedDocuments = new Map<string, string>(Object.entries(persistedDocumentsDictionary));\n\nconst HelloQuery = graphql(/* GraphQL */ `\n  query HelloQuery {\n    hello\n  }\n`);\n\ndescribe('Persisted Documents', () => {\n  it('execute document without persisted operation enabled', async () => {\n    const yoga = makeYoga({ persistedDocuments: null });\n    const result = await yoga.fetch('http://yoga/graphql', {\n      method: 'POST',\n      headers: {\n        'content-type': 'application/json',\n        accept: 'application/json',\n      },\n      body: JSON.stringify({\n        query: HelloQuery,\n      }),\n    });\n    expect(await result.json()).toMatchInlineSnapshot(`\n      {\n        \"data\": {\n          \"hello\": \"Hello world!\",\n        },\n      }\n    `);\n  });\n\n  it('can not execute arbitrary operation with persisted operations enabled', async () => {\n    const yoga = makeYoga({ persistedDocuments });\n\n    const result = await yoga.fetch('http://yoga/graphql', {\n      method: 'POST',\n      headers: {\n        'content-type': 'application/json',\n        accept: 'application/json',\n      },\n      body: JSON.stringify({\n        query: HelloQuery,\n      }),\n    });\n    expect(await result.json()).toMatchInlineSnapshot(`\n      {\n        \"errors\": [\n          {\n            \"message\": \"PersistedQueryOnly\",\n          },\n        ],\n      }\n    `);\n  });\n\n  it('can execute persisted operation with persisted operations enabled', async () => {\n    const yoga = makeYoga({ persistedDocuments });\n    const result = await yoga.fetch('http://yoga/graphql', {\n      method: 'POST',\n      headers: {\n        'content-type': 'application/json',\n        accept: 'application/json',\n      },\n      body: JSON.stringify({\n        extensions: {\n          persistedQuery: {\n            version: 1,\n            sha256Hash: (HelloQuery as any)['__meta__']['hash'],\n          },\n        },\n      }),\n    });\n\n    expect(await result.json()).toMatchInlineSnapshot(`\n      {\n        \"data\": {\n          \"hello\": \"Hello world!\",\n        },\n      }\n    `);\n  });\n});\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/src/yoga.ts",
    "content": "import { createSchema, createYoga, type Plugin } from 'graphql-yoga';\nimport { usePersistedOperations } from '@graphql-yoga/plugin-persisted-operations';\n\nconst schema = createSchema({\n  typeDefs: /* GraphQL */ `\n    type Query {\n      hello: String!\n    }\n\n    type Mutation {\n      echo(message: String!): String!\n    }\n  `,\n  resolvers: {\n    Query: {\n      hello: () => 'Hello world!',\n    },\n    Mutation: {\n      echo: (_, args) => args.message,\n    },\n  },\n});\n\nexport function makeYoga(args: { persistedDocuments: null | Map<string, string> }) {\n  const plugins: Array<Plugin<any, any, any>> = [];\n  if (args.persistedDocuments !== null) {\n    const { persistedDocuments } = args;\n    plugins.push(\n      usePersistedOperations({\n        getPersistedOperation: hash => persistedDocuments.get(hash),\n      })\n    );\n  }\n  return createYoga({\n    schema,\n    plugins,\n  });\n}\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"module\": \"Node16\",\n    \"outDir\": \"dist\",\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true\n  },\n  \"include\": [\"src/**/*\"]\n}\n"
  },
  {
    "path": "examples/persisted-documents-string-mode/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'examples-persisted-documents-string-mode',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "examples/programmatic-typescript/package.json",
    "content": "{\n  \"name\": \"example-programmatic-typescript\",\n  \"version\": \"0.0.1\",\n  \"private\": true,\n  \"scripts\": {\n    \"start:cjs\": \"tsup --onSuccess \\\"node dist/index.js\\\"\",\n    \"start:mjs\": \"tsup --onSuccess \\\"node dist/index.mjs\\\"\",\n    \"codegen\": \"exit 0\",\n    \"build\": \"yarn start:cjs && yarn start:mjs\",\n    \"test:end2end\": \"exit 0\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/core\": \"5.0.1\",\n    \"@graphql-codegen/plugin-helpers\": \"6.2.0\",\n    \"@graphql-codegen/typed-document-node\": \"6.1.7\",\n    \"@graphql-codegen/typescript\": \"5.0.9\",\n    \"@graphql-codegen/typescript-operations\": \"5.0.9\",\n    \"@graphql-codegen/typescript-resolvers\": \"5.1.7\",\n    \"@graphql-tools/graphql-file-loader\": \"^8.1.12\",\n    \"@graphql-tools/load\": \"8.1.0\",\n    \"@graphql-tools/schema\": \"10.0.6\",\n    \"graphql\": \"16.9.0\",\n    \"graphql-tag\": \"2.12.6\",\n    \"prettier\": \"2.8.8\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"22.10.7\",\n    \"tsup\": \"8.2.4\"\n  }\n}\n"
  },
  {
    "path": "examples/programmatic-typescript/src/gql.generated.ts",
    "content": "import type { GraphQLResolveInfo } from 'graphql';\nimport type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  hello: Scalars['String']['output'];\n};\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<\n  TResult,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<\n  TResult,\n  TKey extends string,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  obj: T,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<\n  TResult = Record<PropertyKey, never>,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = {\n  Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  String: ResolverTypeWrapper<Scalars['String']['output']>;\n  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n};\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = {\n  Query: Record<PropertyKey, never>;\n  String: Scalars['String']['output'];\n  Boolean: Scalars['Boolean']['output'];\n};\n\nexport type QueryResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']\n> = {\n  hello?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n};\n\nexport type Resolvers<ContextType = any> = {\n  Query?: QueryResolvers<ContextType>;\n};\n\nexport type HelloQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HelloQuery = { __typename?: 'Query'; hello: string };\n\nexport const HelloDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'hello' },\n      selectionSet: { kind: 'SelectionSet', selections: [{ kind: 'Field', name: { kind: 'Name', value: 'hello' } }] },\n    },\n  ],\n} as unknown as DocumentNode<HelloQuery, HelloQueryVariables>;\n"
  },
  {
    "path": "examples/programmatic-typescript/src/graphql/hello.gql",
    "content": "query hello {\n  hello\n}\n"
  },
  {
    "path": "examples/programmatic-typescript/src/index.ts",
    "content": "/* eslint-disable no-console */\nimport { promises } from 'node:fs';\nimport { codegen } from '@graphql-codegen/core';\nimport { getCachedDocumentNodeFromSchema } from '@graphql-codegen/plugin-helpers';\nimport * as typedDocumentNode from '@graphql-codegen/typed-document-node';\nimport * as typescript from '@graphql-codegen/typescript';\nimport * as typescriptOperations from '@graphql-codegen/typescript-operations';\nimport * as typescriptResolvers from '@graphql-codegen/typescript-resolvers';\nimport { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader';\nimport { loadDocuments } from '@graphql-tools/load';\nimport { makeExecutableSchema } from '@graphql-tools/schema';\nimport gql from 'graphql-tag';\nimport prettier from 'prettier';\nimport type { Resolvers } from './gql.generated.js';\n\nconst schema = makeExecutableSchema({\n  typeDefs: gql`\n    type Query {\n      hello: String!\n    }\n  `,\n  resolvers: {\n    Query: {\n      hello(_root, _args, _ctx) {\n        return 'world';\n      },\n    },\n  } as Resolvers<unknown>,\n});\n\n(async () => {\n  const loadedDocuments = await loadDocuments(['src/graphql/**/*.gql'], {\n    loaders: [new GraphQLFileLoader()],\n  });\n\n  const config: typescript.TypeScriptPluginConfig &\n    typescriptResolvers.TypeScriptResolversPluginConfig &\n    typescriptOperations.TypeScriptDocumentsPluginConfig &\n    typedDocumentNode.TypeScriptTypedDocumentNodesConfig = {\n    useTypeImports: true,\n  };\n\n  const schemaAsDocumentNode = getCachedDocumentNodeFromSchema(schema);\n\n  const codegenCode = await codegen({\n    schema: schemaAsDocumentNode,\n    schemaAst: schema,\n    config,\n    documents: loadedDocuments,\n    filename: 'gql.generated.ts',\n    pluginMap: {\n      typescript,\n      typescriptResolvers,\n      typescriptOperations,\n      typedDocumentNode,\n    },\n    plugins: [\n      {\n        typescript: {},\n      },\n      {\n        typescriptResolvers: {},\n      },\n      {\n        typescriptOperations: {},\n      },\n      {\n        typedDocumentNode: {},\n      },\n    ],\n  });\n\n  await promises.writeFile(\n    'src/gql.generated.ts',\n    prettier.format(codegenCode, {\n      ...(await prettier.resolveConfig(process.cwd())),\n      parser: 'typescript',\n    }),\n    'utf8'\n  );\n  console.log('done generating.');\n})().catch(err => {\n  console.error(err);\n  process.exit(1);\n});\n"
  },
  {
    "path": "examples/programmatic-typescript/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"target\": \"es2020\",\n    \"module\": \"commonjs\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"rootDir\": \"../../\"\n  },\n  \"include\": [\"src/**/*.ts\"]\n}\n"
  },
  {
    "path": "examples/programmatic-typescript/tsup.config.ts",
    "content": "export const tsup: import('tsup').Options = {\n  target: 'es2019',\n  entryPoints: ['src/index.ts'],\n  format: ['cjs', 'esm'],\n  ignoreWatch: ['src/ez.generated.ts'],\n};\n"
  },
  {
    "path": "examples/react/apollo-client/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": "examples/react/apollo-client/README.md",
    "content": "# Using GraphQL Code Generator with Apollo Client and React\n\nThis example illustrates how to use GraphQL Code Generator in a React application using the Apollo React GraphQL Client.\n\nYou will find the TypeScript-based codegen configuration in [`codegen.ts`](./codegen.ts).\n\nThis simple codegen configuration generates types and helpers in the [`src/gql`](./src/gql/) folder that help you to get typed GraphQL Queries and Mutations seamlessly ⚡️\n\n<br />\n\nFor a step-by-step implementation tutorial, please refer to the related guide:\n\nhttps://www.the-guild.dev/graphql/codegen/docs/guides/react-vue-angular\n\n--\n\nPlease note that the `client` preset used in this example is compatible with `@apollo/client` (since `3.2.0`, not when using React Components (`<Query>`)).\n"
  },
  {
    "path": "examples/react/apollo-client/codegen.ts",
    "content": "import { type CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/react/apollo-client/cypress/e2e/end2end.cy.ts",
    "content": "describe('template spec', () => {\n  it('renders everything correctly', () => {\n    cy.visit('http://localhost:3000');\n    cy.get('h3').should('contain', 'A New Hope');\n  });\n});\n"
  },
  {
    "path": "examples/react/apollo-client/cypress/support/commands.ts",
    "content": "/// <reference types=\"cypress\" />\n"
  },
  {
    "path": "examples/react/apollo-client/cypress/support/e2e.ts",
    "content": "// Import commands.js using ES2015 syntax:\nimport './commands';\n"
  },
  {
    "path": "examples/react/apollo-client/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(_on, _config) {\n      // implement node event listeners here\n    },\n  },\n});\n"
  },
  {
    "path": "examples/react/apollo-client/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite App</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/react/apollo-client/package.json",
    "content": "{\n  \"name\": \"example-react-apollo-client\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@apollo/client\": \"^3.7.10\",\n    \"graphql\": \"^16.6.0\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\"\n  },\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^6.2.1\",\n    \"@vitejs/plugin-react\": \"^5.0.0\",\n    \"@types/node\": \"^22.0.0\",\n    \"@types/react\": \"^18.0.15\",\n    \"@types/react-dom\": \"^18.0.10\",\n    \"typescript\": \"5.5.4\",\n    \"serve\": \"14.2.3\",\n    \"cypress\": \"15.7.1\",\n    \"start-server-and-test\": \"2.0.5\",\n    \"vite\": \"^6.0.0\"\n  },\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"start\": \"serve -s dist\",\n    \"test\": \"cypress run\",\n    \"test:end2end\": \"start-server-and-test start http://localhost:3000 test\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\"\n  }\n}\n"
  },
  {
    "path": "examples/react/apollo-client/src/App.css",
    "content": ".App {\n  text-align: center;\n}\n\n.App-logo {\n  height: 40vmin;\n  pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  .App-logo {\n    animation: App-logo-spin infinite 20s linear;\n  }\n}\n\n.App-header {\n  background-color: #282c34;\n  min-height: 100vh;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  font-size: calc(10px + 2vmin);\n  color: white;\n}\n\n.App-link {\n  color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "examples/react/apollo-client/src/App.tsx",
    "content": "import React from 'react';\nimport { useQuery } from '@apollo/client';\n\nimport './App.css';\nimport Film from './Film';\nimport { graphql } from './gql/gql';\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`);\n\nfunction App() {\n  const { data } = useQuery(allFilmsWithVariablesQueryDocument, { variables: { first: 10 } });\n  return (\n    <div className=\"App\">\n      {data && <ul>{data.allFilms?.edges?.map((e, i) => e?.node && <Film film={e?.node} key={`film-${i}`} />)}</ul>}\n    </div>\n  );\n}\n\nexport default App;\n"
  },
  {
    "path": "examples/react/apollo-client/src/Film.tsx",
    "content": "import { graphql, FragmentType, useFragment } from './gql';\n\nexport const FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`);\n\nconst Film = (props: { film: FragmentType<typeof FilmFragment> }) => {\n  const film = useFragment(FilmFragment, props.film);\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  );\n};\n\nexport default Film;\n"
  },
  {
    "path": "examples/react/apollo-client/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/react/apollo-client/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllFilmsWithVariablesQueryDocument;\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n': typeof types.FilmItemFragmentDoc;\n};\nconst documents: Documents = {\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllFilmsWithVariablesQueryDocument,\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n':\n    types.FilmItemFragmentDoc,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'\n): (typeof documents)['\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/react/apollo-client/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type AllFilmsWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllFilmsWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allFilms?: {\n    __typename?: 'FilmsConnection';\n    edges?: Array<{\n      __typename?: 'FilmsEdge';\n      node?: ({ __typename?: 'Film' } & { ' $fragmentRefs'?: { FilmItemFragment: FilmItemFragment } }) | null;\n    } | null> | null;\n  } | null;\n};\n\nexport type FilmItemFragment = {\n  __typename?: 'Film';\n  id: string;\n  title?: string | null;\n  releaseDate?: string | null;\n  producers?: Array<string | null> | null;\n} & { ' $fragmentName'?: 'FilmItemFragment' };\n\nexport const FilmItemFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FilmItemFragment, unknown>;\nexport const AllFilmsWithVariablesQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'allFilmsWithVariablesQuery' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'allFilms' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'first' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'edges' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      {\n                        kind: 'Field',\n                        name: { kind: 'Name', value: 'node' },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'FilmItem' } }],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<AllFilmsWithVariablesQueryQuery, AllFilmsWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/react/apollo-client/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/react/apollo-client/src/main.css",
    "content": "body {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans',\n    'Droid Sans', 'Helvetica Neue', sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;\n}\n"
  },
  {
    "path": "examples/react/apollo-client/src/main.tsx",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './main.css';\nimport App from './App';\nimport { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';\n\nconst client = new ApolloClient({\n  uri: 'https://graphql.org/graphql/',\n  cache: new InMemoryCache(),\n});\n\nconst root = ReactDOM.createRoot(document.getElementById('app') as HTMLElement);\nroot.render(\n  <React.StrictMode>\n    <ApolloProvider client={client}>\n      <App />\n    </ApolloProvider>\n  </React.StrictMode>\n);\n"
  },
  {
    "path": "examples/react/apollo-client/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"esModuleInterop\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n    \"skipLibCheck\": true,\n    \"noEmit\": true\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.d.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "examples/react/apollo-client/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "examples/react/apollo-client/vite.config.ts",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n});\n"
  },
  {
    "path": "examples/react/apollo-client-defer/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": "examples/react/apollo-client-defer/README.md",
    "content": "# Using GraphQL Code Generator with Apollo Client and React\n\nThis example illustrates how to use GraphQL Code Generator in a React application using the Apollo React GraphQL Client.\n\nYou will find the TypeScript-based codegen configuration in [`codegen.ts`](./codegen.ts).\n\nThis simple codegen configuration generates types and helpers in the [`src/gql`](./src/gql/) folder that help you to get typed GraphQL Queries and Mutations seamlessly ⚡️\n\n<br />\n\nFor a step-by-step implementation tutorial, please refer to the related guide:\n\nhttps://www.the-guild.dev/graphql/codegen/docs/guides/react-vue-angular\n\n--\n\nPlease note that the `client` preset used in this example is compatible with `@apollo/client` (since `3.2.0`, not when using React Components (`<Query>`)).\n"
  },
  {
    "path": "examples/react/apollo-client-defer/codegen.ts",
    "content": "import { type CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: './src/yoga.mjs',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/react/apollo-client-defer/cypress/e2e/end2end.cy.ts",
    "content": "describe('template spec', () => {\n  it('renders everything correctly', () => {\n    cy.visit('http://localhost:3000');\n    cy.get('.App').should('contain', 'I am speed');\n    cy.get('.App').should('not.contain', 'I am slow');\n\n    cy.wait(5000);\n    cy.get('.App').should('contain', 'I am slow');\n    cy.get('.App').should('contain', 'I am slow inlined fragment');\n  });\n});\n"
  },
  {
    "path": "examples/react/apollo-client-defer/cypress/support/commands.ts",
    "content": "/// <reference types=\"cypress\" />\n"
  },
  {
    "path": "examples/react/apollo-client-defer/cypress/support/e2e.ts",
    "content": "// Import commands.js using ES2015 syntax:\nimport './commands';\n"
  },
  {
    "path": "examples/react/apollo-client-defer/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(_on, _config) {\n      // implement node event listeners here\n    },\n  },\n});\n"
  },
  {
    "path": "examples/react/apollo-client-defer/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite App</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/react/apollo-client-defer/package.json",
    "content": "{\n  \"name\": \"example-react-apollo-client-defer\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@apollo/client\": \"^3.7.10\",\n    \"@graphql-yoga/plugin-defer-stream\": \"^3.0.0\",\n    \"graphql\": \"^16.6.0\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"graphql-yoga\": \"5.7.0\"\n  },\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^6.2.1\",\n    \"@types/node\": \"^22.0.0\",\n    \"@types/react\": \"^18.0.15\",\n    \"@types/react-dom\": \"^18.0.10\",\n    \"@vitejs/plugin-react\": \"^5.0.0\",\n    \"cypress\": \"15.7.1\",\n    \"serve\": \"14.2.3\",\n    \"start-server-and-test\": \"2.0.5\",\n    \"typescript\": \"5.5.4\",\n    \"vite\": \"^6.0.0\"\n  },\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"start:yoga\": \"node src/yoga.mjs\",\n    \"start\": \"yarn start:yoga & serve -s dist\",\n    \"test\": \"cypress run\",\n    \"test:end2end\": \"start-server-and-test start http://localhost:3000 test\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\"\n  }\n}\n"
  },
  {
    "path": "examples/react/apollo-client-defer/src/App.tsx",
    "content": "import { useQuery } from '@apollo/client';\n\nimport { useFragment, graphql, FragmentType, isFragmentReady, DocumentType } from './gql';\n\nexport const slowFieldFragment = graphql(/* GraphQL */ `\n  fragment SlowFieldFragment on Query {\n    slowField(waitFor: 5000)\n  }\n`);\n\nconst alphabetQuery = graphql(/* GraphQL */ `\n  query SlowAndFastFieldWithDefer {\n    fastField\n    ...SlowFieldFragment @defer\n\n    ... @defer {\n      inlinedSlowField: slowField(waitFor: 5000)\n    }\n  }\n`);\n\nconst SlowDataField = (props: { data: FragmentType<typeof slowFieldFragment> }) => {\n  const data = useFragment(slowFieldFragment, props.data);\n  return <p>{data.slowField}</p>;\n};\n\nconst InlinedSlowDataField = (props: { data: DocumentType<typeof alphabetQuery> }) => {\n  try {\n    // @ts-expect-error - this field should be either undefined or a string\n    const _ = props.data.inlinedSlowField.toLowerCase();\n  } catch (e) {}\n\n  if (!props.data.inlinedSlowField) {\n    return null;\n  }\n  return <p>{props.data.inlinedSlowField} inlined fragment</p>;\n};\n\nfunction App() {\n  const { data } = useQuery(alphabetQuery);\n\n  return (\n    <div className=\"App\">\n      {data && (\n        <>\n          <p>{data.fastField}</p>\n          {isFragmentReady(alphabetQuery, slowFieldFragment, data) && <SlowDataField data={data} />}\n          <InlinedSlowDataField data={data} />\n        </>\n      )}\n    </div>\n  );\n}\n\nexport default App;\n"
  },
  {
    "path": "examples/react/apollo-client-defer/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/react/apollo-client-defer/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  fragment SlowFieldFragment on Query {\\n    slowField(waitFor: 5000)\\n  }\\n': typeof types.SlowFieldFragmentFragmentDoc;\n  '\\n  query SlowAndFastFieldWithDefer {\\n    fastField\\n    ...SlowFieldFragment @defer\\n\\n    ... @defer {\\n      inlinedSlowField: slowField(waitFor: 5000)\\n    }\\n  }\\n': typeof types.SlowAndFastFieldWithDeferDocument;\n};\nconst documents: Documents = {\n  '\\n  fragment SlowFieldFragment on Query {\\n    slowField(waitFor: 5000)\\n  }\\n': types.SlowFieldFragmentFragmentDoc,\n  '\\n  query SlowAndFastFieldWithDefer {\\n    fastField\\n    ...SlowFieldFragment @defer\\n\\n    ... @defer {\\n      inlinedSlowField: slowField(waitFor: 5000)\\n    }\\n  }\\n':\n    types.SlowAndFastFieldWithDeferDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment SlowFieldFragment on Query {\\n    slowField(waitFor: 5000)\\n  }\\n'\n): (typeof documents)['\\n  fragment SlowFieldFragment on Query {\\n    slowField(waitFor: 5000)\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query SlowAndFastFieldWithDefer {\\n    fastField\\n    ...SlowFieldFragment @defer\\n\\n    ... @defer {\\n      inlinedSlowField: slowField(waitFor: 5000)\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query SlowAndFastFieldWithDefer {\\n    fastField\\n    ...SlowFieldFragment @defer\\n\\n    ... @defer {\\n      inlinedSlowField: slowField(waitFor: 5000)\\n    }\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/react/apollo-client-defer/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  alphabet: Array<Scalars['String']['output']>;\n  /** A field that resolves fast. */\n  fastField: Scalars['String']['output'];\n  /**\n   * A field that resolves slowly.\n   * Maybe you want to @defer this field ;)\n   */\n  slowField: Scalars['String']['output'];\n};\n\nexport type QuerySlowFieldArgs = {\n  waitFor?: Scalars['Int']['input'];\n};\n\nexport type SlowFieldFragmentFragment = { __typename?: 'Query'; slowField: string } & {\n  ' $fragmentName'?: 'SlowFieldFragmentFragment';\n};\n\nexport type SlowAndFastFieldWithDeferQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type SlowAndFastFieldWithDeferQuery = { __typename?: 'Query'; fastField: string } & (\n  | { __typename?: 'Query'; inlinedSlowField: string }\n  | { __typename?: 'Query'; inlinedSlowField?: never }\n) &\n  ({ __typename?: 'Query' } & {\n    ' $fragmentRefs'?: { SlowFieldFragmentFragment: Incremental<SlowFieldFragmentFragment> };\n  });\n\nexport const SlowFieldFragmentFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'SlowFieldFragment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Query' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'slowField' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'waitFor' },\n                value: { kind: 'IntValue', value: '5000' },\n              },\n            ],\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<SlowFieldFragmentFragment, unknown>;\nexport const SlowAndFastFieldWithDeferDocument = {\n  __meta__: { deferredFields: { SlowFieldFragment: ['slowField'] } },\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'SlowAndFastFieldWithDefer' },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'fastField' } },\n          {\n            kind: 'FragmentSpread',\n            name: { kind: 'Name', value: 'SlowFieldFragment' },\n            directives: [{ kind: 'Directive', name: { kind: 'Name', value: 'defer' } }],\n          },\n          {\n            kind: 'InlineFragment',\n            directives: [{ kind: 'Directive', name: { kind: 'Name', value: 'defer' } }],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  alias: { kind: 'Name', value: 'inlinedSlowField' },\n                  name: { kind: 'Name', value: 'slowField' },\n                  arguments: [\n                    {\n                      kind: 'Argument',\n                      name: { kind: 'Name', value: 'waitFor' },\n                      value: { kind: 'IntValue', value: '5000' },\n                    },\n                  ],\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'SlowFieldFragment' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Query' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'slowField' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'waitFor' },\n                value: { kind: 'IntValue', value: '5000' },\n              },\n            ],\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<SlowAndFastFieldWithDeferQuery, SlowAndFastFieldWithDeferQueryVariables>;\n"
  },
  {
    "path": "examples/react/apollo-client-defer/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/react/apollo-client-defer/src/main.tsx",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\nimport { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';\n\nconst client = new ApolloClient({\n  uri: 'http://localhost:4000/graphql',\n  cache: new InMemoryCache(),\n});\n\nconst root = ReactDOM.createRoot(document.getElementById('app') as HTMLElement);\nroot.render(\n  <React.StrictMode>\n    <ApolloProvider client={client}>\n      <App />\n    </ApolloProvider>\n  </React.StrictMode>\n);\n"
  },
  {
    "path": "examples/react/apollo-client-defer/src/yoga.mjs",
    "content": "import { createSchema, createYoga } from 'graphql-yoga';\nimport { useDeferStream } from '@graphql-yoga/plugin-defer-stream';\nimport { createServer } from 'node:http';\n\nconst typeDefs = /* GraphQL */ `\n  type Query {\n    alphabet: [String!]!\n    \"\"\"\n    A field that resolves fast.\n    \"\"\"\n    fastField: String!\n\n    \"\"\"\n    A field that resolves slowly.\n    Maybe you want to @defer this field ;)\n    \"\"\"\n    slowField(waitFor: Int! = 5000): String!\n  }\n`;\n\nconst wait = time => new Promise(resolve => setTimeout(resolve, time));\n\nconst resolvers = {\n  Query: {\n    async *alphabet() {\n      for (const character of ['a', 'b', 'c', 'd', 'e', 'f', 'g']) {\n        yield character;\n        await wait(1000);\n      }\n    },\n    fastField: async () => {\n      await wait(100);\n      return 'I am speed';\n    },\n    slowField: async (_, { waitFor }) => {\n      await wait(waitFor);\n      return 'I am slow';\n    },\n  },\n};\n\nexport const yoga = createYoga({\n  schema: createSchema({\n    typeDefs,\n    resolvers,\n  }),\n  plugins: [useDeferStream()],\n});\n\nconst server = createServer(yoga);\n\nserver.listen(4000, () => {\n  // eslint-disable-next-line no-console\n  console.info('Server is running on http://localhost:4000/graphql');\n});\n"
  },
  {
    "path": "examples/react/apollo-client-defer/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"esModuleInterop\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n    \"skipLibCheck\": true,\n    \"noEmit\": true,\n    \"noUncheckedIndexedAccess\": true\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.d.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "examples/react/apollo-client-defer/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "examples/react/apollo-client-defer/vite.config.ts",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n});\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.swc\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/README.md",
    "content": "# Apollo Client Vite SWR Example\n\nExample of using the SWC plugin for smaller bundle size.\n\n```bash\nyarn dev\n```\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/codegen.ts",
    "content": "import { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.tsx', '!src/gql/**/*'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite App</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/package.json",
    "content": "{\n  \"name\": \"example-apollo-client-swc-plugin\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@apollo/client\": \"^3.7.10\",\n    \"react\": \"18.3.1\",\n    \"react-dom\": \"18.3.1\"\n  },\n  \"devDependencies\": {\n    \"@graphql-codegen/client-preset-swc-plugin\": \"0.2.0\",\n    \"@graphql-codegen/cli\": \"^6.2.1\",\n    \"@vitejs/plugin-react-swc\": \"^3.3.0\",\n    \"@types/react\": \"18.3.3\",\n    \"@types/react-dom\": \"18.3.0\",\n    \"typescript\": \"5.5.4\",\n    \"vite\": \"^6.0.0\"\n  },\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"test\": \"node scripts/test.js\",\n    \"test:end2end\": \"exit 0\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\"\n  }\n}\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/src/App.css",
    "content": ".App {\n  text-align: center;\n}\n\n.App-logo {\n  height: 40vmin;\n  pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  .App-logo {\n    animation: App-logo-spin infinite 20s linear;\n  }\n}\n\n.App-header {\n  background-color: #282c34;\n  min-height: 100vh;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  font-size: calc(10px + 2vmin);\n  color: white;\n}\n\n.App-link {\n  color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/src/App.tsx",
    "content": "import { useQuery } from '@apollo/client';\n\nimport './App.css';\nimport Film from './Film';\nimport { graphql } from './gql';\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`);\n\nfunction App() {\n  const { data } = useQuery(allFilmsWithVariablesQueryDocument, { variables: { first: 10 } });\n  return (\n    <div className=\"App\">\n      {data && <ul>{data.allFilms?.edges?.map((e, i) => e?.node && <Film film={e?.node} key={`film-${i}`} />)}</ul>}\n    </div>\n  );\n}\n\nexport default App;\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/src/Film.tsx",
    "content": "import { FragmentType, useFragment } from './gql/fragment-masking';\nimport { graphql } from './gql';\n\nexport const FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`);\n\nconst Film = (props: { film: FragmentType<typeof FilmFragment> }) => {\n  const film = useFragment(FilmFragment, props.film);\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  );\n};\n\nexport default Film;\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllFilmsWithVariablesQueryDocument;\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n': typeof types.FilmItemFragmentDoc;\n};\nconst documents: Documents = {\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllFilmsWithVariablesQueryDocument,\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n':\n    types.FilmItemFragmentDoc,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'\n): (typeof documents)['\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type AllFilmsWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllFilmsWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allFilms?: {\n    __typename?: 'FilmsConnection';\n    edges?: Array<{\n      __typename?: 'FilmsEdge';\n      node?: ({ __typename?: 'Film' } & { ' $fragmentRefs'?: { FilmItemFragment: FilmItemFragment } }) | null;\n    } | null> | null;\n  } | null;\n};\n\nexport type FilmItemFragment = {\n  __typename?: 'Film';\n  id: string;\n  title?: string | null;\n  releaseDate?: string | null;\n  producers?: Array<string | null> | null;\n} & { ' $fragmentName'?: 'FilmItemFragment' };\n\nexport const FilmItemFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FilmItemFragment, unknown>;\nexport const AllFilmsWithVariablesQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'allFilmsWithVariablesQuery' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'allFilms' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'first' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'edges' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      {\n                        kind: 'Field',\n                        name: { kind: 'Name', value: 'node' },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'FilmItem' } }],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<AllFilmsWithVariablesQueryQuery, AllFilmsWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/src/main.css",
    "content": "body {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans',\n    'Droid Sans', 'Helvetica Neue', sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;\n}\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/src/main.tsx",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './main.css';\nimport App from './App';\nimport { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';\n\nconst client = new ApolloClient({\n  uri: 'https://graphql.org/graphql/',\n  cache: new InMemoryCache(),\n});\n\nconst root = ReactDOM.createRoot(document.getElementById('app') as HTMLElement);\nroot.render(\n  <React.StrictMode>\n    <ApolloProvider client={client}>\n      <App />\n    </ApolloProvider>\n  </React.StrictMode>\n);\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"esModuleInterop\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n    \"skipLibCheck\": true,\n    \"noEmit\": true\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.d.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.mts\"]\n}\n"
  },
  {
    "path": "examples/react/apollo-client-swc-plugin/vite.config.mts",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react-swc';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [\n    react({\n      plugins: [\n        ['@graphql-codegen/client-preset-swc-plugin', { artifactDirectory: './src/gql', gqlTagName: 'graphql' }],\n      ],\n    }),\n  ],\n});\n"
  },
  {
    "path": "examples/react/http-executor/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": "examples/react/http-executor/README.md",
    "content": "# Using GraphQL Code Generator with `graphql-request` and React\n\nThis example illustrates how to use GraphQL Code Generator in a React application using the `graphql-request` GraphQL Client.\n\nYou will find the TypeScript-based codegen configuration in [`codegen.ts`](./codegen.ts).\n\nThis simple codegen configuration generates types and helpers in the [`src/gql`](./src/gql/) folder that help you to get typed GraphQL Queries and Mutations seamlessly ⚡️\n\n<br />\n\nFor a step-by-step implementation tutorial, please refer to the related guide:\n\nhttps://www.the-guild.dev/graphql/codegen/docs/guides/react-vue-angular\n\n--\n\nPlease note that the `client` preset used in this example is compatible with `graphql-request` from `5.0`.\n"
  },
  {
    "path": "examples/react/http-executor/codegen.ts",
    "content": "import { type CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/react/http-executor/cypress/e2e/end2end.cy.ts",
    "content": "describe('template spec', () => {\n  it('renders everything correctly', () => {\n    cy.visit('http://localhost:3000');\n    cy.get('h3').should('contain', 'A New Hope');\n  });\n});\n"
  },
  {
    "path": "examples/react/http-executor/cypress/support/commands.ts",
    "content": "/// <reference types=\"cypress\" />\n"
  },
  {
    "path": "examples/react/http-executor/cypress/support/e2e.ts",
    "content": "import './commands';\n"
  },
  {
    "path": "examples/react/http-executor/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(_on, _config) {\n      // implement node event listeners here\n    },\n  },\n});\n"
  },
  {
    "path": "examples/react/http-executor/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite App</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/react/http-executor/package.json",
    "content": "{\n  \"name\": \"example-react-graphql-request\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@graphql-tools/executor-http\": \"^3.0.0\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\"\n  },\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^6.2.1\",\n    \"@vitejs/plugin-react\": \"^5.0.0\",\n    \"@types/node\": \"^22.0.0\",\n    \"@types/react\": \"^18.0.17\",\n    \"@types/react-dom\": \"^18.0.10\",\n    \"typescript\": \"5.5.4\",\n    \"serve\": \"14.2.3\",\n    \"cypress\": \"15.7.1\",\n    \"start-server-and-test\": \"2.0.5\",\n    \"vite\": \"^6.0.0\"\n  },\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"start\": \"serve -s dist\",\n    \"test\": \"cypress run\",\n    \"test:end2end\": \"start-server-and-test start http://localhost:3000 test\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\"\n  }\n}\n"
  },
  {
    "path": "examples/react/http-executor/src/App.css",
    "content": ".App {\n  text-align: center;\n}\n\n.App-logo {\n  height: 40vmin;\n  pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  .App-logo {\n    animation: App-logo-spin infinite 20s linear;\n  }\n}\n\n.App-header {\n  background-color: #282c34;\n  min-height: 100vh;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  font-size: calc(10px + 2vmin);\n  color: white;\n}\n\n.App-link {\n  color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "examples/react/http-executor/src/App.tsx",
    "content": "import { useEffect, useState } from 'react';\nimport { buildHTTPExecutor } from '@graphql-tools/executor-http';\nimport './App.css';\nimport Film from './Film';\nimport { graphql, DocumentType } from './gql';\n\nconst executor = buildHTTPExecutor({\n  endpoint: 'https://graphql.org/graphql/',\n});\n\nconst AllFilmsWithVariablesQuery = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`);\n\n// we could also define a client:\n// `const client = new GraphQLClient('https://graphql.org/graphql/')`\n// and use:\n// `client.request(allFilmsWithVariablesQueryDocument, { first: 10 })`\n\nfunction App() {\n  const [data, setData] = useState<DocumentType<typeof AllFilmsWithVariablesQuery>>();\n\n  useEffect(() => {\n    executor({\n      document: AllFilmsWithVariablesQuery,\n      variables: {\n        first: 10,\n      },\n    }).then(result => {\n      if ('data' in result) {\n        setData(result.data!);\n      }\n    });\n  }, []);\n\n  return (\n    <div className=\"App\">\n      {data && <ul>{data.allFilms?.edges?.map((e, i) => e?.node && <Film film={e?.node} key={`film-${i}`} />)}</ul>}\n    </div>\n  );\n}\n\nexport default App;\n"
  },
  {
    "path": "examples/react/http-executor/src/Film.tsx",
    "content": "import { FragmentType, useFragment, graphql } from './gql';\n\nexport const FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`);\n\nconst Film = (props: {\n  /* tweet property has the correct type 🎉 */\n  film: FragmentType<typeof FilmFragment>;\n}) => {\n  const film = useFragment(FilmFragment, props.film);\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  );\n};\n\nexport default Film;\n"
  },
  {
    "path": "examples/react/http-executor/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/react/http-executor/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllFilmsWithVariablesQueryDocument;\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n': typeof types.FilmItemFragmentDoc;\n};\nconst documents: Documents = {\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllFilmsWithVariablesQueryDocument,\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n':\n    types.FilmItemFragmentDoc,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'\n): (typeof documents)['\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/react/http-executor/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type AllFilmsWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllFilmsWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allFilms?: {\n    __typename?: 'FilmsConnection';\n    edges?: Array<{\n      __typename?: 'FilmsEdge';\n      node?: ({ __typename?: 'Film' } & { ' $fragmentRefs'?: { FilmItemFragment: FilmItemFragment } }) | null;\n    } | null> | null;\n  } | null;\n};\n\nexport type FilmItemFragment = {\n  __typename?: 'Film';\n  id: string;\n  title?: string | null;\n  releaseDate?: string | null;\n  producers?: Array<string | null> | null;\n} & { ' $fragmentName'?: 'FilmItemFragment' };\n\nexport const FilmItemFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FilmItemFragment, unknown>;\nexport const AllFilmsWithVariablesQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'allFilmsWithVariablesQuery' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'allFilms' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'first' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'edges' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      {\n                        kind: 'Field',\n                        name: { kind: 'Name', value: 'node' },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'FilmItem' } }],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<AllFilmsWithVariablesQueryQuery, AllFilmsWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/react/http-executor/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/react/http-executor/src/main.css",
    "content": "body {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans',\n    'Droid Sans', 'Helvetica Neue', sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;\n}\n"
  },
  {
    "path": "examples/react/http-executor/src/main.tsx",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './main.css';\nimport App from './App';\n\nconst root = ReactDOM.createRoot(document.getElementById('app') as HTMLElement);\nroot.render(\n  <React.StrictMode>\n    <App />\n  </React.StrictMode>\n);\n"
  },
  {
    "path": "examples/react/http-executor/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"esModuleInterop\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n    \"skipLibCheck\": true,\n    \"noEmit\": true\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.d.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "examples/react/http-executor/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "examples/react/http-executor/vite.config.ts",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n});\n"
  },
  {
    "path": "examples/react/nextjs-swr/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n.pnpm-debug.log*\n\n# local env files\n.env*.local\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n"
  },
  {
    "path": "examples/react/nextjs-swr/README.md",
    "content": "# Using GraphQL Code Generator with SWR and React\n\nThis example illustrates using GraphQL Code Generator in a React application using SWR with `graphql-request` as a GraphQL Client.\n\nYou will find the TypeScript-based codegen configuration in [`codegen.ts`](./codegen.ts).\n\nThis simple codegen configuration generates types and helpers in the [`src/gql`](./src/gql/) folder that help you to get typed GraphQL Queries and Mutations seamlessly ⚡️\n\n<br />\n\nFor a step-by-step implementation tutorial, please refer to the related guide:\n\nhttps://www.the-guild.dev/graphql/codegen/docs/guides/react-vue-angular\n\n--\n\nPlease note that the `client` preset used in this example is compatible with `graphql-request` from `5.0` as SWR fetcher.\n\nFor indications in writing your fetcher, [please refer to our documentation](https://www.the-guild.dev/graphql/codegen/docs/guides/react-vue-angular#appendix-i-react-query-with-a-custom-fetcher-setup).\n"
  },
  {
    "path": "examples/react/nextjs-swr/codegen.ts",
    "content": "import { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['components/**/*.tsx', 'pages/**/*.tsx'],\n  generates: {\n    './gql/': {\n      preset: 'client',\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/react/nextjs-swr/components/Film.tsx",
    "content": "import { FragmentType, useFragment } from '../gql/fragment-masking';\nimport { graphql } from '../gql/gql';\n\nexport const FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`);\n\nconst Film = (props: {\n  /* tweet property has the correct type 🎉 */\n  film: FragmentType<typeof FilmFragment>;\n}) => {\n  const film = useFragment(FilmFragment, props.film);\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  );\n};\n\nexport default Film;\n"
  },
  {
    "path": "examples/react/nextjs-swr/cypress/e2e/end2end.cy.ts",
    "content": "describe('template spec', () => {\n  it('renders everything correctly', () => {\n    cy.visit('http://localhost:3000');\n    cy.get('h3').should('contain', 'A New Hope');\n  });\n});\n\n// lol, this is a hack to make the file a module and nextjs build happy\nexport {};\n"
  },
  {
    "path": "examples/react/nextjs-swr/cypress/support/commands.ts",
    "content": "/// <reference types=\"cypress\" />\nexport {};\n"
  },
  {
    "path": "examples/react/nextjs-swr/cypress/support/e2e.ts",
    "content": "import './commands';\n"
  },
  {
    "path": "examples/react/nextjs-swr/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(_on, _config) {\n      // implement node event listeners here\n    },\n  },\n});\n"
  },
  {
    "path": "examples/react/nextjs-swr/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/react/nextjs-swr/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n': typeof types.FilmItemFragmentDoc;\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllFilmsWithVariablesQueryDocument;\n};\nconst documents: Documents = {\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n':\n    types.FilmItemFragmentDoc,\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllFilmsWithVariablesQueryDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'\n): (typeof documents)['\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/react/nextjs-swr/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type FilmItemFragment = {\n  __typename?: 'Film';\n  id: string;\n  title?: string | null;\n  releaseDate?: string | null;\n  producers?: Array<string | null> | null;\n} & { ' $fragmentName'?: 'FilmItemFragment' };\n\nexport type AllFilmsWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllFilmsWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allFilms?: {\n    __typename?: 'FilmsConnection';\n    edges?: Array<{\n      __typename?: 'FilmsEdge';\n      node?: ({ __typename?: 'Film' } & { ' $fragmentRefs'?: { FilmItemFragment: FilmItemFragment } }) | null;\n    } | null> | null;\n  } | null;\n};\n\nexport const FilmItemFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FilmItemFragment, unknown>;\nexport const AllFilmsWithVariablesQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'allFilmsWithVariablesQuery' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'allFilms' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'first' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'edges' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      {\n                        kind: 'Field',\n                        name: { kind: 'Name', value: 'node' },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'FilmItem' } }],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<AllFilmsWithVariablesQueryQuery, AllFilmsWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/react/nextjs-swr/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/react/nextjs-swr/hooks/use-query.ts",
    "content": "import { buildHTTPExecutor } from '@graphql-tools/executor-http';\nimport { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { ASTNode, ExecutionResult, Kind, OperationDefinitionNode } from 'graphql';\nimport useSWR from 'swr';\n\nconst executor = buildHTTPExecutor({\n  endpoint: 'https://graphql.org/graphql/',\n});\n\nconst isOperationDefinition = (def: ASTNode): def is OperationDefinitionNode => def.kind === Kind.OPERATION_DEFINITION;\n\nexport function useGraphQL<TResult, TVariables>(\n  document: TypedDocumentNode<TResult, TVariables>,\n  ...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]\n) {\n  return useSWR(\n    [\n      // This logic can be customized as desired\n      document.definitions.find(isOperationDefinition)?.name,\n      variables,\n    ] as const,\n    async ([_key, variables]: any) =>\n      executor({\n        document,\n        variables,\n      }) as Promise<ExecutionResult<TResult>>\n  );\n}\n"
  },
  {
    "path": "examples/react/nextjs-swr/next.config.js",
    "content": "/** @type {import('next').NextConfig} */\nconst nextConfig = {\n  reactStrictMode: true,\n  swcMinify: true,\n  experimental: {\n    swcPlugins: [['@graphql-codegen/client-preset-swc-plugin', { artifactDirectory: './gql', gqlTagName: 'graphql' }]],\n  },\n};\n\nmodule.exports = nextConfig;\n"
  },
  {
    "path": "examples/react/nextjs-swr/package.json",
    "content": "{\n  \"name\": \"example-react-nextjs-swr\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"next dev\",\n    \"build\": \"next build\",\n    \"start\": \"next start\",\n    \"lint\": \"next lint\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\",\n    \"test\": \"cypress run\",\n    \"test:end2end\": \"start-server-and-test start http://127.0.0.1:3000 test\"\n  },\n  \"dependencies\": {\n    \"@graphql-tools/executor-http\": \"^3.0.0\",\n    \"next\": \"13.5.11\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"swr\": \"^2.0.0\"\n  },\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^6.2.1\",\n    \"@graphql-codegen/schema-ast\": \"5.0.1\",\n    \"@graphql-codegen/client-preset-swc-plugin\": \"0.2.0\",\n    \"@types/node\": \"^22.0.0\",\n    \"@types/react\": \"^18.0.17\",\n    \"@types/react-dom\": \"^18.0.10\",\n    \"eslint\": \"^9.0.0\",\n    \"eslint-config-next\": \"^13.0.0\",\n    \"typescript\": \"5.5.4\"\n  }\n}\n"
  },
  {
    "path": "examples/react/nextjs-swr/pages/_app.tsx",
    "content": "import '../styles/globals.css';\nimport type { AppProps } from 'next/app';\n\nfunction MyApp({ Component, pageProps }: AppProps) {\n  return <Component {...pageProps} />;\n}\n\nexport default MyApp;\n"
  },
  {
    "path": "examples/react/nextjs-swr/pages/api/hello.ts",
    "content": "// Next.js API route support: https://nextjs.org/docs/api-routes/introduction\nimport type { NextApiRequest, NextApiResponse } from 'next';\n\ntype Data = {\n  name: string;\n};\n\nexport default function handler(req: NextApiRequest, res: NextApiResponse<Data>) {\n  res.status(200).json({ name: 'John Doe' });\n}\n"
  },
  {
    "path": "examples/react/nextjs-swr/pages/index.tsx",
    "content": "import type { NextPage } from 'next';\n\nimport { graphql } from '../gql';\n\nimport styles from '../styles/Home.module.css';\nimport Film from '../components/Film';\nimport { useGraphQL } from '../hooks/use-query';\n\nconst AllFilmsWithVariablesQuery = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`);\n\nconst Home: NextPage = () => {\n  const { data } = useGraphQL(AllFilmsWithVariablesQuery, { first: 10 });\n  return (\n    <div className={styles.container}>\n      <main className={styles.main}>\n        {data && (\n          <ul>{data.data?.allFilms?.edges?.map((e, i) => e?.node && <Film film={e?.node} key={`film-${i}`} />)}</ul>\n        )}\n      </main>\n    </div>\n  );\n};\n\nexport default Home;\n"
  },
  {
    "path": "examples/react/nextjs-swr/styles/Home.module.css",
    "content": ".container {\n  padding: 0 2rem;\n}\n\n.main {\n  min-height: 100vh;\n  padding: 4rem 0;\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n}\n\n.footer {\n  display: flex;\n  flex: 1;\n  padding: 2rem 0;\n  border-top: 1px solid #eaeaea;\n  justify-content: center;\n  align-items: center;\n}\n\n.footer a {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  flex-grow: 1;\n}\n\n.title a {\n  color: #0070f3;\n  text-decoration: none;\n}\n\n.title a:hover,\n.title a:focus,\n.title a:active {\n  text-decoration: underline;\n}\n\n.title {\n  margin: 0;\n  line-height: 1.15;\n  font-size: 4rem;\n}\n\n.title,\n.description {\n  text-align: center;\n}\n\n.description {\n  margin: 4rem 0;\n  line-height: 1.5;\n  font-size: 1.5rem;\n}\n\n.code {\n  background: #fafafa;\n  border-radius: 5px;\n  padding: 0.75rem;\n  font-size: 1.1rem;\n  font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New,\n    monospace;\n}\n\n.grid {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-wrap: wrap;\n  max-width: 800px;\n}\n\n.card {\n  margin: 1rem;\n  padding: 1.5rem;\n  text-align: left;\n  color: inherit;\n  text-decoration: none;\n  border: 1px solid #eaeaea;\n  border-radius: 10px;\n  transition: color 0.15s ease, border-color 0.15s ease;\n  max-width: 300px;\n}\n\n.card:hover,\n.card:focus,\n.card:active {\n  color: #0070f3;\n  border-color: #0070f3;\n}\n\n.card h2 {\n  margin: 0 0 1rem 0;\n  font-size: 1.5rem;\n}\n\n.card p {\n  margin: 0;\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.logo {\n  height: 1em;\n  margin-left: 0.5rem;\n}\n\n@media (max-width: 600px) {\n  .grid {\n    width: 100%;\n    flex-direction: column;\n  }\n}\n\n@media (prefers-color-scheme: dark) {\n  .card,\n  .footer {\n    border-color: #222;\n  }\n  .code {\n    background: #111;\n  }\n  .logo img {\n    filter: invert(1);\n  }\n}\n"
  },
  {
    "path": "examples/react/nextjs-swr/styles/globals.css",
    "content": "html,\nbody {\n  padding: 0;\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans,\n    Helvetica Neue, sans-serif;\n}\n\na {\n  color: inherit;\n  text-decoration: none;\n}\n\n* {\n  box-sizing: border-box;\n}\n\n@media (prefers-color-scheme: dark) {\n  html {\n    color-scheme: dark;\n  }\n  body {\n    color: white;\n    background: black;\n  }\n}\n"
  },
  {
    "path": "examples/react/nextjs-swr/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"preserve\",\n    \"incremental\": true,\n    \"allowJs\": false\n  },\n  \"include\": [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "examples/react/tanstack-react-query/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": "examples/react/tanstack-react-query/README.md",
    "content": "# Using GraphQL Code Generator with React Query and React\n\nThis example illustrates using GraphQL Code Generator in a React application using React Query with `graphql-request` as a GraphQL Client.\n\nYou will find the TypeScript-based codegen configuration in [`codegen.ts`](./codegen.ts).\n\nThis simple codegen configuration generates types and helpers in the [`src/gql`](./src/gql/) folder that help you to get typed GraphQL Queries and Mutations seamlessly ⚡️\n\n<br />\n\nFor a step-by-step implementation tutorial, please refer to the related guide:\n\nhttps://www.the-guild.dev/graphql/codegen/docs/guides/react-vue-angular\n\n--\n\nPlease note that the `client` preset used in this example is compatible with `graphql-request` from `5.0` as React Query fetcher.\n\nFor indications in writing your fetcher, [please refer to our documentation](https://www.the-guild.dev/graphql/codegen/docs/guides/react-vue-angular#appendix-i-react-query-with-a-custom-fetcher-setup).\n"
  },
  {
    "path": "examples/react/tanstack-react-query/codegen.ts",
    "content": "import { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.tsx', '!src/gql/**/*'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      config: {\n        documentMode: 'string',\n      },\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/react/tanstack-react-query/cypress/e2e/end2end.cy.ts",
    "content": "describe('template spec', () => {\n  it('renders everything correctly', () => {\n    cy.visit('http://localhost:3000');\n    cy.get('h3').should('contain', 'A New Hope');\n  });\n});\n"
  },
  {
    "path": "examples/react/tanstack-react-query/cypress/support/commands.ts",
    "content": "/// <reference types=\"cypress\" />\n"
  },
  {
    "path": "examples/react/tanstack-react-query/cypress/support/e2e.ts",
    "content": "import './commands';\n"
  },
  {
    "path": "examples/react/tanstack-react-query/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(_on, _config) {\n      // implement node event listeners here\n    },\n  },\n});\n"
  },
  {
    "path": "examples/react/tanstack-react-query/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite App</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/react/tanstack-react-query/package.json",
    "content": "{\n  \"name\": \"example-react-tanstack-react-query\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@tanstack/react-query\": \"4.36.1\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\"\n  },\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^6.2.1\",\n    \"@vitejs/plugin-react\": \"^5.0.0\",\n    \"@types/node\": \"^22.0.0\",\n    \"@types/react\": \"^18.0.17\",\n    \"@types/react-dom\": \"^18.0.10\",\n    \"typescript\": \"5.5.4\",\n    \"serve\": \"14.2.3\",\n    \"cypress\": \"15.7.1\",\n    \"start-server-and-test\": \"2.0.5\",\n    \"vite\": \"^6.0.0\"\n  },\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"start\": \"serve -s dist\",\n    \"test\": \"cypress run\",\n    \"test:end2end\": \"start-server-and-test start http://localhost:3000 test\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\"\n  }\n}\n"
  },
  {
    "path": "examples/react/tanstack-react-query/src/App.css",
    "content": ".App {\n  text-align: center;\n}\n\n.App-logo {\n  height: 40vmin;\n  pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  .App-logo {\n    animation: App-logo-spin infinite 20s linear;\n  }\n}\n\n.App-header {\n  background-color: #282c34;\n  min-height: 100vh;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  font-size: calc(10px + 2vmin);\n  color: white;\n}\n\n.App-link {\n  color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "examples/react/tanstack-react-query/src/App.tsx",
    "content": "import './App.css';\nimport Film from './Film';\nimport { graphql } from './gql';\nimport { useGraphQL } from './use-graphql';\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`);\n\nfunction App() {\n  const { data } = useGraphQL(allFilmsWithVariablesQueryDocument, { first: 10 });\n\n  return (\n    <div className=\"App\">\n      {data && (\n        <ul>{data.data?.allFilms?.edges?.map((e, i) => e?.node && <Film film={e?.node} key={`film-${i}`} />)}</ul>\n      )}\n    </div>\n  );\n}\n\nexport default App;\n"
  },
  {
    "path": "examples/react/tanstack-react-query/src/Film.tsx",
    "content": "import { graphql, FragmentType, useFragment } from './gql';\n\nexport const FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`);\n\nconst Film = (props: {\n  /* tweet property has the correct type 🎉 */\n  film: FragmentType<typeof FilmFragment>;\n}) => {\n  const film = useFragment(FilmFragment, props.film);\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  );\n};\n\nexport default Film;\n"
  },
  {
    "path": "examples/react/tanstack-react-query/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration } from '@graphql-typed-document-node/core';\nimport { Incremental, TypedDocumentString } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: TypedDocumentString<TQuery, any>,\n  fragmentNode: TypedDocumentString<TFrag, any>,\n  data: FragmentType<TypedDocumentString<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = queryNode.__meta__?.deferredFields as Record<string, (keyof TFrag)[]>;\n  const fragName = fragmentNode.__meta__?.fragmentName as string | undefined;\n\n  if (!deferredFields || !fragName) return true;\n\n  const fields = deferredFields[fragName] ?? [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/react/tanstack-react-query/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllFilmsWithVariablesQueryDocument;\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n': typeof types.FilmItemFragmentDoc;\n};\nconst documents: Documents = {\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllFilmsWithVariablesQueryDocument,\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n':\n    types.FilmItemFragmentDoc,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'\n): typeof import('./graphql').AllFilmsWithVariablesQueryDocument;\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'\n): typeof import('./graphql').FilmItemFragmentDoc;\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n"
  },
  {
    "path": "examples/react/tanstack-react-query/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { DocumentTypeDecoration } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type AllFilmsWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllFilmsWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allFilms?: {\n    __typename?: 'FilmsConnection';\n    edges?: Array<{\n      __typename?: 'FilmsEdge';\n      node?: ({ __typename?: 'Film' } & { ' $fragmentRefs'?: { FilmItemFragment: FilmItemFragment } }) | null;\n    } | null> | null;\n  } | null;\n};\n\nexport type FilmItemFragment = {\n  __typename?: 'Film';\n  id: string;\n  title?: string | null;\n  releaseDate?: string | null;\n  producers?: Array<string | null> | null;\n} & { ' $fragmentName'?: 'FilmItemFragment' };\n\nexport class TypedDocumentString<TResult, TVariables>\n  extends String\n  implements DocumentTypeDecoration<TResult, TVariables>\n{\n  __apiType?: NonNullable<DocumentTypeDecoration<TResult, TVariables>['__apiType']>;\n  private value: string;\n  public __meta__?: Record<string, any> | undefined;\n\n  constructor(value: string, __meta__?: Record<string, any> | undefined) {\n    super(value);\n    this.value = value;\n    this.__meta__ = __meta__;\n  }\n\n  override toString(): string & DocumentTypeDecoration<TResult, TVariables> {\n    return this.value;\n  }\n}\nexport const FilmItemFragmentDoc = new TypedDocumentString(\n  `\n    fragment FilmItem on Film {\n  id\n  title\n  releaseDate\n  producers\n}\n    `,\n  { fragmentName: 'FilmItem' }\n) as unknown as TypedDocumentString<FilmItemFragment, unknown>;\nexport const AllFilmsWithVariablesQueryDocument = new TypedDocumentString(`\n    query allFilmsWithVariablesQuery($first: Int!) {\n  allFilms(first: $first) {\n    edges {\n      node {\n        ...FilmItem\n      }\n    }\n  }\n}\n    fragment FilmItem on Film {\n  id\n  title\n  releaseDate\n  producers\n}`) as unknown as TypedDocumentString<AllFilmsWithVariablesQueryQuery, AllFilmsWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/react/tanstack-react-query/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/react/tanstack-react-query/src/main.css",
    "content": "body {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans',\n    'Droid Sans', 'Helvetica Neue', sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;\n}\n"
  },
  {
    "path": "examples/react/tanstack-react-query/src/main.tsx",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './main.css';\nimport App from './App';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nconst queryClient = new QueryClient();\n\nconst root = ReactDOM.createRoot(document.getElementById('app') as HTMLElement);\nroot.render(\n  <React.StrictMode>\n    <QueryClientProvider client={queryClient}>\n      <App />\n    </QueryClientProvider>\n  </React.StrictMode>\n);\n"
  },
  {
    "path": "examples/react/tanstack-react-query/src/use-graphql.ts",
    "content": "import { ExecutionResult } from 'graphql';\nimport { useQuery } from '@tanstack/react-query';\nimport { TypedDocumentString } from './gql/graphql';\n\nexport function useGraphQL<TResult, TVariables>(\n  document: TypedDocumentString<TResult, TVariables>,\n  ...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]\n) {\n  return useQuery(\n    [\n      // This logic can be customized as desired\n      document,\n      variables,\n    ] as const,\n    async ({ queryKey }) => {\n      return fetch('https://graphql.org/graphql/', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({\n          query: queryKey[0].toString(),\n          variables: queryKey[1],\n        }),\n      }).then(response => response.json()) as Promise<ExecutionResult<TResult>>;\n    }\n  );\n}\n"
  },
  {
    "path": "examples/react/tanstack-react-query/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"esModuleInterop\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n    \"skipLibCheck\": true,\n    \"noEmit\": true\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.d.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "examples/react/tanstack-react-query/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "examples/react/tanstack-react-query/vite.config.ts",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n});\n"
  },
  {
    "path": "examples/react/urql/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": "examples/react/urql/README.md",
    "content": "# Using GraphQL Code Generator with URQL and React\n\nThis example illustrates using GraphQL Code Generator in a React application using the URQL GraphQL Client.\n\nYou will find the TypeScript-based codegen configuration in [`codegen.ts`](./codegen.ts).\n\nThis simple codegen configuration generates types and helpers in the [`src/gql`](./src/gql/) folder that help you to get typed GraphQL Queries and Mutations seamlessly ⚡️\n\n<br />\n\nFor a step-by-step implementation tutorial, please refer to the related guide:\n\nhttps://www.the-guild.dev/graphql/codegen/docs/guides/react-vue-angular\n\n--\n\nPlease note that the `client` preset used in this example is compatible with `@urql/core` (since `1.15.0`), `@urql/preact` (since `1.4.0`) and `urql` (since `1.11.0`).\n"
  },
  {
    "path": "examples/react/urql/codegen.ts",
    "content": "import { type CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.tsx', '!src/gql/**/*'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      config: {\n        documentMode: 'string',\n      },\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/react/urql/cypress/e2e/end2end.cy.ts",
    "content": "describe('template spec', () => {\n  it('renders everything correctly', () => {\n    cy.visit('http://localhost:3000');\n    cy.get('h3').should('contain', 'A New Hope');\n  });\n});\n"
  },
  {
    "path": "examples/react/urql/cypress/support/commands.ts",
    "content": "/// <reference types=\"cypress\" />\n"
  },
  {
    "path": "examples/react/urql/cypress/support/e2e.ts",
    "content": "import './commands';\n"
  },
  {
    "path": "examples/react/urql/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(_on, _config) {\n      // implement node event listeners here\n    },\n  },\n});\n"
  },
  {
    "path": "examples/react/urql/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite App</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/react/urql/package.json",
    "content": "{\n  \"name\": \"example-react-urql\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"urql\": \"^3.0.0\"\n  },\n  \"devDependencies\": {\n    \"@types/react\": \"^18.0.17\",\n    \"@types/react-dom\": \"^18.0.10\",\n    \"@graphql-codegen/cli\": \"^6.2.1\",\n    \"@vitejs/plugin-react\": \"^5.0.0\",\n    \"typescript\": \"5.5.4\",\n    \"serve\": \"14.2.3\",\n    \"cypress\": \"15.7.1\",\n    \"start-server-and-test\": \"2.0.5\",\n    \"vite\": \"^6.0.0\"\n  },\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"start\": \"serve -s dist\",\n    \"test\": \"cypress run\",\n    \"test:end2end\": \"start-server-and-test start http://localhost:3000 test\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\"\n  }\n}\n"
  },
  {
    "path": "examples/react/urql/src/App.css",
    "content": ".App {\n  text-align: center;\n}\n\n.App-logo {\n  height: 40vmin;\n  pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  .App-logo {\n    animation: App-logo-spin infinite 20s linear;\n  }\n}\n\n.App-header {\n  background-color: #282c34;\n  min-height: 100vh;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  font-size: calc(10px + 2vmin);\n  color: white;\n}\n\n.App-link {\n  color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "examples/react/urql/src/App.tsx",
    "content": "import { DocumentTypeDecoration } from '@graphql-typed-document-node/core';\nimport { AnyVariables, OperationContext, RequestPolicy, useQuery, UseQueryResponse } from 'urql';\nimport type { DocumentNode } from 'graphql';\nimport './App.css';\nimport Film from './Film';\nimport { graphql } from './gql';\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery199($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`);\n\ndeclare module 'urql' {\n  // @ts-expect-error this is just temporary until we update types in urql\n  export type UseQueryArgs<Variables extends AnyVariables = AnyVariables, Data = any> = {\n    query: string | DocumentNode | DocumentTypeDecoration<Data, Variables>;\n    requestPolicy?: RequestPolicy;\n    context?: Partial<OperationContext>;\n    pause?: boolean;\n  } & (Variables extends void\n    ? {\n        variables?: Variables;\n      }\n    : Variables extends {\n        [P in keyof Variables]: Variables[P] | null;\n      }\n    ? {\n        variables?: Variables;\n      }\n    : {\n        variables: Variables;\n      });\n\n  export function useQuery<Data = any, Variables extends AnyVariables = AnyVariables>(\n    args: UseQueryArgs<Variables, Data>\n  ): UseQueryResponse<Data, Variables>;\n}\n\nfunction App() {\n  const [{ data }] = useQuery({\n    query: allFilmsWithVariablesQueryDocument.toString(),\n    variables: {\n      first: 10,\n    },\n  });\n\n  return (\n    <div className=\"App\">\n      {data && <ul>{data.allFilms?.edges?.map((e, i) => e?.node && <Film film={e?.node} key={`film-${i}`} />)}</ul>}\n    </div>\n  );\n}\n\nexport default App;\n"
  },
  {
    "path": "examples/react/urql/src/Film.tsx",
    "content": "import { FragmentType, useFragment } from './gql/fragment-masking';\nimport { graphql } from './gql';\n\nexport const FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`);\n\nconst Film = (props: {\n  /* tweet property has the correct type 🎉 */\n  film: FragmentType<typeof FilmFragment>;\n}) => {\n  const film = useFragment(FilmFragment, props.film);\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  );\n};\n\nexport default Film;\n"
  },
  {
    "path": "examples/react/urql/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration } from '@graphql-typed-document-node/core';\nimport { Incremental, TypedDocumentString } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: TypedDocumentString<TQuery, any>,\n  fragmentNode: TypedDocumentString<TFrag, any>,\n  data: FragmentType<TypedDocumentString<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = queryNode.__meta__?.deferredFields as Record<string, (keyof TFrag)[]>;\n  const fragName = fragmentNode.__meta__?.fragmentName as string | undefined;\n\n  if (!deferredFields || !fragName) return true;\n\n  const fields = deferredFields[fragName] ?? [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/react/urql/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  query allFilmsWithVariablesQuery199($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllFilmsWithVariablesQuery199Document;\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n': typeof types.FilmItemFragmentDoc;\n};\nconst documents: Documents = {\n  '\\n  query allFilmsWithVariablesQuery199($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllFilmsWithVariablesQuery199Document,\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n':\n    types.FilmItemFragmentDoc,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query allFilmsWithVariablesQuery199($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'\n): typeof import('./graphql').AllFilmsWithVariablesQuery199Document;\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'\n): typeof import('./graphql').FilmItemFragmentDoc;\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n"
  },
  {
    "path": "examples/react/urql/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { DocumentTypeDecoration } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type AllFilmsWithVariablesQuery199QueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllFilmsWithVariablesQuery199Query = {\n  __typename?: 'Root';\n  allFilms?: {\n    __typename?: 'FilmsConnection';\n    edges?: Array<{\n      __typename?: 'FilmsEdge';\n      node?: ({ __typename?: 'Film' } & { ' $fragmentRefs'?: { FilmItemFragment: FilmItemFragment } }) | null;\n    } | null> | null;\n  } | null;\n};\n\nexport type FilmItemFragment = {\n  __typename?: 'Film';\n  id: string;\n  title?: string | null;\n  releaseDate?: string | null;\n  producers?: Array<string | null> | null;\n} & { ' $fragmentName'?: 'FilmItemFragment' };\n\nexport class TypedDocumentString<TResult, TVariables>\n  extends String\n  implements DocumentTypeDecoration<TResult, TVariables>\n{\n  __apiType?: NonNullable<DocumentTypeDecoration<TResult, TVariables>['__apiType']>;\n  private value: string;\n  public __meta__?: Record<string, any> | undefined;\n\n  constructor(value: string, __meta__?: Record<string, any> | undefined) {\n    super(value);\n    this.value = value;\n    this.__meta__ = __meta__;\n  }\n\n  override toString(): string & DocumentTypeDecoration<TResult, TVariables> {\n    return this.value;\n  }\n}\nexport const FilmItemFragmentDoc = new TypedDocumentString(\n  `\n    fragment FilmItem on Film {\n  id\n  title\n  releaseDate\n  producers\n}\n    `,\n  { fragmentName: 'FilmItem' }\n) as unknown as TypedDocumentString<FilmItemFragment, unknown>;\nexport const AllFilmsWithVariablesQuery199Document = new TypedDocumentString(`\n    query allFilmsWithVariablesQuery199($first: Int!) {\n  allFilms(first: $first) {\n    edges {\n      node {\n        ...FilmItem\n      }\n    }\n  }\n}\n    fragment FilmItem on Film {\n  id\n  title\n  releaseDate\n  producers\n}`) as unknown as TypedDocumentString<AllFilmsWithVariablesQuery199Query, AllFilmsWithVariablesQuery199QueryVariables>;\n"
  },
  {
    "path": "examples/react/urql/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/react/urql/src/main.css",
    "content": "body {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans',\n    'Droid Sans', 'Helvetica Neue', sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;\n}\n"
  },
  {
    "path": "examples/react/urql/src/main.tsx",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport { createClient, Provider } from 'urql';\n\nimport './main.css';\nimport App from './App';\n\nconst client = createClient({\n  url: 'https://graphql.org/graphql/',\n});\n\nconst root = ReactDOM.createRoot(document.getElementById('app') as HTMLElement);\nroot.render(\n  <React.StrictMode>\n    <Provider value={client}>\n      <App />\n    </Provider>\n  </React.StrictMode>\n);\n"
  },
  {
    "path": "examples/react/urql/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "examples/react/urql/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"esModuleInterop\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n    \"skipLibCheck\": true,\n    \"noEmit\": true\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.d.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "examples/react/urql/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "examples/react/urql/vite.config.ts",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n});\n"
  },
  {
    "path": "examples/typescript-esm/README.md",
    "content": "# GraphQL Code Generator usage with TypeScript and ESM\n\n## Usage\n\n```\n# generate code\nyarn codegen\n# run tsc\nyarn build\n# run the tsc output\nyarn start\n```\n\n## Explanation\n\nIn ESM the file extension must be appended to named imports.\nThis can be achieved by setting the codegen config `importExtension` to `'.js'` or `'.ts'` (see `codegen.yml`).\n\nTypeScript introduced a new module resolution algorithm for ESM in version 4.7. We set the `moduleResolution` to `node16` and the (output) module type to `node16` (see `tsconfig.json`).\nAdditionally, within the `package.json` we specify the `type` property with the value `module` in order to instruct Node.js, bundlers and other tools that all `.js` files within this folder should be treated as ESM modules.\n\n## Useful resources\n\n- [ECMAScript Module Support in Node.js - TypeScript 4.7 Changelog](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n- [package.json type module - Node.js documentation](https://nodejs.org/api/packages.html#type)\n- [Named Imports - import MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#named_import)\n"
  },
  {
    "path": "examples/typescript-esm/codegen.cjs",
    "content": "// @ts-check\n\n/** @type {import(\"@graphql-codegen/cli\").CodegenConfig} */\nconst config = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.ts'],\n  emitLegacyCommonJSImports: false,\n  generates: {\n    './src/gql/': {\n      preset: 'client-preset',\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nmodule.exports = config;\n"
  },
  {
    "path": "examples/typescript-esm/package.json",
    "content": "{\n  \"name\": \"example-typescript-esm\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"6.2.1\"\n  },\n  \"dependencies\": {\n    \"@graphql-typed-document-node/core\": \"3.2.0\",\n    \"graphql\": \"16.9.0\"\n  },\n  \"scripts\": {\n    \"codegen\": \"graphql-codegen-esm --config codegen.cjs\",\n    \"build\": \"tsc\",\n    \"start\": \"node dist/main.js\",\n    \"test:end2end\": \"yarn start\"\n  },\n  \"type\": \"module\",\n  \"bob\": false\n}\n"
  },
  {
    "path": "examples/typescript-esm/src/executeOperation.ts",
    "content": "import * as https from 'node:https';\nimport type { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport type { ExecutionResult } from 'graphql';\nimport { print } from 'graphql';\n\nexport function executeOperation<TResult, TVariables>(\n  url: string,\n  operation: TypedDocumentNode<TResult, TVariables>,\n  ...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]\n): Promise<ExecutionResult<TResult>> {\n  return new Promise((resolve, reject) => {\n    const request = https.request(\n      url,\n      { method: 'POST', headers: { 'content-type': 'application/json' } },\n      response => {\n        let data = '';\n        response.on('data', chunk => {\n          data += chunk;\n        });\n        response.on('end', () => {\n          resolve(JSON.parse(data));\n        });\n        response.on('error', reject);\n      }\n    );\n    request.write(\n      JSON.stringify({\n        query: print(operation),\n        variables: variables == null ? undefined : variables,\n      })\n    );\n    request.end();\n  });\n}\n"
  },
  {
    "path": "examples/typescript-esm/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql.js';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/typescript-esm/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql.js';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  query AllPeopleQuery {\\n    allPeople(first: 5) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllPeopleQueryDocument;\n  '\\n  query AllPeopleWithVariablesQuery($first: Int!) {\\n    allPeople(first: $first) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllPeopleWithVariablesQueryDocument;\n};\nconst documents: Documents = {\n  '\\n  query AllPeopleQuery {\\n    allPeople(first: 5) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllPeopleQueryDocument,\n  '\\n  query AllPeopleWithVariablesQuery($first: Int!) {\\n    allPeople(first: $first) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllPeopleWithVariablesQueryDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query AllPeopleQuery {\\n    allPeople(first: 5) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query AllPeopleQuery {\\n    allPeople(first: 5) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query AllPeopleWithVariablesQuery($first: Int!) {\\n    allPeople(first: $first) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query AllPeopleWithVariablesQuery($first: Int!) {\\n    allPeople(first: $first) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/typescript-esm/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type AllPeopleQueryQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type AllPeopleQueryQuery = {\n  __typename?: 'Root';\n  allPeople?: {\n    __typename?: 'PeopleConnection';\n    edges?: Array<{\n      __typename?: 'PeopleEdge';\n      node?: {\n        __typename?: 'Person';\n        name?: string | null;\n        homeworld?: { __typename?: 'Planet'; name?: string | null } | null;\n      } | null;\n    } | null> | null;\n  } | null;\n};\n\nexport type AllPeopleWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllPeopleWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allPeople?: {\n    __typename?: 'PeopleConnection';\n    edges?: Array<{\n      __typename?: 'PeopleEdge';\n      node?: {\n        __typename?: 'Person';\n        name?: string | null;\n        homeworld?: { __typename?: 'Planet'; name?: string | null } | null;\n      } | null;\n    } | null> | null;\n  } | null;\n};\n\nexport const AllPeopleQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'AllPeopleQuery' },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'allPeople' },\n            arguments: [\n              { kind: 'Argument', name: { kind: 'Name', value: 'first' }, value: { kind: 'IntValue', value: '5' } },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'edges' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      {\n                        kind: 'Field',\n                        name: { kind: 'Name', value: 'node' },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [\n                            { kind: 'Field', name: { kind: 'Name', value: 'name' } },\n                            {\n                              kind: 'Field',\n                              name: { kind: 'Name', value: 'homeworld' },\n                              selectionSet: {\n                                kind: 'SelectionSet',\n                                selections: [{ kind: 'Field', name: { kind: 'Name', value: 'name' } }],\n                              },\n                            },\n                          ],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<AllPeopleQueryQuery, AllPeopleQueryQueryVariables>;\nexport const AllPeopleWithVariablesQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'AllPeopleWithVariablesQuery' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'allPeople' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'first' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'edges' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      {\n                        kind: 'Field',\n                        name: { kind: 'Name', value: 'node' },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [\n                            { kind: 'Field', name: { kind: 'Name', value: 'name' } },\n                            {\n                              kind: 'Field',\n                              name: { kind: 'Name', value: 'homeworld' },\n                              selectionSet: {\n                                kind: 'SelectionSet',\n                                selections: [{ kind: 'Field', name: { kind: 'Name', value: 'name' } }],\n                              },\n                            },\n                          ],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<AllPeopleWithVariablesQueryQuery, AllPeopleWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/typescript-esm/src/gql/index.ts",
    "content": "export * from './fragment-masking.js';\nexport * from './gql.js';\n"
  },
  {
    "path": "examples/typescript-esm/src/main.ts",
    "content": "/* eslint-disable no-console */\nimport { executeOperation } from './executeOperation.js';\nimport { graphql } from './gql/index.js';\n\nconst AllPeopleQueryDocument = graphql(/* GraphQL */ `\n  query AllPeopleQuery {\n    allPeople(first: 5) {\n      edges {\n        node {\n          name\n          homeworld {\n            name\n          }\n        }\n      }\n    }\n  }\n`);\n\nconst AllPeopleWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query AllPeopleWithVariablesQuery($first: Int!) {\n    allPeople(first: $first) {\n      edges {\n        node {\n          name\n          homeworld {\n            name\n          }\n        }\n      }\n    }\n  }\n`);\n\nconst apiUrl = 'https://graphql.org/graphql/';\n\nexecuteOperation(apiUrl, AllPeopleQueryDocument).then(res => {\n  if (res.errors) {\n    console.error(res.errors);\n    process.exit(1);\n  }\n\n  console.log(res.data?.allPeople.edges);\n});\n\nexecuteOperation(apiUrl, AllPeopleWithVariablesQueryDocument, { first: 10 }).then(res => {\n  if (res.errors) {\n    console.error(res.errors);\n    process.exit(1);\n  }\n\n  console.log(res.data?.allPeople.edges);\n});\n"
  },
  {
    "path": "examples/typescript-esm/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"moduleResolution\": \"node16\",\n    \"module\": \"node16\",\n    \"outDir\": \"dist\",\n    \"skipLibCheck\": true\n  },\n  \"include\": [\"src/**/*\"]\n}\n"
  },
  {
    "path": "examples/typescript-graphql-request/README.md",
    "content": "# GraphQL Request Example\n\nThis example showcases how to use GraphQL Code Generator for building a type-safe GraphQL schema utilizing the schema definition language first workflow.\n\n## Usage\n\n```\n# generate code\nyarn codegen\n# run the server\nyarn dev\n```\n"
  },
  {
    "path": "examples/typescript-graphql-request/babel.config.js",
    "content": "module.exports = {\n  presets: [\n    ['@babel/preset-env', { targets: { node: process.versions.node.split('.')[0] } }],\n    '@babel/preset-typescript',\n  ],\n};\n"
  },
  {
    "path": "examples/typescript-graphql-request/codegen.ts",
    "content": "import { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.ts'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      config: {\n        documentMode: 'string',\n      },\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/typescript-graphql-request/package.json",
    "content": "{\n  \"name\": \"example-typescript-graphql-request\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"6.2.1\"\n  },\n  \"dependencies\": {\n    \"graphql\": \"16.9.0\",\n    \"graphql-yoga\": \"5.7.0\",\n    \"graphql-request\": \"5.2.0\"\n  },\n  \"scripts\": {\n    \"codegen\": \"graphql-codegen --config codegen.ts\",\n    \"build\": \"tsc\",\n    \"dev\": \"ts-node src/main.ts\",\n    \"test:end2end\": \"vitest --no-watch\"\n  },\n  \"type\": \"commonjs\",\n  \"bob\": false\n}\n"
  },
  {
    "path": "examples/typescript-graphql-request/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration } from '@graphql-typed-document-node/core';\nimport { Incremental, TypedDocumentString } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: TypedDocumentString<TQuery, any>,\n  fragmentNode: TypedDocumentString<TFrag, any>,\n  data: FragmentType<TypedDocumentString<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = queryNode.__meta__?.deferredFields as Record<string, (keyof TFrag)[]>;\n  const fragName = fragmentNode.__meta__?.fragmentName as string | undefined;\n\n  if (!deferredFields || !fragName) return true;\n\n  const fields = deferredFields[fragName] ?? [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/typescript-graphql-request/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  query AllPeopleQuery {\\n    allPeople(first: 5) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllPeopleQueryDocument;\n  '\\n  query AllPeopleWithVariablesQuery($first: Int!) {\\n    allPeople(first: $first) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllPeopleWithVariablesQueryDocument;\n};\nconst documents: Documents = {\n  '\\n  query AllPeopleQuery {\\n    allPeople(first: 5) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllPeopleQueryDocument,\n  '\\n  query AllPeopleWithVariablesQuery($first: Int!) {\\n    allPeople(first: $first) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllPeopleWithVariablesQueryDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query AllPeopleQuery {\\n    allPeople(first: 5) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n'\n): typeof import('./graphql').AllPeopleQueryDocument;\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query AllPeopleWithVariablesQuery($first: Int!) {\\n    allPeople(first: $first) {\\n      edges {\\n        node {\\n          name\\n          homeworld {\\n            name\\n          }\\n        }\\n      }\\n    }\\n  }\\n'\n): typeof import('./graphql').AllPeopleWithVariablesQueryDocument;\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n"
  },
  {
    "path": "examples/typescript-graphql-request/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { DocumentTypeDecoration } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type AllPeopleQueryQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type AllPeopleQueryQuery = {\n  __typename?: 'Root';\n  allPeople?: {\n    __typename?: 'PeopleConnection';\n    edges?: Array<{\n      __typename?: 'PeopleEdge';\n      node?: {\n        __typename?: 'Person';\n        name?: string | null;\n        homeworld?: { __typename?: 'Planet'; name?: string | null } | null;\n      } | null;\n    } | null> | null;\n  } | null;\n};\n\nexport type AllPeopleWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllPeopleWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allPeople?: {\n    __typename?: 'PeopleConnection';\n    edges?: Array<{\n      __typename?: 'PeopleEdge';\n      node?: {\n        __typename?: 'Person';\n        name?: string | null;\n        homeworld?: { __typename?: 'Planet'; name?: string | null } | null;\n      } | null;\n    } | null> | null;\n  } | null;\n};\n\nexport class TypedDocumentString<TResult, TVariables>\n  extends String\n  implements DocumentTypeDecoration<TResult, TVariables>\n{\n  __apiType?: NonNullable<DocumentTypeDecoration<TResult, TVariables>['__apiType']>;\n  private value: string;\n  public __meta__?: Record<string, any> | undefined;\n\n  constructor(value: string, __meta__?: Record<string, any> | undefined) {\n    super(value);\n    this.value = value;\n    this.__meta__ = __meta__;\n  }\n\n  override toString(): string & DocumentTypeDecoration<TResult, TVariables> {\n    return this.value;\n  }\n}\n\nexport const AllPeopleQueryDocument = new TypedDocumentString(`\n    query AllPeopleQuery {\n  allPeople(first: 5) {\n    edges {\n      node {\n        name\n        homeworld {\n          name\n        }\n      }\n    }\n  }\n}\n    `) as unknown as TypedDocumentString<AllPeopleQueryQuery, AllPeopleQueryQueryVariables>;\nexport const AllPeopleWithVariablesQueryDocument = new TypedDocumentString(`\n    query AllPeopleWithVariablesQuery($first: Int!) {\n  allPeople(first: $first) {\n    edges {\n      node {\n        name\n        homeworld {\n          name\n        }\n      }\n    }\n  }\n}\n    `) as unknown as TypedDocumentString<AllPeopleWithVariablesQueryQuery, AllPeopleWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/typescript-graphql-request/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/typescript-graphql-request/src/main.spec.ts",
    "content": "import { describe, it, expect } from 'vitest';\nimport { getPeople } from './main';\n\ndescribe('TypeScript GraphQL Request tests', () => {\n  it('works without variables', async () => {\n    const result = await getPeople();\n    expect(result?.map(o => o?.node?.name)).toContain('Luke Skywalker');\n  });\n\n  it('returns first 3 entries', async () => {\n    const result = await getPeople(3);\n    expect(result).toHaveLength(3);\n  });\n});\n"
  },
  {
    "path": "examples/typescript-graphql-request/src/main.ts",
    "content": "import { GraphQLClient } from 'graphql-request';\nimport { graphql } from './gql';\nimport { AllPeopleQueryQuery } from './gql/graphql';\n\nconst AllPeopleQueryDocument = graphql(/* GraphQL */ `\n  query AllPeopleQuery {\n    allPeople(first: 5) {\n      edges {\n        node {\n          name\n          homeworld {\n            name\n          }\n        }\n      }\n    }\n  }\n`);\n\nconst AllPeopleWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query AllPeopleWithVariablesQuery($first: Int!) {\n    allPeople(first: $first) {\n      edges {\n        node {\n          name\n          homeworld {\n            name\n          }\n        }\n      }\n    }\n  }\n`);\n\nconst apiUrl = 'https://graphql.org/graphql/';\n\nconst client = new GraphQLClient(apiUrl);\n\nexport const getPeople = async (first?: number) => {\n  let res: AllPeopleQueryQuery;\n  if (first) {\n    res = await client.request(AllPeopleWithVariablesQueryDocument.toString(), { first });\n  } else {\n    res = await client.request(AllPeopleQueryDocument.toString());\n  }\n  return res?.allPeople?.edges;\n};\n"
  },
  {
    "path": "examples/typescript-graphql-request/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2020\",\n    \"module\": \"commonjs\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"outDir\": \"dist\"\n  },\n  \"include\": [\"src/**/*.ts\"]\n}\n"
  },
  {
    "path": "examples/typescript-graphql-request/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'examples-typescript-graphql-request',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "examples/typescript-resolvers/README.md",
    "content": "# Typescript Resolvers Example\n\nThis example showcases how to use GraphQL Code Generator for building a type-safe GraphQL schema utilizing the schema definition language first workflow.\n\n## Usage\n\n```\n# generate code\nyarn codegen\n# run the server\nyarn dev\n```\n"
  },
  {
    "path": "examples/typescript-resolvers/codegen.ts",
    "content": "import { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: './src/main.ts',\n  generates: {\n    './src/type-defs.d.ts': {\n      plugins: ['typescript', 'typescript-resolvers'],\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/typescript-resolvers/package.json",
    "content": "{\n  \"name\": \"example-typescript-resolvers\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"6.2.1\",\n    \"@graphql-codegen/typescript\": \"5.0.9\",\n    \"@graphql-codegen/typescript-resolvers\": \"5.1.7\"\n  },\n  \"dependencies\": {\n    \"graphql\": \"16.9.0\",\n    \"graphql-yoga\": \"5.7.0\"\n  },\n  \"scripts\": {\n    \"codegen\": \"graphql-codegen --config codegen.ts\",\n    \"build\": \"tsc\",\n    \"dev\": \"ts-node src/main.ts\",\n    \"test\": \"exit 0\",\n    \"test:end2end\": \"exit 0\"\n  },\n  \"type\": \"commonjs\",\n  \"bob\": false\n}\n"
  },
  {
    "path": "examples/typescript-resolvers/src/main.ts",
    "content": "import { createYoga, createSchema } from 'graphql-yoga';\nimport { createServer } from 'http';\nimport type { Resolvers } from './type-defs.d';\n\nconst typeDefs = /* GraphQL */ `\n  type Query {\n    hello: String!\n  }\n\n  input SumInput {\n    a: Float!\n    b: Float!\n  }\n\n  type Mutation {\n    echoString(str: String!): String!\n    calculateSum(input: SumInput!): Float!\n  }\n`;\n\nconst resolvers: Resolvers = {\n  Query: {\n    hello: () => 'world',\n  },\n  Mutation: {\n    echoString: (_, args) => {\n      return args.str;\n    },\n    calculateSum: (_, args) => {\n      return args.input.a + args.input.b;\n    },\n  },\n};\n\nconst yoga = createYoga({\n  schema: createSchema({\n    typeDefs,\n    resolvers,\n  }),\n});\n\nconst server = createServer(yoga);\n\nserver.listen(3000);\n"
  },
  {
    "path": "examples/typescript-resolvers/src/type-defs.d.ts",
    "content": "import { GraphQLResolveInfo } from 'graphql';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\nexport type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  calculateSum: Scalars['Float']['output'];\n  echoString: Scalars['String']['output'];\n};\n\nexport type MutationCalculateSumArgs = {\n  input: SumInput;\n};\n\nexport type MutationEchoStringArgs = {\n  str: Scalars['String']['input'];\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  hello: Scalars['String']['output'];\n};\n\nexport type SumInput = {\n  a: Scalars['Float']['input'];\n  b: Scalars['Float']['input'];\n};\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<\n  TResult,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<\n  TResult,\n  TKey extends string,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  obj: T,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<\n  TResult = Record<PropertyKey, never>,\n  TParent = Record<PropertyKey, never>,\n  TContext = Record<PropertyKey, never>,\n  TArgs = Record<PropertyKey, never>\n> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = {\n  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n  Float: ResolverTypeWrapper<Scalars['Float']['output']>;\n  Mutation: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  String: ResolverTypeWrapper<Scalars['String']['output']>;\n  SumInput: SumInput;\n};\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = {\n  Boolean: Scalars['Boolean']['output'];\n  Float: Scalars['Float']['output'];\n  Mutation: Record<PropertyKey, never>;\n  Query: Record<PropertyKey, never>;\n  String: Scalars['String']['output'];\n  SumInput: SumInput;\n};\n\nexport type MutationResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']\n> = {\n  calculateSum?: Resolver<\n    ResolversTypes['Float'],\n    ParentType,\n    ContextType,\n    RequireFields<MutationCalculateSumArgs, 'input'>\n  >;\n  echoString?: Resolver<\n    ResolversTypes['String'],\n    ParentType,\n    ContextType,\n    RequireFields<MutationEchoStringArgs, 'str'>\n  >;\n};\n\nexport type QueryResolvers<\n  ContextType = any,\n  ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']\n> = {\n  hello?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n};\n\nexport type Resolvers<ContextType = any> = {\n  Mutation?: MutationResolvers<ContextType>;\n  Query?: QueryResolvers<ContextType>;\n};\n"
  },
  {
    "path": "examples/typescript-resolvers/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2020\",\n    \"module\": \"commonjs\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"outDir\": \"dist\"\n  },\n  \"include\": [\"src/**/*.ts\"]\n}\n"
  },
  {
    "path": "examples/vite/vite-react-cts/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "examples/vite/vite-react-cts/codegen.cts",
    "content": "import { type CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/vite/vite-react-cts/cypress/e2e/end2end.cy.ts",
    "content": "describe('template spec', () => {\n  it('renders everything correctly', () => {\n    cy.visit('http://localhost:3000');\n    cy.get('h3').should('contain', 'A New Hope');\n  });\n});\n"
  },
  {
    "path": "examples/vite/vite-react-cts/cypress/support/commands.ts",
    "content": "/// <reference types=\"cypress\" />\n"
  },
  {
    "path": "examples/vite/vite-react-cts/cypress/support/e2e.ts",
    "content": "// Import commands.js using ES2015 syntax:\nimport './commands';\n"
  },
  {
    "path": "examples/vite/vite-react-cts/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(_on, _config) {\n      // implement node event listeners here\n    },\n  },\n});\n"
  },
  {
    "path": "examples/vite/vite-react-cts/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite + React + TS</title>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/vite/vite-react-cts/package.json",
    "content": "{\n  \"name\": \"example-vite-react-cts\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"tsc && vite build\",\n    \"start\": \"vite preview --port 3000\",\n    \"codegen\": \"graphql-codegen --config codegen.cts\",\n    \"test\": \"cypress run\",\n    \"test:end2end\": \"start-server-and-test start http://localhost:3000 test\"\n  },\n  \"dependencies\": {\n    \"@apollo/client\": \"^3.7.10\",\n    \"@graphql-typed-document-node/core\": \"3.2.0\",\n    \"@vitejs/plugin-react-swc\": \"^3.0.0\",\n    \"graphql\": \"16.9.0\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"vite\": \"^6.0.0\"\n  },\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"6.2.1\",\n    \"@types/react\": \"^18.0.27\",\n    \"@types/react-dom\": \"^18.0.10\",\n    \"cypress\": \"15.7.1\",\n    \"start-server-and-test\": \"2.0.5\",\n    \"typescript\": \"^5.0.0\"\n  },\n  \"bob\": false,\n  \"browserslist\": {\n    \"production\": [\n      \">0.2%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/vite/vite-react-cts/src/Film.tsx",
    "content": "import { FragmentType, useFragment } from './gql/fragment-masking';\nimport { graphql } from './gql';\n\nexport const FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`);\n\nconst Film = (props: {\n  /* tweet property has the correct type 🎉 */\n  film: FragmentType<typeof FilmFragment>;\n}) => {\n  const film = useFragment(FilmFragment, props.film);\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  );\n};\n\nexport default Film;\n"
  },
  {
    "path": "examples/vite/vite-react-cts/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/vite/vite-react-cts/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n': typeof types.FilmItemFragmentDoc;\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllFilmsWithVariablesQueryDocument;\n};\nconst documents: Documents = {\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n':\n    types.FilmItemFragmentDoc,\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllFilmsWithVariablesQueryDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'\n): (typeof documents)['\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/vite/vite-react-cts/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type FilmItemFragment = {\n  __typename?: 'Film';\n  id: string;\n  title?: string | null;\n  releaseDate?: string | null;\n  producers?: Array<string | null> | null;\n} & { ' $fragmentName'?: 'FilmItemFragment' };\n\nexport type AllFilmsWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllFilmsWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allFilms?: {\n    __typename?: 'FilmsConnection';\n    edges?: Array<{\n      __typename?: 'FilmsEdge';\n      node?: ({ __typename?: 'Film' } & { ' $fragmentRefs'?: { FilmItemFragment: FilmItemFragment } }) | null;\n    } | null> | null;\n  } | null;\n};\n\nexport const FilmItemFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FilmItemFragment, unknown>;\nexport const AllFilmsWithVariablesQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'allFilmsWithVariablesQuery' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'allFilms' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'first' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'edges' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      {\n                        kind: 'Field',\n                        name: { kind: 'Name', value: 'node' },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'FilmItem' } }],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<AllFilmsWithVariablesQueryQuery, AllFilmsWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/vite/vite-react-cts/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/vite/vite-react-cts/src/main.tsx",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport Film from './Film';\nimport { graphql } from './gql';\nimport { ApolloClient, InMemoryCache, ApolloProvider, useQuery } from '@apollo/client';\n\nconst client = new ApolloClient({\n  uri: 'https://graphql.org/graphql/',\n  cache: new InMemoryCache(),\n});\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`);\n\nfunction App() {\n  const { data } = useQuery(allFilmsWithVariablesQueryDocument, { variables: { first: 10 } });\n  return (\n    <div className=\"App\">\n      {data && <ul>{data.allFilms?.edges?.map((e, i) => e?.node && <Film film={e?.node} key={`film-${i}`} />)}</ul>}\n    </div>\n  );\n}\n\nReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(\n  <React.StrictMode>\n    <ApolloProvider client={client}>\n      <App />\n    </ApolloProvider>\n  </React.StrictMode>\n);\n"
  },
  {
    "path": "examples/vite/vite-react-cts/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "examples/vite/vite-react-cts/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n    \"allowJs\": false,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": false,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react-jsx\"\n  },\n  \"include\": [\"src\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "examples/vite/vite-react-cts/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "examples/vite/vite-react-cts/vite.config.ts",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react-swc';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n});\n"
  },
  {
    "path": "examples/vite/vite-react-mts/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "examples/vite/vite-react-mts/codegen.mts",
    "content": "import { type CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/vite/vite-react-mts/cypress/e2e/end2end.cy.ts",
    "content": "describe('template spec', () => {\n  it('renders everything correctly', () => {\n    cy.visit('http://localhost:3000');\n    cy.get('h3').should('contain', 'A New Hope');\n  });\n});\n"
  },
  {
    "path": "examples/vite/vite-react-mts/cypress/support/commands.ts",
    "content": "/// <reference types=\"cypress\" />\n"
  },
  {
    "path": "examples/vite/vite-react-mts/cypress/support/e2e.ts",
    "content": "// Import commands.js using ES2015 syntax:\nimport './commands';\n"
  },
  {
    "path": "examples/vite/vite-react-mts/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(_on, _config) {\n      // implement node event listeners here\n    },\n  },\n});\n"
  },
  {
    "path": "examples/vite/vite-react-mts/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite + React + TS</title>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/vite/vite-react-mts/package.json",
    "content": "{\n  \"name\": \"example-vite-react-mts\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"tsc && vite build\",\n    \"start\": \"vite preview --port 3000\",\n    \"codegen\": \"graphql-codegen --config codegen.mts\",\n    \"test\": \"cypress run\",\n    \"test:end2end\": \"start-server-and-test start http://localhost:3000 test\"\n  },\n  \"dependencies\": {\n    \"@apollo/client\": \"^3.7.10\",\n    \"@graphql-typed-document-node/core\": \"3.2.0\",\n    \"@vitejs/plugin-react-swc\": \"^3.0.0\",\n    \"graphql\": \"16.9.0\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"vite\": \"^6.0.0\"\n  },\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"6.2.1\",\n    \"@types/react\": \"^18.0.27\",\n    \"@types/react-dom\": \"^18.0.10\",\n    \"cypress\": \"15.7.1\",\n    \"start-server-and-test\": \"2.0.5\",\n    \"typescript\": \"^5.0.0\"\n  },\n  \"bob\": false,\n  \"browserslist\": {\n    \"production\": [\n      \">0.2%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/vite/vite-react-mts/src/Film.tsx",
    "content": "import { FragmentType, useFragment } from './gql/fragment-masking';\nimport { graphql } from './gql';\n\nexport const FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`);\n\nconst Film = (props: {\n  /* tweet property has the correct type 🎉 */\n  film: FragmentType<typeof FilmFragment>;\n}) => {\n  const film = useFragment(FilmFragment, props.film);\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  );\n};\n\nexport default Film;\n"
  },
  {
    "path": "examples/vite/vite-react-mts/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/vite/vite-react-mts/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n': typeof types.FilmItemFragmentDoc;\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllFilmsWithVariablesQueryDocument;\n};\nconst documents: Documents = {\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n':\n    types.FilmItemFragmentDoc,\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllFilmsWithVariablesQueryDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'\n): (typeof documents)['\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/vite/vite-react-mts/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type FilmItemFragment = {\n  __typename?: 'Film';\n  id: string;\n  title?: string | null;\n  releaseDate?: string | null;\n  producers?: Array<string | null> | null;\n} & { ' $fragmentName'?: 'FilmItemFragment' };\n\nexport type AllFilmsWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllFilmsWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allFilms?: {\n    __typename?: 'FilmsConnection';\n    edges?: Array<{\n      __typename?: 'FilmsEdge';\n      node?: ({ __typename?: 'Film' } & { ' $fragmentRefs'?: { FilmItemFragment: FilmItemFragment } }) | null;\n    } | null> | null;\n  } | null;\n};\n\nexport const FilmItemFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FilmItemFragment, unknown>;\nexport const AllFilmsWithVariablesQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'allFilmsWithVariablesQuery' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'allFilms' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'first' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'edges' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      {\n                        kind: 'Field',\n                        name: { kind: 'Name', value: 'node' },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'FilmItem' } }],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<AllFilmsWithVariablesQueryQuery, AllFilmsWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/vite/vite-react-mts/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/vite/vite-react-mts/src/main.tsx",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport Film from './Film';\nimport { graphql } from './gql';\nimport { ApolloClient, InMemoryCache, ApolloProvider, useQuery } from '@apollo/client';\n\nconst client = new ApolloClient({\n  uri: 'https://graphql.org/graphql/',\n  cache: new InMemoryCache(),\n});\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`);\n\nfunction App() {\n  const { data } = useQuery(allFilmsWithVariablesQueryDocument, { variables: { first: 10 } });\n  return (\n    <div className=\"App\">\n      {data && <ul>{data.allFilms?.edges?.map((e, i) => e?.node && <Film film={e?.node} key={`film-${i}`} />)}</ul>}\n    </div>\n  );\n}\n\nReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(\n  <React.StrictMode>\n    <ApolloProvider client={client}>\n      <App />\n    </ApolloProvider>\n  </React.StrictMode>\n);\n"
  },
  {
    "path": "examples/vite/vite-react-mts/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "examples/vite/vite-react-mts/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n    \"allowJs\": false,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": false,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react-jsx\"\n  },\n  \"include\": [\"src\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "examples/vite/vite-react-mts/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "examples/vite/vite-react-mts/vite.config.ts",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react-swc';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n});\n"
  },
  {
    "path": "examples/vite/vite-react-ts/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "examples/vite/vite-react-ts/codegen.ts",
    "content": "import { type CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/vite/vite-react-ts/cypress/e2e/end2end.cy.ts",
    "content": "describe('template spec', () => {\n  it('renders everything correctly', () => {\n    cy.visit('http://localhost:3000');\n    cy.get('h3').should('contain', 'A New Hope');\n  });\n});\n"
  },
  {
    "path": "examples/vite/vite-react-ts/cypress/support/commands.ts",
    "content": "/// <reference types=\"cypress\" />\n"
  },
  {
    "path": "examples/vite/vite-react-ts/cypress/support/e2e.ts",
    "content": "// Import commands.js using ES2015 syntax:\nimport './commands';\n"
  },
  {
    "path": "examples/vite/vite-react-ts/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(_on, _config) {\n      // implement node event listeners here\n    },\n  },\n});\n"
  },
  {
    "path": "examples/vite/vite-react-ts/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite + React + TS</title>\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/vite/vite-react-ts/package.json",
    "content": "{\n  \"name\": \"example-vite-react-ts\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"tsc && vite build\",\n    \"start\": \"vite preview --port 3000\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\",\n    \"test\": \"cypress run\",\n    \"test:end2end\": \"start-server-and-test start http://localhost:3000 test\"\n  },\n  \"dependencies\": {\n    \"@apollo/client\": \"^3.7.10\",\n    \"@graphql-typed-document-node/core\": \"3.2.0\",\n    \"@vitejs/plugin-react-swc\": \"^3.0.0\",\n    \"graphql\": \"16.9.0\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"vite\": \"^6.0.0\"\n  },\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"6.2.1\",\n    \"@types/react\": \"^18.0.27\",\n    \"@types/react-dom\": \"^18.0.10\",\n    \"cypress\": \"15.7.1\",\n    \"start-server-and-test\": \"2.0.5\",\n    \"typescript\": \"^5.0.0\"\n  },\n  \"bob\": false,\n  \"browserslist\": {\n    \"production\": [\n      \">0.2%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/vite/vite-react-ts/src/Film.tsx",
    "content": "import { FragmentType, useFragment } from './gql/fragment-masking';\nimport { graphql } from './gql';\n\nexport const FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`);\n\nconst Film = (props: {\n  /* tweet property has the correct type 🎉 */\n  film: FragmentType<typeof FilmFragment>;\n}) => {\n  const film = useFragment(FilmFragment, props.film);\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  );\n};\n\nexport default Film;\n"
  },
  {
    "path": "examples/vite/vite-react-ts/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/vite/vite-react-ts/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n': typeof types.FilmItemFragmentDoc;\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n': typeof types.AllFilmsWithVariablesQueryDocument;\n};\nconst documents: Documents = {\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n':\n    types.FilmItemFragmentDoc,\n  '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n':\n    types.AllFilmsWithVariablesQueryDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'\n): (typeof documents)['\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'\n): (typeof documents)['\\n  query allFilmsWithVariablesQuery($first: Int!) {\\n    allFilms(first: $first) {\\n      edges {\\n        node {\\n          ...FilmItem\\n        }\\n      }\\n    }\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/vite/vite-react-ts/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type FilmItemFragment = {\n  __typename?: 'Film';\n  id: string;\n  title?: string | null;\n  releaseDate?: string | null;\n  producers?: Array<string | null> | null;\n} & { ' $fragmentName'?: 'FilmItemFragment' };\n\nexport type AllFilmsWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllFilmsWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allFilms?: {\n    __typename?: 'FilmsConnection';\n    edges?: Array<{\n      __typename?: 'FilmsEdge';\n      node?: ({ __typename?: 'Film' } & { ' $fragmentRefs'?: { FilmItemFragment: FilmItemFragment } }) | null;\n    } | null> | null;\n  } | null;\n};\n\nexport const FilmItemFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FilmItemFragment, unknown>;\nexport const AllFilmsWithVariablesQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'allFilmsWithVariablesQuery' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'allFilms' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'first' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'edges' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      {\n                        kind: 'Field',\n                        name: { kind: 'Name', value: 'node' },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'FilmItem' } }],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<AllFilmsWithVariablesQueryQuery, AllFilmsWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/vite/vite-react-ts/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/vite/vite-react-ts/src/main.tsx",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport Film from './Film';\nimport { graphql } from './gql';\nimport { ApolloClient, InMemoryCache, ApolloProvider, useQuery } from '@apollo/client';\n\nconst client = new ApolloClient({\n  uri: 'https://graphql.org/graphql/',\n  cache: new InMemoryCache(),\n});\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`);\n\nfunction App() {\n  const { data } = useQuery(allFilmsWithVariablesQueryDocument, { variables: { first: 10 } });\n  return (\n    <div className=\"App\">\n      {data && <ul>{data.allFilms?.edges?.map((e, i) => e?.node && <Film film={e?.node} key={`film-${i}`} />)}</ul>}\n    </div>\n  );\n}\n\nReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(\n  <React.StrictMode>\n    <ApolloProvider client={client}>\n      <App />\n    </ApolloProvider>\n  </React.StrictMode>\n);\n"
  },
  {
    "path": "examples/vite/vite-react-ts/src/vite-env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "examples/vite/vite-react-ts/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n    \"allowJs\": false,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": false,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react-jsx\"\n  },\n  \"include\": [\"src\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "examples/vite/vite-react-ts/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "examples/vite/vite-react-ts/vite.config.ts",
    "content": "import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react-swc';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react()],\n});\n"
  },
  {
    "path": "examples/vue/apollo-composable/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\n.DS_Store\ndist\ndist-ssr\ncoverage\n*.local\n\n/cypress/videos/\n/cypress/screenshots/\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "examples/vue/apollo-composable/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\"Vue.volar\", \"Vue.vscode-typescript-vue-plugin\"]\n}\n"
  },
  {
    "path": "examples/vue/apollo-composable/README.md",
    "content": "# Using GraphQL Code Generator with Apollo Composable and Vue 3\n\nThis example illustrates using GraphQL Code Generator in a Vue 3 application using the Apollo Composable GraphQL Client.\n\nYou will find the TypeScript-based codegen configuration in [`codegen.ts`](./codegen.ts).\n\nThis simple codegen configuration generates types and helpers in the [`src/gql`](./src/gql/) folder that help you to get typed GraphQL Queries and Mutations seamlessly ⚡️\n\n<br />\n\nFor a step-by-step implementation tutorial, please refer to the related guide:\n\nhttps://www.the-guild.dev/graphql/codegen/docs/guides/react-vue-angular\n\n--\n\nPlease note that the `client` preset used in this example is compatible with `@vue/apollo-composable` (since `4.0.0-alpha.13`).\n"
  },
  {
    "path": "examples/vue/apollo-composable/codegen.ts",
    "content": "import type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.vue', '!src/gql/**/*'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      config: {\n        useTypeImports: true,\n      },\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/vue/apollo-composable/cypress/e2e/end2end.cy.ts",
    "content": "describe('template spec', () => {\n  it('renders everything correctly', () => {\n    cy.visit('http://localhost:3000');\n    cy.get('h3').should('contain', 'A New Hope');\n  });\n});\n"
  },
  {
    "path": "examples/vue/apollo-composable/cypress/support/commands.ts",
    "content": "/// <reference types=\"cypress\" />\n"
  },
  {
    "path": "examples/vue/apollo-composable/cypress/support/e2e.ts",
    "content": "// Import commands.js using ES2015 syntax:\nimport './commands';\n"
  },
  {
    "path": "examples/vue/apollo-composable/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(_on, _config) {\n      // implement node event listeners here\n    },\n  },\n});\n"
  },
  {
    "path": "examples/vue/apollo-composable/env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "examples/vue/apollo-composable/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" href=\"/favicon.ico\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite App</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.ts\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/vue/apollo-composable/package.json",
    "content": "{\n  \"name\": \"example-vue-apollo-composable\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\",\n    \"test\": \"cypress run\",\n    \"start\": \"serve -s dist\",\n    \"test:end2end\": \"start-server-and-test start http://localhost:3000 test\"\n  },\n  \"dependencies\": {\n    \"@apollo/client\": \"^3.7.10\",\n    \"@vue/apollo-composable\": \"4.1.0\",\n    \"graphql\": \"^16.6.0\",\n    \"vue\": \"^3.2.37\"\n  },\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^6.2.1\",\n    \"@vitejs/plugin-vue\": \"^5.0.0\",\n    \"typescript\": \"^5.0.0\",\n    \"vite\": \"^6.0.0\",\n    \"vue-tsc\": \"^2.0.0\",\n    \"serve\": \"14.2.3\",\n    \"cypress\": \"15.7.1\",\n    \"start-server-and-test\": \"2.0.5\"\n  }\n}\n"
  },
  {
    "path": "examples/vue/apollo-composable/src/App.vue",
    "content": "<script setup lang=\"ts\">\nimport { useQuery } from '@vue/apollo-composable';\nimport { graphql } from './gql';\nimport FilmItem from './components/FilmItem.vue';\nimport { computed } from 'vue';\n\nconst { result } = useQuery(\n  graphql(/* GraphQL */ `\n    query allFilmsWithVariablesQuery($first: Int!) {\n      allFilms(first: $first) {\n        edges {\n          node {\n            ...FilmItem\n          }\n        }\n      }\n    }\n  `),\n  { first: 10 }\n);\nconst films = computed(() => result.value?.allFilms?.edges?.map(e => e?.node!));\n</script>\n\n<template>\n  <ul>\n    <li v-for=\"film of films\"><FilmItem :film=\"film\" /></li>\n  </ul>\n</template>\n"
  },
  {
    "path": "examples/vue/apollo-composable/src/assets/base.css",
    "content": "/* color palette from <https://github.com/vuejs/theme> */\n:root {\n  --vt-c-white: #ffffff;\n  --vt-c-white-soft: #f8f8f8;\n  --vt-c-white-mute: #f2f2f2;\n\n  --vt-c-black: #181818;\n  --vt-c-black-soft: #222222;\n  --vt-c-black-mute: #282828;\n\n  --vt-c-indigo: #2c3e50;\n\n  --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);\n  --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);\n  --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);\n  --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);\n\n  --vt-c-text-light-1: var(--vt-c-indigo);\n  --vt-c-text-light-2: rgba(60, 60, 60, 0.66);\n  --vt-c-text-dark-1: var(--vt-c-white);\n  --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);\n}\n\n/* semantic color variables for this project */\n:root {\n  --color-background: var(--vt-c-white);\n  --color-background-soft: var(--vt-c-white-soft);\n  --color-background-mute: var(--vt-c-white-mute);\n\n  --color-border: var(--vt-c-divider-light-2);\n  --color-border-hover: var(--vt-c-divider-light-1);\n\n  --color-heading: var(--vt-c-text-light-1);\n  --color-text: var(--vt-c-text-light-1);\n\n  --section-gap: 160px;\n}\n\n@media (prefers-color-scheme: dark) {\n  :root {\n    --color-background: var(--vt-c-black);\n    --color-background-soft: var(--vt-c-black-soft);\n    --color-background-mute: var(--vt-c-black-mute);\n\n    --color-border: var(--vt-c-divider-dark-2);\n    --color-border-hover: var(--vt-c-divider-dark-1);\n\n    --color-heading: var(--vt-c-text-dark-1);\n    --color-text: var(--vt-c-text-dark-2);\n  }\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n  margin: 0;\n  position: relative;\n  font-weight: normal;\n}\n\nbody {\n  min-height: 100vh;\n  color: var(--color-text);\n  background: var(--color-background);\n  transition: color 0.5s, background-color 0.5s;\n  line-height: 1.6;\n  font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans',\n    'Droid Sans', 'Helvetica Neue', sans-serif;\n  font-size: 15px;\n  text-rendering: optimizeLegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n"
  },
  {
    "path": "examples/vue/apollo-composable/src/assets/main.css",
    "content": "@import './base.css';\n\n#app {\n  max-width: 1280px;\n  margin: 0 auto;\n  padding: 2rem;\n\n  font-weight: normal;\n}\n\na,\n.green {\n  text-decoration: none;\n  color: hsla(160, 100%, 37%, 1);\n  transition: 0.4s;\n}\n\n@media (hover: hover) {\n  a:hover {\n    background-color: hsla(160, 100%, 37%, 0.2);\n  }\n}\n\n@media (min-width: 1024px) {\n  body {\n    display: flex;\n    place-items: center;\n  }\n\n  #app {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    padding: 0 2rem;\n  }\n}\n"
  },
  {
    "path": "examples/vue/apollo-composable/src/components/FilmItem.vue",
    "content": "<script setup lang=\"ts\">\nimport { graphql, type FragmentType, useFragment } from '../gql';\n\nconst FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`);\n\nconst props = defineProps<{\n  film: FragmentType<typeof FilmFragment>;\n}>();\n\nconst filmObj = useFragment(FilmFragment, props.film);\n</script>\n\n<template>\n  <div>\n    <h3>{{ filmObj.title }}</h3>\n    <p>{{ filmObj.releaseDate }}</p>\n  </div>\n</template>\n"
  },
  {
    "path": "examples/vue/apollo-composable/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport type { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport type { FragmentDefinitionNode } from 'graphql';\nimport type { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/vue/apollo-composable/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n    query allFilmsWithVariablesQuery($first: Int!) {\\n      allFilms(first: $first) {\\n        edges {\\n          node {\\n            ...FilmItem\\n          }\\n        }\\n      }\\n    }\\n  ': typeof types.AllFilmsWithVariablesQueryDocument;\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n': typeof types.FilmItemFragmentDoc;\n};\nconst documents: Documents = {\n  '\\n    query allFilmsWithVariablesQuery($first: Int!) {\\n      allFilms(first: $first) {\\n        edges {\\n          node {\\n            ...FilmItem\\n          }\\n        }\\n      }\\n    }\\n  ':\n    types.AllFilmsWithVariablesQueryDocument,\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n':\n    types.FilmItemFragmentDoc,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n    query allFilmsWithVariablesQuery($first: Int!) {\\n      allFilms(first: $first) {\\n        edges {\\n          node {\\n            ...FilmItem\\n          }\\n        }\\n      }\\n    }\\n  '\n): (typeof documents)['\\n    query allFilmsWithVariablesQuery($first: Int!) {\\n      allFilms(first: $first) {\\n        edges {\\n          node {\\n            ...FilmItem\\n          }\\n        }\\n      }\\n    }\\n  '];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'\n): (typeof documents)['\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/vue/apollo-composable/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type AllFilmsWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllFilmsWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allFilms?: {\n    __typename?: 'FilmsConnection';\n    edges?: Array<{\n      __typename?: 'FilmsEdge';\n      node?: ({ __typename?: 'Film' } & { ' $fragmentRefs'?: { FilmItemFragment: FilmItemFragment } }) | null;\n    } | null> | null;\n  } | null;\n};\n\nexport type FilmItemFragment = {\n  __typename?: 'Film';\n  id: string;\n  title?: string | null;\n  releaseDate?: string | null;\n  producers?: Array<string | null> | null;\n} & { ' $fragmentName'?: 'FilmItemFragment' };\n\nexport const FilmItemFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FilmItemFragment, unknown>;\nexport const AllFilmsWithVariablesQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'allFilmsWithVariablesQuery' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'allFilms' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'first' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'edges' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      {\n                        kind: 'Field',\n                        name: { kind: 'Name', value: 'node' },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'FilmItem' } }],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<AllFilmsWithVariablesQueryQuery, AllFilmsWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/vue/apollo-composable/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/vue/apollo-composable/src/main.ts",
    "content": "import { createApp, provide, h } from 'vue';\nimport './assets/main.css';\nimport { DefaultApolloClient } from '@vue/apollo-composable';\nimport { ApolloClient, HttpLink, InMemoryCache } from '@apollo/client/core';\nimport App from './App.vue';\n\nconst httpLink = new HttpLink({\n  uri: 'https://graphql.org/graphql/',\n});\n\n// Create the apollo client\nconst apolloClient = new ApolloClient({\n  link: httpLink,\n  cache: new InMemoryCache(),\n  connectToDevTools: true,\n});\n\ncreateApp({\n  setup() {\n    provide(DefaultApolloClient, apolloClient);\n  },\n\n  render: () => h(App),\n}).mount('#app');\n"
  },
  {
    "path": "examples/vue/apollo-composable/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"esModuleInterop\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n    \"skipLibCheck\": true,\n    \"noEmit\": true\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.d.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "examples/vue/apollo-composable/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "examples/vue/apollo-composable/vite.config.ts",
    "content": "import { defineConfig } from 'vite';\nimport vue from '@vitejs/plugin-vue';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [vue()],\n});\n"
  },
  {
    "path": "examples/vue/urql/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\n.DS_Store\ndist\ndist-ssr\ncoverage\n*.local\n\n/cypress/videos/\n/cypress/screenshots/\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "examples/vue/urql/README.md",
    "content": "# Using GraphQL Code Generator with URQL and Vue 3\n\nThis example illustrates using GraphQL Code Generator in a Vue 3 application using the URQL GraphQL Client.\n\nYou will find the TypeScript-based codegen configuration in [`codegen.ts`](./codegen.ts).\n\nThis simple codegen configuration generates types and helpers in the [`src/gql`](./src/gql/) folder that help you to get typed GraphQL Queries and Mutations seamlessly ⚡️\n\n<br />\n\nFor a step-by-step implementation tutorial, please refer to the related guide:\n\nhttps://www.the-guild.dev/graphql/codegen/docs/guides/react-vue-angular\n\n--\n\nPlease note that the `client` preset used in this example is compatible with `@urql/vue` (since `1.11.0`).\n"
  },
  {
    "path": "examples/vue/urql/codegen.ts",
    "content": "import type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.vue', '!src/gql/**/*'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      config: {\n        useTypeImports: true,\n      },\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/vue/urql/cypress/e2e/end2end.cy.ts",
    "content": "describe('template spec', () => {\n  it('renders everything correctly', () => {\n    cy.visit('http://localhost:3000');\n    cy.get('h3').should('contain', 'A New Hope');\n  });\n});\n"
  },
  {
    "path": "examples/vue/urql/cypress/support/commands.ts",
    "content": "/// <reference types=\"cypress\" />\n"
  },
  {
    "path": "examples/vue/urql/cypress/support/e2e.ts",
    "content": "// Import commands.js using ES2015 syntax:\nimport './commands';\n"
  },
  {
    "path": "examples/vue/urql/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(_on, _config) {\n      // implement node event listeners here\n    },\n  },\n});\n"
  },
  {
    "path": "examples/vue/urql/env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "examples/vue/urql/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" href=\"/favicon.ico\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite App</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.ts\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/vue/urql/package.json",
    "content": "{\n  \"name\": \"example-vue-urql\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\",\n    \"test\": \"cypress run\",\n    \"start\": \"serve -s dist\",\n    \"test:end2end\": \"start-server-and-test start http://localhost:3000 test\"\n  },\n  \"dependencies\": {\n    \"@urql/vue\": \"^1.0.0\",\n    \"graphql\": \"^16.6.0\",\n    \"vue\": \"^3.2.45\"\n  },\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^6.2.1\",\n    \"@vitejs/plugin-vue\": \"^5.0.0\",\n    \"typescript\": \"^5.0.0\",\n    \"vite\": \"^6.0.0\",\n    \"vue-tsc\": \"^2.0.0\",\n    \"serve\": \"14.2.3\",\n    \"cypress\": \"15.7.1\",\n    \"start-server-and-test\": \"2.0.5\"\n  }\n}\n"
  },
  {
    "path": "examples/vue/urql/src/App.vue",
    "content": "<script setup lang=\"ts\">\nimport { useQuery } from '@urql/vue';\nimport './assets/main.css';\nimport { graphql } from './gql';\nimport FilmItem from './components/FilmItem.vue';\nimport { computed } from 'vue';\n\nconst { data } = useQuery({\n  query: graphql(/* GraphQL */ `\n    query allFilmsWithVariablesQuery($first: Int!) {\n      allFilms(first: $first) {\n        edges {\n          node {\n            ...FilmItem\n          }\n        }\n      }\n    }\n  `),\n  variables: { first: 10 },\n});\nconst films = computed(() => data.value?.allFilms?.edges?.map(e => e?.node!));\n</script>\n\n<template>\n  <ul>\n    <li v-for=\"film of films\"><FilmItem :film=\"film\" /></li>\n  </ul>\n</template>\n"
  },
  {
    "path": "examples/vue/urql/src/assets/base.css",
    "content": "/* color palette from <https://github.com/vuejs/theme> */\n:root {\n  --vt-c-white: #ffffff;\n  --vt-c-white-soft: #f8f8f8;\n  --vt-c-white-mute: #f2f2f2;\n\n  --vt-c-black: #181818;\n  --vt-c-black-soft: #222222;\n  --vt-c-black-mute: #282828;\n\n  --vt-c-indigo: #2c3e50;\n\n  --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);\n  --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);\n  --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);\n  --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);\n\n  --vt-c-text-light-1: var(--vt-c-indigo);\n  --vt-c-text-light-2: rgba(60, 60, 60, 0.66);\n  --vt-c-text-dark-1: var(--vt-c-white);\n  --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);\n}\n\n/* semantic color variables for this project */\n:root {\n  --color-background: var(--vt-c-white);\n  --color-background-soft: var(--vt-c-white-soft);\n  --color-background-mute: var(--vt-c-white-mute);\n\n  --color-border: var(--vt-c-divider-light-2);\n  --color-border-hover: var(--vt-c-divider-light-1);\n\n  --color-heading: var(--vt-c-text-light-1);\n  --color-text: var(--vt-c-text-light-1);\n\n  --section-gap: 160px;\n}\n\n@media (prefers-color-scheme: dark) {\n  :root {\n    --color-background: var(--vt-c-black);\n    --color-background-soft: var(--vt-c-black-soft);\n    --color-background-mute: var(--vt-c-black-mute);\n\n    --color-border: var(--vt-c-divider-dark-2);\n    --color-border-hover: var(--vt-c-divider-dark-1);\n\n    --color-heading: var(--vt-c-text-dark-1);\n    --color-text: var(--vt-c-text-dark-2);\n  }\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n  margin: 0;\n  position: relative;\n  font-weight: normal;\n}\n\nbody {\n  min-height: 100vh;\n  color: var(--color-text);\n  background: var(--color-background);\n  transition: color 0.5s, background-color 0.5s;\n  line-height: 1.6;\n  font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans',\n    'Droid Sans', 'Helvetica Neue', sans-serif;\n  font-size: 15px;\n  text-rendering: optimizeLegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n"
  },
  {
    "path": "examples/vue/urql/src/assets/main.css",
    "content": "@import './base.css';\n\n#app {\n  max-width: 1280px;\n  margin: 0 auto;\n  padding: 2rem;\n\n  font-weight: normal;\n}\n\na,\n.green {\n  text-decoration: none;\n  color: hsla(160, 100%, 37%, 1);\n  transition: 0.4s;\n}\n\n@media (hover: hover) {\n  a:hover {\n    background-color: hsla(160, 100%, 37%, 0.2);\n  }\n}\n\n@media (min-width: 1024px) {\n  body {\n    display: flex;\n    place-items: center;\n  }\n\n  #app {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    padding: 0 2rem;\n  }\n}\n"
  },
  {
    "path": "examples/vue/urql/src/components/FilmItem.vue",
    "content": "<script setup lang=\"ts\">\nimport { graphql, type FragmentType, useFragment } from '../gql';\n\nconst FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`);\n\nconst props = defineProps<{\n  film: FragmentType<typeof FilmFragment>;\n}>();\n\nconst filmObj = useFragment(FilmFragment, props.film);\n</script>\n\n<template>\n  <div>\n    <h3>{{ filmObj.title }}</h3>\n    <p>{{ filmObj.releaseDate }}</p>\n  </div>\n</template>\n"
  },
  {
    "path": "examples/vue/urql/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport type { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport type { FragmentDefinitionNode } from 'graphql';\nimport type { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/vue/urql/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n    query allFilmsWithVariablesQuery($first: Int!) {\\n      allFilms(first: $first) {\\n        edges {\\n          node {\\n            ...FilmItem\\n          }\\n        }\\n      }\\n    }\\n  ': typeof types.AllFilmsWithVariablesQueryDocument;\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n': typeof types.FilmItemFragmentDoc;\n};\nconst documents: Documents = {\n  '\\n    query allFilmsWithVariablesQuery($first: Int!) {\\n      allFilms(first: $first) {\\n        edges {\\n          node {\\n            ...FilmItem\\n          }\\n        }\\n      }\\n    }\\n  ':\n    types.AllFilmsWithVariablesQueryDocument,\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n':\n    types.FilmItemFragmentDoc,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n    query allFilmsWithVariablesQuery($first: Int!) {\\n      allFilms(first: $first) {\\n        edges {\\n          node {\\n            ...FilmItem\\n          }\\n        }\\n      }\\n    }\\n  '\n): (typeof documents)['\\n    query allFilmsWithVariablesQuery($first: Int!) {\\n      allFilms(first: $first) {\\n        edges {\\n          node {\\n            ...FilmItem\\n          }\\n        }\\n      }\\n    }\\n  '];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'\n): (typeof documents)['\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/vue/urql/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type AllFilmsWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllFilmsWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allFilms?: {\n    __typename?: 'FilmsConnection';\n    edges?: Array<{\n      __typename?: 'FilmsEdge';\n      node?: ({ __typename?: 'Film' } & { ' $fragmentRefs'?: { FilmItemFragment: FilmItemFragment } }) | null;\n    } | null> | null;\n  } | null;\n};\n\nexport type FilmItemFragment = {\n  __typename?: 'Film';\n  id: string;\n  title?: string | null;\n  releaseDate?: string | null;\n  producers?: Array<string | null> | null;\n} & { ' $fragmentName'?: 'FilmItemFragment' };\n\nexport const FilmItemFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FilmItemFragment, unknown>;\nexport const AllFilmsWithVariablesQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'allFilmsWithVariablesQuery' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'allFilms' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'first' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'edges' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      {\n                        kind: 'Field',\n                        name: { kind: 'Name', value: 'node' },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'FilmItem' } }],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<AllFilmsWithVariablesQueryQuery, AllFilmsWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/vue/urql/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/vue/urql/src/main.ts",
    "content": "import { createApp } from 'vue';\nimport urql, { cacheExchange, fetchExchange } from '@urql/vue';\nimport App from './App.vue';\n\nconst app = createApp(App);\n\napp.use(urql, {\n  url: 'https://graphql.org/graphql/',\n  exchanges: [cacheExchange, fetchExchange],\n});\n\napp.mount('#app');\n"
  },
  {
    "path": "examples/vue/urql/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"esModuleInterop\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n    \"skipLibCheck\": true,\n    \"noEmit\": true\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.d.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "examples/vue/urql/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "examples/vue/urql/vite.config.ts",
    "content": "import { defineConfig } from 'vite';\nimport vue from '@vitejs/plugin-vue';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [vue()],\n});\n"
  },
  {
    "path": "examples/vue/villus/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\n.DS_Store\ndist\ndist-ssr\ncoverage\n*.local\n\n/cypress/videos/\n/cypress/screenshots/\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"
  },
  {
    "path": "examples/vue/villus/.vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\"Vue.volar\", \"Vue.vscode-typescript-vue-plugin\"]\n}\n"
  },
  {
    "path": "examples/vue/villus/README.md",
    "content": "# Using GraphQL Code Generator with Villus and Vue 3\n\nThis example illustrates using GraphQL Code Generator in a Vue 3 application using the Villus GraphQL Client.\n\nYou will find the TypeScript-based codegen configuration in [`codegen.ts`](./codegen.ts).\n\nThis simple codegen configuration generates types and helpers in the [`src/gql`](./src/gql/) folder that help you to get typed GraphQL Queries and Mutations seamlessly ⚡️\n\n<br />\n\nFor a step-by-step implementation tutorial, please refer to the related guide:\n\nhttps://www.the-guild.dev/graphql/codegen/docs/guides/react-vue-angular\n\n--\n\nPlease note that the `client` preset used in this example is compatible with `villus` (since `1.0.0-beta.8`).\n"
  },
  {
    "path": "examples/vue/villus/codegen.ts",
    "content": "import type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.vue', '!src/gql/**/*'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      config: {\n        useTypeImports: true,\n      },\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/vue/villus/cypress/e2e/end2end.cy.ts",
    "content": "describe('template spec', () => {\n  it('renders everything correctly', () => {\n    cy.visit('http://localhost:3000');\n    cy.get('h3').should('contain', 'A New Hope');\n  });\n});\n"
  },
  {
    "path": "examples/vue/villus/cypress/support/commands.ts",
    "content": "/// <reference types=\"cypress\" />\n"
  },
  {
    "path": "examples/vue/villus/cypress/support/e2e.ts",
    "content": "// Import commands.js using ES2015 syntax:\nimport './commands';\n"
  },
  {
    "path": "examples/vue/villus/cypress.config.ts",
    "content": "import { defineConfig } from 'cypress';\n\nexport default defineConfig({\n  e2e: {\n    setupNodeEvents(_on, _config) {\n      // implement node event listeners here\n    },\n  },\n});\n"
  },
  {
    "path": "examples/vue/villus/env.d.ts",
    "content": "/// <reference types=\"vite/client\" />\n"
  },
  {
    "path": "examples/vue/villus/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" href=\"/favicon.ico\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Vite App</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\" src=\"/src/main.ts\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/vue/villus/package.json",
    "content": "{\n  \"name\": \"example-vue-villus\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\",\n    \"test\": \"cypress run\",\n    \"start\": \"serve -s dist\",\n    \"test:end2end\": \"start-server-and-test start http://localhost:3000 test\"\n  },\n  \"dependencies\": {\n    \"graphql\": \"^16.6.0\",\n    \"villus\": \"^3.0.0\",\n    \"vue\": \"^3.2.37\"\n  },\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^6.2.1\",\n    \"@vitejs/plugin-vue\": \"^5.0.0\",\n    \"typescript\": \"^5.0.0\",\n    \"vite\": \"^6.0.0\",\n    \"vue-tsc\": \"^2.0.0\",\n    \"serve\": \"14.2.3\",\n    \"cypress\": \"15.7.1\",\n    \"start-server-and-test\": \"2.0.5\"\n  }\n}\n"
  },
  {
    "path": "examples/vue/villus/src/App.vue",
    "content": "<script setup lang=\"ts\">\nimport { useClient, useQuery } from 'villus';\nimport { graphql } from './gql';\nimport FilmItem from './components/FilmItem.vue';\nimport { computed } from 'vue';\n\nuseClient({\n  url: 'https://graphql.org/graphql/',\n});\n\nconst { data } = useQuery({\n  query: graphql(/* GraphQL */ `\n    query allFilmsWithVariablesQuery($first: Int!) {\n      allFilms(first: $first) {\n        edges {\n          node {\n            ...FilmItem\n          }\n        }\n      }\n    }\n  `),\n  variables: { first: 10 },\n});\nconst films = computed(() => data.value?.allFilms?.edges?.map(e => e?.node!));\n</script>\n\n<template>\n  <ul>\n    <li v-for=\"film of films\"><FilmItem :film=\"film\" /></li>\n  </ul>\n</template>\n"
  },
  {
    "path": "examples/vue/villus/src/assets/base.css",
    "content": "/* color palette from <https://github.com/vuejs/theme> */\n:root {\n  --vt-c-white: #ffffff;\n  --vt-c-white-soft: #f8f8f8;\n  --vt-c-white-mute: #f2f2f2;\n\n  --vt-c-black: #181818;\n  --vt-c-black-soft: #222222;\n  --vt-c-black-mute: #282828;\n\n  --vt-c-indigo: #2c3e50;\n\n  --vt-c-divider-light-1: rgba(60, 60, 60, 0.29);\n  --vt-c-divider-light-2: rgba(60, 60, 60, 0.12);\n  --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);\n  --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);\n\n  --vt-c-text-light-1: var(--vt-c-indigo);\n  --vt-c-text-light-2: rgba(60, 60, 60, 0.66);\n  --vt-c-text-dark-1: var(--vt-c-white);\n  --vt-c-text-dark-2: rgba(235, 235, 235, 0.64);\n}\n\n/* semantic color variables for this project */\n:root {\n  --color-background: var(--vt-c-white);\n  --color-background-soft: var(--vt-c-white-soft);\n  --color-background-mute: var(--vt-c-white-mute);\n\n  --color-border: var(--vt-c-divider-light-2);\n  --color-border-hover: var(--vt-c-divider-light-1);\n\n  --color-heading: var(--vt-c-text-light-1);\n  --color-text: var(--vt-c-text-light-1);\n\n  --section-gap: 160px;\n}\n\n@media (prefers-color-scheme: dark) {\n  :root {\n    --color-background: var(--vt-c-black);\n    --color-background-soft: var(--vt-c-black-soft);\n    --color-background-mute: var(--vt-c-black-mute);\n\n    --color-border: var(--vt-c-divider-dark-2);\n    --color-border-hover: var(--vt-c-divider-dark-1);\n\n    --color-heading: var(--vt-c-text-dark-1);\n    --color-text: var(--vt-c-text-dark-2);\n  }\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n  margin: 0;\n  position: relative;\n  font-weight: normal;\n}\n\nbody {\n  min-height: 100vh;\n  color: var(--color-text);\n  background: var(--color-background);\n  transition: color 0.5s, background-color 0.5s;\n  line-height: 1.6;\n  font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans',\n    'Droid Sans', 'Helvetica Neue', sans-serif;\n  font-size: 15px;\n  text-rendering: optimizeLegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n"
  },
  {
    "path": "examples/vue/villus/src/assets/main.css",
    "content": "@import './base.css';\n\n#app {\n  max-width: 1280px;\n  margin: 0 auto;\n  padding: 2rem;\n\n  font-weight: normal;\n}\n\na,\n.green {\n  text-decoration: none;\n  color: hsla(160, 100%, 37%, 1);\n  transition: 0.4s;\n}\n\n@media (hover: hover) {\n  a:hover {\n    background-color: hsla(160, 100%, 37%, 0.2);\n  }\n}\n\n@media (min-width: 1024px) {\n  body {\n    display: flex;\n    place-items: center;\n  }\n\n  #app {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    padding: 0 2rem;\n  }\n}\n"
  },
  {
    "path": "examples/vue/villus/src/components/FilmItem.vue",
    "content": "<script setup lang=\"ts\">\nimport { graphql, type FragmentType, useFragment } from '../gql';\n\nconst FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`);\n\nconst props = defineProps<{\n  film: FragmentType<typeof FilmFragment>;\n}>();\n\nconst filmObj = useFragment(FilmFragment, props.film);\n</script>\n\n<template>\n  <div>\n    <h3>{{ filmObj.title }}</h3>\n    <p>{{ filmObj.releaseDate }}</p>\n  </div>\n</template>\n"
  },
  {
    "path": "examples/vue/villus/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport type { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport type { FragmentDefinitionNode } from 'graphql';\nimport type { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/vue/villus/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n    query allFilmsWithVariablesQuery($first: Int!) {\\n      allFilms(first: $first) {\\n        edges {\\n          node {\\n            ...FilmItem\\n          }\\n        }\\n      }\\n    }\\n  ': typeof types.AllFilmsWithVariablesQueryDocument;\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n': typeof types.FilmItemFragmentDoc;\n};\nconst documents: Documents = {\n  '\\n    query allFilmsWithVariablesQuery($first: Int!) {\\n      allFilms(first: $first) {\\n        edges {\\n          node {\\n            ...FilmItem\\n          }\\n        }\\n      }\\n    }\\n  ':\n    types.AllFilmsWithVariablesQueryDocument,\n  '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n':\n    types.FilmItemFragmentDoc,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n    query allFilmsWithVariablesQuery($first: Int!) {\\n      allFilms(first: $first) {\\n        edges {\\n          node {\\n            ...FilmItem\\n          }\\n        }\\n      }\\n    }\\n  '\n): (typeof documents)['\\n    query allFilmsWithVariablesQuery($first: Int!) {\\n      allFilms(first: $first) {\\n        edges {\\n          node {\\n            ...FilmItem\\n          }\\n        }\\n      }\\n    }\\n  '];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'\n): (typeof documents)['\\n  fragment FilmItem on Film {\\n    id\\n    title\\n    releaseDate\\n    producers\\n  }\\n'];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/vue/villus/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\n/** A single film. */\nexport type Film = Node & {\n  __typename?: 'Film';\n  characterConnection?: Maybe<FilmCharactersConnection>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The name of the director of this film. */\n  director?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /** The episode number of this film. */\n  episodeID?: Maybe<Scalars['Int']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The opening paragraphs at the beginning of this film. */\n  openingCrawl?: Maybe<Scalars['String']['output']>;\n  planetConnection?: Maybe<FilmPlanetsConnection>;\n  /** The name(s) of the producer(s) of this film. */\n  producers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of film release at original creator country. */\n  releaseDate?: Maybe<Scalars['String']['output']>;\n  speciesConnection?: Maybe<FilmSpeciesConnection>;\n  starshipConnection?: Maybe<FilmStarshipsConnection>;\n  /** The title of this film. */\n  title?: Maybe<Scalars['String']['output']>;\n  vehicleConnection?: Maybe<FilmVehiclesConnection>;\n};\n\n/** A single film. */\nexport type FilmCharacterConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmPlanetConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmSpeciesConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single film. */\nexport type FilmVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type FilmCharactersConnection = {\n  __typename?: 'FilmCharactersConnection';\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  characters?: Maybe<Array<Maybe<Person>>>;\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmCharactersEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmCharactersEdge = {\n  __typename?: 'FilmCharactersEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type FilmPlanetsConnection = {\n  __typename?: 'FilmPlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmPlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmPlanetsEdge = {\n  __typename?: 'FilmPlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\n/** A connection to a list of items. */\nexport type FilmSpeciesConnection = {\n  __typename?: 'FilmSpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmSpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmSpeciesEdge = {\n  __typename?: 'FilmSpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type FilmStarshipsConnection = {\n  __typename?: 'FilmStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmStarshipsEdge = {\n  __typename?: 'FilmStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type FilmVehiclesConnection = {\n  __typename?: 'FilmVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type FilmVehiclesEdge = {\n  __typename?: 'FilmVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/** A connection to a list of items. */\nexport type FilmsConnection = {\n  __typename?: 'FilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<FilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type FilmsEdge = {\n  __typename?: 'FilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** An object with an ID */\nexport type Node = {\n  /** The id of the object. */\n  id: Scalars['ID']['output'];\n};\n\n/** Information about pagination in a connection. */\nexport type PageInfo = {\n  __typename?: 'PageInfo';\n  /** When paginating forwards, the cursor to continue. */\n  endCursor?: Maybe<Scalars['String']['output']>;\n  /** When paginating forwards, are there more items? */\n  hasNextPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, are there more items? */\n  hasPreviousPage: Scalars['Boolean']['output'];\n  /** When paginating backwards, the cursor to continue. */\n  startCursor?: Maybe<Scalars['String']['output']>;\n};\n\n/** A connection to a list of items. */\nexport type PeopleConnection = {\n  __typename?: 'PeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PeopleEdge = {\n  __typename?: 'PeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type Person = Node & {\n  __typename?: 'Person';\n  /**\n   * The birth year of the person, using the in-universe standard of BBY or ABY -\n   * Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n   * a battle that occurs at the end of Star Wars episode IV: A New Hope.\n   */\n  birthYear?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have an eye.\n   */\n  eyeColor?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PersonFilmsConnection>;\n  /**\n   * The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n   * \"n/a\" if the person does not have a gender.\n   */\n  gender?: Maybe<Scalars['String']['output']>;\n  /**\n   * The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n   * person does not have hair.\n   */\n  hairColor?: Maybe<Scalars['String']['output']>;\n  /** The height of the person in centimeters. */\n  height?: Maybe<Scalars['Int']['output']>;\n  /** A planet that this person was born on or inhabits. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The mass of the person in kilograms. */\n  mass?: Maybe<Scalars['Float']['output']>;\n  /** The name of this person. */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The skin color of this person. */\n  skinColor?: Maybe<Scalars['String']['output']>;\n  /** The species that this person belongs to, or null if unknown. */\n  species?: Maybe<Species>;\n  starshipConnection?: Maybe<PersonStarshipsConnection>;\n  vehicleConnection?: Maybe<PersonVehiclesConnection>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonStarshipConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** An individual person or character within the Star Wars universe. */\nexport type PersonVehicleConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PersonFilmsConnection = {\n  __typename?: 'PersonFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonFilmsEdge = {\n  __typename?: 'PersonFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PersonStarshipsConnection = {\n  __typename?: 'PersonStarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonStarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PersonStarshipsEdge = {\n  __typename?: 'PersonStarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A connection to a list of items. */\nexport type PersonVehiclesConnection = {\n  __typename?: 'PersonVehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PersonVehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type PersonVehiclesEdge = {\n  __typename?: 'PersonVehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type Planet = Node & {\n  __typename?: 'Planet';\n  /** The climates of this planet. */\n  climates?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The diameter of this planet in kilometers. */\n  diameter?: Maybe<Scalars['Int']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<PlanetFilmsConnection>;\n  /**\n   * A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n   * G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n   */\n  gravity?: Maybe<Scalars['String']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The name of this planet. */\n  name?: Maybe<Scalars['String']['output']>;\n  /**\n   * The number of standard days it takes for this planet to complete a single orbit\n   * of its local star.\n   */\n  orbitalPeriod?: Maybe<Scalars['Int']['output']>;\n  /** The average population of sentient beings inhabiting this planet. */\n  population?: Maybe<Scalars['Float']['output']>;\n  residentConnection?: Maybe<PlanetResidentsConnection>;\n  /**\n   * The number of standard hours it takes for this planet to complete a single\n   * rotation on its axis.\n   */\n  rotationPeriod?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The percentage of the planet surface that is naturally occurring water or bodies\n   * of water.\n   */\n  surfaceWater?: Maybe<Scalars['Float']['output']>;\n  /** The terrains of this planet. */\n  terrains?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/**\n * A large mass, planet or planetoid in the Star Wars Universe, at the time of\n * 0 ABY.\n */\nexport type PlanetResidentConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetFilmsConnection = {\n  __typename?: 'PlanetFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetFilmsEdge = {\n  __typename?: 'PlanetFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetResidentsConnection = {\n  __typename?: 'PlanetResidentsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetResidentsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  residents?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetResidentsEdge = {\n  __typename?: 'PlanetResidentsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type PlanetsConnection = {\n  __typename?: 'PlanetsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<PlanetsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  planets?: Maybe<Array<Maybe<Planet>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type PlanetsEdge = {\n  __typename?: 'PlanetsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Planet>;\n};\n\nexport type Root = {\n  __typename?: 'Root';\n  allFilms?: Maybe<FilmsConnection>;\n  allPeople?: Maybe<PeopleConnection>;\n  allPlanets?: Maybe<PlanetsConnection>;\n  allSpecies?: Maybe<SpeciesConnection>;\n  allStarships?: Maybe<StarshipsConnection>;\n  allVehicles?: Maybe<VehiclesConnection>;\n  film?: Maybe<Film>;\n  /** Fetches an object given its ID */\n  node?: Maybe<Node>;\n  person?: Maybe<Person>;\n  planet?: Maybe<Planet>;\n  species?: Maybe<Species>;\n  starship?: Maybe<Starship>;\n  vehicle?: Maybe<Vehicle>;\n};\n\nexport type RootAllFilmsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPeopleArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllPlanetsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllSpeciesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllStarshipsArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootAllVehiclesArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\nexport type RootFilmArgs = {\n  filmID?: InputMaybe<Scalars['ID']['input']>;\n  id?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootNodeArgs = {\n  id: Scalars['ID']['input'];\n};\n\nexport type RootPersonArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  personID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootPlanetArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  planetID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootSpeciesArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  speciesID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootStarshipArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  starshipID?: InputMaybe<Scalars['ID']['input']>;\n};\n\nexport type RootVehicleArgs = {\n  id?: InputMaybe<Scalars['ID']['input']>;\n  vehicleID?: InputMaybe<Scalars['ID']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type Species = Node & {\n  __typename?: 'Species';\n  /** The average height of this species in centimeters. */\n  averageHeight?: Maybe<Scalars['Float']['output']>;\n  /** The average lifespan of this species in years, null if unknown. */\n  averageLifespan?: Maybe<Scalars['Int']['output']>;\n  /** The classification of this species, such as \"mammal\" or \"reptile\". */\n  classification?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The designation of this species, such as \"sentient\". */\n  designation?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  /**\n   * Common eye colors for this species, null if this species does not typically\n   * have eyes.\n   */\n  eyeColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  filmConnection?: Maybe<SpeciesFilmsConnection>;\n  /**\n   * Common hair colors for this species, null if this species does not typically\n   * have hair.\n   */\n  hairColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** A planet that this species originates from. */\n  homeworld?: Maybe<Planet>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The language commonly spoken by this species. */\n  language?: Maybe<Scalars['String']['output']>;\n  /** The name of this species. */\n  name?: Maybe<Scalars['String']['output']>;\n  personConnection?: Maybe<SpeciesPeopleConnection>;\n  /**\n   * Common skin colors for this species, null if this species does not typically\n   * have skin.\n   */\n  skinColors?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A type of person or character within the Star Wars Universe. */\nexport type SpeciesPersonConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesConnection = {\n  __typename?: 'SpeciesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  species?: Maybe<Array<Maybe<Species>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesEdge = {\n  __typename?: 'SpeciesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Species>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesFilmsConnection = {\n  __typename?: 'SpeciesFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesFilmsEdge = {\n  __typename?: 'SpeciesFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type SpeciesPeopleConnection = {\n  __typename?: 'SpeciesPeopleConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<SpeciesPeopleEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  people?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type SpeciesPeopleEdge = {\n  __typename?: 'SpeciesPeopleEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type Starship = Node & {\n  __typename?: 'Starship';\n  /**\n   * The Maximum number of Megalights this starship can travel in a standard hour.\n   * A \"Megalight\" is a standard unit of distance and has never been defined before\n   * within the Star Wars universe. This figure is only really useful for measuring\n   * the difference in speed of starships. We can assume it is similar to AU, the\n   * distance between our Sun (Sol) and Earth.\n   */\n  MGLT?: Maybe<Scalars['Int']['output']>;\n  /** The maximum number of kilograms that this starship can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this starship can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this starship new, in galactic credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this starship. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<StarshipFilmsConnection>;\n  /** The class of this starships hyperdrive. */\n  hyperdriveRating?: Maybe<Scalars['Float']['output']>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this starship in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this starship. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /**\n   * The maximum speed of this starship in atmosphere. null if this starship is\n   * incapable of atmosphering flight.\n   */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n   * Orbital Battle Station\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /** The name of this starship. The common name, such as \"Death Star\". */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this starship can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<StarshipPilotsConnection>;\n  /**\n   * The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n   * Battlestation\"\n   */\n  starshipClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that has hyperdrive capability. */\nexport type StarshipPilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipFilmsConnection = {\n  __typename?: 'StarshipFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipFilmsEdge = {\n  __typename?: 'StarshipFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipPilotsConnection = {\n  __typename?: 'StarshipPilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipPilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipPilotsEdge = {\n  __typename?: 'StarshipPilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type StarshipsConnection = {\n  __typename?: 'StarshipsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<StarshipsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  starships?: Maybe<Array<Maybe<Starship>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type StarshipsEdge = {\n  __typename?: 'StarshipsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Starship>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type Vehicle = Node & {\n  __typename?: 'Vehicle';\n  /** The maximum number of kilograms that this vehicle can transport. */\n  cargoCapacity?: Maybe<Scalars['Float']['output']>;\n  /**\n   * The maximum length of time that this vehicle can provide consumables for its\n   * entire crew without having to resupply.\n   */\n  consumables?: Maybe<Scalars['String']['output']>;\n  /** The cost of this vehicle new, in Galactic Credits. */\n  costInCredits?: Maybe<Scalars['Float']['output']>;\n  /** The ISO 8601 date format of the time that this resource was created. */\n  created?: Maybe<Scalars['String']['output']>;\n  /** The number of personnel needed to run or pilot this vehicle. */\n  crew?: Maybe<Scalars['String']['output']>;\n  /** The ISO 8601 date format of the time that this resource was edited. */\n  edited?: Maybe<Scalars['String']['output']>;\n  filmConnection?: Maybe<VehicleFilmsConnection>;\n  /** The ID of an object */\n  id: Scalars['ID']['output'];\n  /** The length of this vehicle in meters. */\n  length?: Maybe<Scalars['Float']['output']>;\n  /** The manufacturers of this vehicle. */\n  manufacturers?: Maybe<Array<Maybe<Scalars['String']['output']>>>;\n  /** The maximum speed of this vehicle in atmosphere. */\n  maxAtmospheringSpeed?: Maybe<Scalars['Int']['output']>;\n  /**\n   * The model or official name of this vehicle. Such as \"All-Terrain Attack\n   * Transport\".\n   */\n  model?: Maybe<Scalars['String']['output']>;\n  /**\n   * The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n   * bike\".\n   */\n  name?: Maybe<Scalars['String']['output']>;\n  /** The number of non-essential people this vehicle can transport. */\n  passengers?: Maybe<Scalars['String']['output']>;\n  pilotConnection?: Maybe<VehiclePilotsConnection>;\n  /** The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\". */\n  vehicleClass?: Maybe<Scalars['String']['output']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehicleFilmConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A single transport craft that does not have hyperdrive capability */\nexport type VehiclePilotConnectionArgs = {\n  after?: InputMaybe<Scalars['String']['input']>;\n  before?: InputMaybe<Scalars['String']['input']>;\n  first?: InputMaybe<Scalars['Int']['input']>;\n  last?: InputMaybe<Scalars['Int']['input']>;\n};\n\n/** A connection to a list of items. */\nexport type VehicleFilmsConnection = {\n  __typename?: 'VehicleFilmsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehicleFilmsEdge>>>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  films?: Maybe<Array<Maybe<Film>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehicleFilmsEdge = {\n  __typename?: 'VehicleFilmsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Film>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclePilotsConnection = {\n  __typename?: 'VehiclePilotsConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclePilotsEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  pilots?: Maybe<Array<Maybe<Person>>>;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n};\n\n/** An edge in a connection. */\nexport type VehiclePilotsEdge = {\n  __typename?: 'VehiclePilotsEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Person>;\n};\n\n/** A connection to a list of items. */\nexport type VehiclesConnection = {\n  __typename?: 'VehiclesConnection';\n  /** A list of edges. */\n  edges?: Maybe<Array<Maybe<VehiclesEdge>>>;\n  /** Information to aid in pagination. */\n  pageInfo: PageInfo;\n  /**\n   * A count of the total number of objects in this connection, ignoring pagination.\n   * This allows a client to fetch the first five objects by passing \"5\" as the\n   * argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n   * for example.\n   */\n  totalCount?: Maybe<Scalars['Int']['output']>;\n  /**\n   * A list of all of the objects returned in the connection. This is a convenience\n   * field provided for quickly exploring the API; rather than querying for\n   * \"{ edges { node } }\" when no edge data is needed, this field can be be used\n   * instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n   * the edge to enable efficient pagination, this shortcut cannot be used, and the\n   * full \"{ edges { node } }\" version should be used instead.\n   */\n  vehicles?: Maybe<Array<Maybe<Vehicle>>>;\n};\n\n/** An edge in a connection. */\nexport type VehiclesEdge = {\n  __typename?: 'VehiclesEdge';\n  /** A cursor for use in pagination */\n  cursor: Scalars['String']['output'];\n  /** The item at the end of the edge */\n  node?: Maybe<Vehicle>;\n};\n\nexport type AllFilmsWithVariablesQueryQueryVariables = Exact<{\n  first: Scalars['Int']['input'];\n}>;\n\nexport type AllFilmsWithVariablesQueryQuery = {\n  __typename?: 'Root';\n  allFilms?: {\n    __typename?: 'FilmsConnection';\n    edges?: Array<{\n      __typename?: 'FilmsEdge';\n      node?: ({ __typename?: 'Film' } & { ' $fragmentRefs'?: { FilmItemFragment: FilmItemFragment } }) | null;\n    } | null> | null;\n  } | null;\n};\n\nexport type FilmItemFragment = {\n  __typename?: 'Film';\n  id: string;\n  title?: string | null;\n  releaseDate?: string | null;\n  producers?: Array<string | null> | null;\n} & { ' $fragmentName'?: 'FilmItemFragment' };\n\nexport const FilmItemFragmentDoc = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<FilmItemFragment, unknown>;\nexport const AllFilmsWithVariablesQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'allFilmsWithVariablesQuery' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'Int' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'allFilms' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'first' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'first' } },\n              },\n            ],\n            selectionSet: {\n              kind: 'SelectionSet',\n              selections: [\n                {\n                  kind: 'Field',\n                  name: { kind: 'Name', value: 'edges' },\n                  selectionSet: {\n                    kind: 'SelectionSet',\n                    selections: [\n                      {\n                        kind: 'Field',\n                        name: { kind: 'Name', value: 'node' },\n                        selectionSet: {\n                          kind: 'SelectionSet',\n                          selections: [{ kind: 'FragmentSpread', name: { kind: 'Name', value: 'FilmItem' } }],\n                        },\n                      },\n                    ],\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    },\n    {\n      kind: 'FragmentDefinition',\n      name: { kind: 'Name', value: 'FilmItem' },\n      typeCondition: { kind: 'NamedType', name: { kind: 'Name', value: 'Film' } },\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          { kind: 'Field', name: { kind: 'Name', value: 'id' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'title' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'releaseDate' } },\n          { kind: 'Field', name: { kind: 'Name', value: 'producers' } },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<AllFilmsWithVariablesQueryQuery, AllFilmsWithVariablesQueryQueryVariables>;\n"
  },
  {
    "path": "examples/vue/villus/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/vue/villus/src/main.ts",
    "content": "import { createApp, h } from 'vue';\nimport App from './App.vue';\nimport './assets/main.css';\n\ncreateApp({\n  render: () => h(App),\n}).mount('#app');\n"
  },
  {
    "path": "examples/vue/villus/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"esModuleInterop\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n    \"skipLibCheck\": true,\n    \"noEmit\": true\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.d.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"
  },
  {
    "path": "examples/vue/villus/tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n"
  },
  {
    "path": "examples/vue/villus/vite.config.ts",
    "content": "import { defineConfig } from 'vite';\nimport vue from '@vitejs/plugin-vue';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [vue()],\n});\n"
  },
  {
    "path": "examples/yoga-tests/README.md",
    "content": "# Yoga Testing Setup\n\nExample for executing typed GraphQL operations against your Yoga instance within tests using GraphQL Code Generator.\n\n[Learn more about Yoga - The GraphQL Server.](https://the-guild.dev/graphql/yoga-server)\n\n## Usage\n\nRun `yarn codegen --watch` for starting GraphQL Code Generator in watch mode.\n\nRun `yarn test` for running a tests located within `yoga.spec.ts`.\n"
  },
  {
    "path": "examples/yoga-tests/babel.config.js",
    "content": "module.exports = {\n  presets: [\n    ['@babel/preset-env', { targets: { node: process.versions.node.split('.')[0] } }],\n    '@babel/preset-typescript',\n  ],\n};\n"
  },
  {
    "path": "examples/yoga-tests/codegen.ts",
    "content": "import { type CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: './src/yoga.ts',\n  documents: ['src/**/*.ts'],\n  generates: {\n    './src/gql/': {\n      preset: 'client-preset',\n    },\n  },\n  hooks: { afterAllFileWrite: ['prettier --write'] },\n};\n\nexport default config;\n"
  },
  {
    "path": "examples/yoga-tests/package.json",
    "content": "{\n  \"name\": \"example-yoga-tests\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"graphql-yoga\": \"5.7.0\"\n  },\n  \"devDependencies\": {\n    \"@graphql-typed-document-node/core\": \"3.2.0\",\n    \"@graphql-codegen/cli\": \"6.2.1\",\n    \"@babel/core\": \"7.25.2\",\n    \"@babel/preset-env\": \"7.25.3\",\n    \"@babel/preset-typescript\": \"7.28.5\"\n  },\n  \"scripts\": {\n    \"test\": \"vitest --no-watch\",\n    \"codegen\": \"graphql-codegen --config codegen.ts\",\n    \"build\": \"tsc\",\n    \"test:end2end\": \"yarn test\"\n  },\n  \"bob\": false\n}\n"
  },
  {
    "path": "examples/yoga-tests/src/gql/fragment-masking.ts",
    "content": "/* eslint-disable */\nimport { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { FragmentDefinitionNode } from 'graphql';\nimport { Incremental } from './graphql';\n\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =\n  TDocumentType extends DocumentTypeDecoration<infer TType, any>\n    ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n      ? TKey extends string\n        ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n        : never\n      : never\n    : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType:\n    | FragmentType<DocumentTypeDecoration<TType, any>>\n    | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n    | null\n    | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n\nexport function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(\n  data: FT,\n  _fragment: F\n): FragmentType<F> {\n  return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n"
  },
  {
    "path": "examples/yoga-tests/src/gql/gql.ts",
    "content": "/* eslint-disable */\nimport * as types from './graphql';\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n/**\n * Map of all GraphQL operations in the project.\n *\n * This map has several performance disadvantages:\n * 1. It is not tree-shakeable, so it will include all operations in the project.\n * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n * 3. It does not support dead code elimination, so it will add unused operations.\n *\n * Therefore it is highly recommended to use the babel or swc plugin for production.\n * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n */\ntype Documents = {\n  '\\n      query HelloQuery {\\n        hello\\n      }\\n    ': typeof types.HelloQueryDocument;\n  '\\n      mutation EchoMutation($message: String!) {\\n        echo(message: $message)\\n      }\\n    ': typeof types.EchoMutationDocument;\n};\nconst documents: Documents = {\n  '\\n      query HelloQuery {\\n        hello\\n      }\\n    ': types.HelloQueryDocument,\n  '\\n      mutation EchoMutation($message: String!) {\\n        echo(message: $message)\\n      }\\n    ':\n    types.EchoMutationDocument,\n};\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n *\n *\n * @example\n * ```ts\n * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);\n * ```\n *\n * The query argument is unknown!\n * Please regenerate the types.\n */\nexport function graphql(source: string): unknown;\n\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n      query HelloQuery {\\n        hello\\n      }\\n    '\n): (typeof documents)['\\n      query HelloQuery {\\n        hello\\n      }\\n    '];\n/**\n * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n */\nexport function graphql(\n  source: '\\n      mutation EchoMutation($message: String!) {\\n        echo(message: $message)\\n      }\\n    '\n): (typeof documents)['\\n      mutation EchoMutation($message: String!) {\\n        echo(message: $message)\\n      }\\n    '];\n\nexport function graphql(source: string) {\n  return (documents as any)[source] ?? {};\n}\n\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n"
  },
  {
    "path": "examples/yoga-tests/src/gql/graphql.ts",
    "content": "/* eslint-disable */\nimport { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\nexport type Maybe<T> = T | null;\nexport type InputMaybe<T> = T | null | undefined;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string };\n  String: { input: string; output: string };\n  Boolean: { input: boolean; output: boolean };\n  Int: { input: number; output: number };\n  Float: { input: number; output: number };\n};\n\nexport type Mutation = {\n  __typename?: 'Mutation';\n  echo: Scalars['String']['output'];\n};\n\nexport type MutationEchoArgs = {\n  message: Scalars['String']['input'];\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  hello: Scalars['String']['output'];\n};\n\nexport type HelloQueryQueryVariables = Exact<{ [key: string]: never }>;\n\nexport type HelloQueryQuery = { __typename?: 'Query'; hello: string };\n\nexport type EchoMutationMutationVariables = Exact<{\n  message: Scalars['String']['input'];\n}>;\n\nexport type EchoMutationMutation = { __typename?: 'Mutation'; echo: string };\n\nexport const HelloQueryDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'HelloQuery' },\n      selectionSet: { kind: 'SelectionSet', selections: [{ kind: 'Field', name: { kind: 'Name', value: 'hello' } }] },\n    },\n  ],\n} as unknown as DocumentNode<HelloQueryQuery, HelloQueryQueryVariables>;\nexport const EchoMutationDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'mutation',\n      name: { kind: 'Name', value: 'EchoMutation' },\n      variableDefinitions: [\n        {\n          kind: 'VariableDefinition',\n          variable: { kind: 'Variable', name: { kind: 'Name', value: 'message' } },\n          type: { kind: 'NonNullType', type: { kind: 'NamedType', name: { kind: 'Name', value: 'String' } } },\n        },\n      ],\n      selectionSet: {\n        kind: 'SelectionSet',\n        selections: [\n          {\n            kind: 'Field',\n            name: { kind: 'Name', value: 'echo' },\n            arguments: [\n              {\n                kind: 'Argument',\n                name: { kind: 'Name', value: 'message' },\n                value: { kind: 'Variable', name: { kind: 'Name', value: 'message' } },\n              },\n            ],\n          },\n        ],\n      },\n    },\n  ],\n} as unknown as DocumentNode<EchoMutationMutation, EchoMutationMutationVariables>;\n"
  },
  {
    "path": "examples/yoga-tests/src/gql/index.ts",
    "content": "export * from './fragment-masking';\nexport * from './gql';\n"
  },
  {
    "path": "examples/yoga-tests/src/main.ts",
    "content": "import { createServer } from 'http';\nimport { yoga } from './yoga.js';\n\nconst server = createServer(yoga);\n\n// Start the server and you're done!\nserver.listen(4000, () => {\n  // eslint-disable-next-line no-console\n  console.info('Server is running on http://localhost:4000/graphql');\n});\n"
  },
  {
    "path": "examples/yoga-tests/src/yoga.spec.ts",
    "content": "import { describe, it, expect } from 'vitest';\nimport type { TypedDocumentNode } from '@graphql-typed-document-node/core';\nimport { type ExecutionResult, print } from 'graphql';\nimport { graphql } from './gql';\nimport { yoga } from './yoga';\n\nfunction executeOperation<TResult, TVariables>(\n  operation: TypedDocumentNode<TResult, TVariables>,\n  ...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]\n): Promise<ExecutionResult<TResult>> {\n  return Promise.resolve(\n    yoga.fetch('http://yoga/graphql', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        Accept: 'application/json',\n      },\n      body: JSON.stringify({\n        query: print(operation),\n        variables: variables ?? undefined,\n      }),\n    })\n  ).then(response => response.json());\n}\n\ndescribe('Yoga Tests', () => {\n  it('execute query operation', async () => {\n    const HelloQuery = graphql(/* GraphQL */ `\n      query HelloQuery {\n        hello\n      }\n    `);\n\n    const result = await executeOperation(HelloQuery);\n\n    expect(result.data?.hello).toEqual('Hello world!');\n  });\n\n  it('execute mutation operation', async () => {\n    const EchoMutation = graphql(/* GraphQL */ `\n      mutation EchoMutation($message: String!) {\n        echo(message: $message)\n      }\n    `);\n\n    const result = await executeOperation(EchoMutation, {\n      message: 'Ohayoo!',\n    });\n\n    expect(result.data?.echo).toEqual('Ohayoo!');\n  });\n\n  it('execute mutation operation (variant)', async () => {\n    const EchoMutation = graphql(/* GraphQL */ `\n      mutation EchoMutation($message: String!) {\n        echo(message: $message)\n      }\n    `);\n\n    const result = await executeOperation(EchoMutation, {\n      message: 'Konbanwa',\n    });\n\n    expect(result.data?.echo).toEqual('Konbanwa');\n  });\n});\n"
  },
  {
    "path": "examples/yoga-tests/src/yoga.ts",
    "content": "import { createSchema, createYoga } from 'graphql-yoga';\n\nconst schema = createSchema({\n  typeDefs: /* GraphQL */ `\n    type Query {\n      hello: String!\n    }\n\n    type Mutation {\n      echo(message: String!): String!\n    }\n  `,\n  resolvers: {\n    Query: {\n      hello: () => 'Hello world!',\n    },\n    Mutation: {\n      echo: (_, args) => args.message,\n    },\n  },\n});\n\nexport const yoga = createYoga({\n  schema,\n});\n"
  },
  {
    "path": "examples/yoga-tests/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"module\": \"Node16\",\n    \"outDir\": \"dist\",\n    \"skipLibCheck\": true\n  },\n  \"include\": [\"src/**/*\"]\n}\n"
  },
  {
    "path": "examples/yoga-tests/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'examples-yoga-tests',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"graphql-code-generator\",\n  \"private\": true,\n  \"engines\": {\n    \"node\": \">= 16.0.0\"\n  },\n  \"packageManager\": \"yarn@1.22.22\",\n  \"scripts\": {\n    \"postinstall\": \"patch-package && husky install\",\n    \"fix-bins\": \"node scripts/fix-bin.js\",\n    \"clean\": \"rimraf node_modules/\",\n    \"prebuild\": \"rimraf dist/ .bob/ tsconfig.tsbuildinfo\",\n    \"build\": \"bob build\",\n    \"postbuild\": \"yarn fix-bins\",\n    \"watch-build\": \"npx tsc-watch --project tsconfig.json --onSuccess \\\"bob build\\\"\",\n    \"rebuild\": \"bob build --incremental\",\n    \"test\": \"vitest\",\n    \"lint\": \"cross-env \\\"ESLINT_USE_FLAT_CONFIG=false\\\" eslint --cache --ignore-path .gitignore .\",\n    \"prettier\": \"prettier --cache --write --list-different .\",\n    \"prettier:check\": \"prettier --cache --check .\",\n    \"types:check\": \"tsc --noEmit\",\n    \"test-and-build\": \"yarn build && yarn test\",\n    \"ci:lint\": \"cross-env \\\"ESLINT_USE_FLAT_CONFIG=false\\\" eslint --cache --ignore-path .gitignore --output-file eslint_report.json --format json .\",\n    \"prerelease\": \"yarn build\",\n    \"release\": \"changeset publish\",\n    \"generate:examples:esm\": \"node packages/graphql-codegen-cli/dist/esm/bin.js --require dotenv/config --config ./dev-test/codegen.ts dotenv_config_path=dev-test/.env\",\n    \"generate:examples:cjs\": \"node packages/graphql-codegen-cli/dist/cjs/bin.js --require dotenv/config --config ./dev-test/codegen.ts dotenv_config_path=dev-test/.env\",\n    \"generate:examples\": \"yarn generate:examples:cjs\",\n    \"watch:examples:esm\": \"node packages/graphql-codegen-cli/dist/esm/bin.js --require dotenv/config --watch --config ./dev-test/codegen.ts dotenv_config_path=dev-test/.env\",\n    \"watch:examples:cjs\": \"node packages/graphql-codegen-cli/dist/cjs/bin.js --require dotenv/config --watch --config ./dev-test/codegen.ts dotenv_config_path=dev-test/.env\",\n    \"watch:examples\": \"yarn watch:examples:cjs\",\n    \"examples:codegen\": \"set -o xtrace && eval $(node scripts/print-example-ci-command.js codegen)\",\n    \"examples:build\": \"set -o xtrace && eval $(node scripts/print-example-ci-command.js build)\",\n    \"examples:test:end2end\": \"set -o xtrace && eval $(node scripts/print-example-ci-command.js test:end2end)\"\n  },\n  \"workspaces\": [\n    \"packages/*\",\n    \"packages/utils/*\",\n    \"packages/plugins/typescript/*\",\n    \"packages/plugins/other/*\",\n    \"packages/presets/*\",\n    \"website\",\n    \"examples/**/*\"\n  ],\n  \"devDependencies\": {\n    \"@babel/core\": \"7.25.2\",\n    \"@babel/preset-env\": \"7.25.3\",\n    \"@babel/preset-typescript\": \"7.28.5\",\n    \"@changesets/changelog-github\": \"0.6.0\",\n    \"@changesets/cli\": \"2.30.0\",\n    \"@theguild/eslint-config\": \"0.13.3\",\n    \"@theguild/prettier-config\": \"0.1.1\",\n    \"bob-the-bundler\": \"7.0.1\",\n    \"cross-env\": \"10.1.0\",\n    \"eslint\": \"9.9.0\",\n    \"eslint-plugin-tailwindcss\": \"npm:@hasparus/eslint-plugin-tailwindcss@3.17.5\",\n    \"graphql\": \"16.9.0\",\n    \"husky\": \"9.1.7\",\n    \"jest-diff\": \"30.0.5\",\n    \"lint-staged\": \"15.2.9\",\n    \"memfs\": \"4.36.3\",\n    \"patch-package\": \"8.0.0\",\n    \"prettier\": \"2.8.8\",\n    \"prettier-plugin-svelte\": \"2.10.1\",\n    \"rimraf\": \"6.0.1\",\n    \"ts-node\": \"10.9.2\",\n    \"tslib\": \"2.6.3\",\n    \"tsx\": \"4.17.0\",\n    \"typescript\": \"5.5.4\",\n    \"vite-tsconfig-paths\": \"6.1.1\",\n    \"vitest\": \"4.0.4\",\n    \"wrangler\": \"4.1.0\"\n  },\n  \"lint-staged\": {\n    \"packages/**/src/**/*.{ts,tsx}\": [\n      \"cross-env \\\"ESLINT_USE_FLAT_CONFIG=false\\\" eslint --fix\"\n    ],\n    \"**/*.{js,jsx,cjs,mjs,ts,tsx,graphql,gql,yml,yaml,json,md}\": [\n      \"prettier --write\"\n    ],\n    \"yarn.lock\": [\n      \"npx yarn-deduplicate\"\n    ]\n  },\n  \"resolutions\": {\n    \"typescript\": \"5.5.4\",\n    \"eslint-plugin-promise\": \"7.1.0\"\n  },\n  \"version\": \"0.0.0\"\n}\n"
  },
  {
    "path": "packages/graphql-cli-codegen-plugin/README.md",
    "content": "# GraphQL Code Generator plugin for GraphQL CLI\n\n<p align=\"center\">\n    <img src=\"https://github.com/dotansimha/graphql-code-generator/blob/master/logo.png?raw=true\" />\n</p>\n\nLive demo and full documentation: [the-guild.dev/graphql/codegen](https://the-guild.dev/graphql/codegen)\n\nProject repository: [graphql-code-generator](https://github.com/dotansimha/graphql-code-generator)\n\nThe plugin `@graphql-cli/codegen` is deprecated, and no longer maintained.\n\nPlease visit [Migrating from GraphQL-CLI to Inspector CLI](https://the-guild.dev/graphql/inspector/docs/migration-guides/from-graphql-cli) documentation to get more information about migration from `GraphQL-CLI` to `Inspector CLI` or visit [GraphQL-CLI documentation](../../website/src/pages/docs/guides/graphql-cli.mdx) in GraphQL Code Generator.\n"
  },
  {
    "path": "packages/graphql-codegen-cli/CHANGELOG.md",
    "content": "# @graphql-codegen/cli\n\n## 6.2.1\n\n### Patch Changes\n\n- [#10618](https://github.com/dotansimha/graphql-code-generator/pull/10618) [`e804925`](https://github.com/dotansimha/graphql-code-generator/commit/e804925361f326fe2fc7a2ee3f6db950bcd79dab) Thanks [@PalmerTurley34](https://github.com/PalmerTurley34)! - Honor per-output preset `importExtension` and `emitLegacyCommonJSImports` config instead of always using the root config values.\n\n## 6.2.0\n\n### Minor Changes\n\n- [#10617](https://github.com/dotansimha/graphql-code-generator/pull/10617) [`8c4db2a`](https://github.com/dotansimha/graphql-code-generator/commit/8c4db2abd0578d7b1c9b4197dfa41dae3ef6252b) Thanks [@ikusakov2](https://github.com/ikusakov2)! - Allow GraphQLSchema to be passed directly to generate({schema: ...}) function\n\n### Patch Changes\n\n- Updated dependencies [[`8c4db2a`](https://github.com/dotansimha/graphql-code-generator/commit/8c4db2abd0578d7b1c9b4197dfa41dae3ef6252b)]:\n  - @graphql-codegen/plugin-helpers@6.2.0\n\n## 6.1.3\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/apollo-engine-loader@^8.0.28` ↗︎](https://www.npmjs.com/package/@graphql-tools/apollo-engine-loader/v/8.0.28) (from `^8.0.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/code-file-loader@^8.1.28` ↗︎](https://www.npmjs.com/package/@graphql-tools/code-file-loader/v/8.1.28) (from `^8.0.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/git-loader@^8.0.32` ↗︎](https://www.npmjs.com/package/@graphql-tools/git-loader/v/8.0.32) (from `^8.0.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/github-loader@^9.0.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/github-loader/v/9.0.6) (from `^9.0.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/graphql-file-loader@^8.1.11` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-file-loader/v/8.1.11) (from `^8.0.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/json-file-loader@^8.0.26` ↗︎](https://www.npmjs.com/package/@graphql-tools/json-file-loader/v/8.0.26) (from `^8.0.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/load@^8.1.8` ↗︎](https://www.npmjs.com/package/@graphql-tools/load/v/8.1.8) (from `^8.1.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/url-loader@^9.0.6` ↗︎](https://www.npmjs.com/package/@graphql-tools/url-loader/v/9.0.6) (from `^9.0.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/utils@^11.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/11.0.0) (from `^10.0.0`, in `dependencies`)\n  - Updated dependency [`graphql-config@^5.1.6` ↗︎](https://www.npmjs.com/package/graphql-config/v/5.1.6) (from `^5.1.1`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/client-preset@5.2.4\n  - @graphql-codegen/core@5.0.1\n  - @graphql-codegen/plugin-helpers@6.1.1\n\n## 6.1.2\n\n### Patch Changes\n\n- [#10590](https://github.com/dotansimha/graphql-code-generator/pull/10590) [`e173e11`](https://github.com/dotansimha/graphql-code-generator/commit/e173e113331cd279fb9dec51203d8c5a34915999) Thanks [@ya2s](https://github.com/ya2s)! - Fix GraphQL Config loading to forward nested `extensions.codegen.config` options\n  when loading schemas/documents, matching `codegen.ts` behavior.\n\n## 6.1.1\n\n### Patch Changes\n\n- [#10569](https://github.com/dotansimha/graphql-code-generator/pull/10569) [`8cb7d43`](https://github.com/dotansimha/graphql-code-generator/commit/8cb7d4369d35bc6b71750d53385949ffddd072a7) Thanks [@etr2460](https://github.com/etr2460)! - fix(graphql-codegen-cli): Don't hang when 0 CPUs are found\n\n  Fixes generation when 0 CPUs are returned by os.cpus(), which occurs in sandbox environments.\n\n## 6.1.0\n\n### Minor Changes\n\n- [#10510](https://github.com/dotansimha/graphql-code-generator/pull/10510) [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670) Thanks [@nickmessing](https://github.com/nickmessing)! - add importExtension configuration option\n\n### Patch Changes\n\n- Updated dependencies [[`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670)]:\n  - @graphql-codegen/plugin-helpers@6.1.0\n  - @graphql-codegen/client-preset@5.2.0\n\n## 6.0.2\n\n### Patch Changes\n\n- [#10430](https://github.com/dotansimha/graphql-code-generator/pull/10430) [`aad7f03`](https://github.com/dotansimha/graphql-code-generator/commit/aad7f03bf812d671d3c60ff21be0b3b8da55d79f) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/github-loader@^9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/github-loader/v/9.0.0) (from `^8.0.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/url-loader@^9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/url-loader/v/9.0.0) (from `^8.0.0`, in `dependencies`)\n- Updated dependencies []:\n  - @graphql-codegen/client-preset@5.1.2\n\n## 6.0.1\n\n### Patch Changes\n\n- [#10468](https://github.com/dotansimha/graphql-code-generator/pull/10468) [`cb1b9d9`](https://github.com/dotansimha/graphql-code-generator/commit/cb1b9d99c413a96fde6c9af0b2315b3ad721ee4e) Thanks [@eddeee888](https://github.com/eddeee888)! - In watch mode, do not write output on failure\n\n  Previously, on partial or full failure, watch mode still write to output. However, since the output'd be an empty array, it will then call `removeStaleFiles` internally to remove all previously generated files.\n\n  This patch puts a temporary fix to avoid writing output on any failure to fix the described behaviour.\n\n  This also means the `config.allowPartialOutputs` does not work in watch mode for now.\n\n## 6.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop @graphql-tools/prisma-loader\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Add `allowPartialOutputs` flag to partially write successful generation to files\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Migrate inquirer to @inquirer/prompts\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Bump dependencies major versions:\n\n  - cosmiconfig v9\n  - debounce v2\n  - jiti v2.3\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Bump listr2 to v9\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/plugin-helpers@6.0.0\n  - @graphql-codegen/client-preset@5.0.0\n  - @graphql-codegen/core@5.0.0\n\n## 5.0.7\n\n### Patch Changes\n\n- [#10150](https://github.com/dotansimha/graphql-code-generator/pull/10150) [`e324382`](https://github.com/dotansimha/graphql-code-generator/commit/e3243824cfe0d7ab463cf0d5a6455715510959be) Thanks [@ArminWiebigke](https://github.com/ArminWiebigke)! - Allow functions to be passed as valid values for `UrlSchemaOptions.customFetch`. This was already possible, but the type definitions did not reflect that correctly.\n\n- [#10358](https://github.com/dotansimha/graphql-code-generator/pull/10358) [`157c823`](https://github.com/dotansimha/graphql-code-generator/commit/157c8236320f00b06c470e2289315179119d4504) Thanks [@eddeee888](https://github.com/eddeee888)! - Remove extraneous error stacktrace if fails to load `@parcel/watcher`\n\n- Updated dependencies [[`e324382`](https://github.com/dotansimha/graphql-code-generator/commit/e3243824cfe0d7ab463cf0d5a6455715510959be), [`98392fc`](https://github.com/dotansimha/graphql-code-generator/commit/98392fc5d91035b5b5b0ffdefd78d0398762a523)]:\n  - @graphql-codegen/plugin-helpers@5.1.1\n  - @graphql-codegen/client-preset@4.8.2\n\n## 5.0.6\n\n### Patch Changes\n\n- [#10338](https://github.com/dotansimha/graphql-code-generator/pull/10338) [`5d1c4e1`](https://github.com/dotansimha/graphql-code-generator/commit/5d1c4e127d860ff89590fd3a1d01493b3289ad00) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix ignoreNoDocuments=true swallowing all errors\n\n- [#10333](https://github.com/dotansimha/graphql-code-generator/pull/10333) [`10ab58d`](https://github.com/dotansimha/graphql-code-generator/commit/10ab58dbc183dff460c410ffc7cc759186f91d4c) Thanks [@eddeee888](https://github.com/eddeee888)! - Improve syntax error messages whilst loading schema/document\n\n- Updated dependencies [[`c5efba3`](https://github.com/dotansimha/graphql-code-generator/commit/c5efba34a7b422720be9ce32937dd19fb0784bae)]:\n  - @graphql-codegen/client-preset@4.8.1\n\n## 5.0.5\n\n### Patch Changes\n\n- [#10282](https://github.com/dotansimha/graphql-code-generator/pull/10282) [`7d7760d`](https://github.com/dotansimha/graphql-code-generator/commit/7d7760d55c21a99417c38ce5e77a6de22b5effcc) Thanks [@oprypkhantc](https://github.com/oprypkhantc)! - Fix watcher watching project root when schema URL is used\n\n## 5.0.4\n\n### Patch Changes\n\n- [#10248](https://github.com/dotansimha/graphql-code-generator/pull/10248) [`72eb86f`](https://github.com/dotansimha/graphql-code-generator/commit/72eb86f49bd86da6308d80f9401bcc09478ca886) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`@whatwg-node/fetch@^0.10.0` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.10.0) (from `^0.9.20`, in `dependencies`)\n\n- [#10227](https://github.com/dotansimha/graphql-code-generator/pull/10227) [`6f1741a`](https://github.com/dotansimha/graphql-code-generator/commit/6f1741af03689f8146178637ecabec18347e9331) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix schema pointers type to allow an array of pointers\n\n- Updated dependencies [[`8737dd8`](https://github.com/dotansimha/graphql-code-generator/commit/8737dd86b4ce3d14234a515fa494736bf7ec35dd), [`ed71811`](https://github.com/dotansimha/graphql-code-generator/commit/ed71811ace083be61c575609e361c629ed7c1740)]:\n  - @graphql-codegen/client-preset@4.6.0\n\n## 5.0.3\n\n### Patch Changes\n\n- [#10069](https://github.com/dotansimha/graphql-code-generator/pull/10069) [`8bb34e7`](https://github.com/dotansimha/graphql-code-generator/commit/8bb34e7cd23a8891313828291c9f2edd6a3b67bc) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`@whatwg-node/fetch@^0.9.20` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.9.20) (from `^0.8.0`, in `dependencies`)\n  - Updated dependency [`graphql-config@^5.1.1` ↗︎](https://www.npmjs.com/package/graphql-config/v/5.1.1) (from `^5.0.2`, in `dependencies`)\n\n- [`e0092b5`](https://github.com/dotansimha/graphql-code-generator/commit/e0092b548f51c95be19c232515cf9a72873e7b83) Thanks [@ardatan](https://github.com/ardatan)! - Bump whatwg-node and graphql-config\n\n- Updated dependencies [[`8471a18`](https://github.com/dotansimha/graphql-code-generator/commit/8471a180cd61dc03dedace87876c5973b09b35f8), [`67e7556`](https://github.com/dotansimha/graphql-code-generator/commit/67e75561a3e862f26cfbb40e8ec5a08f821f9ddf)]:\n  - @graphql-codegen/client-preset@4.4.0\n\n## 5.0.2\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/client-preset@4.2.2\n  - @graphql-codegen/core@4.0.2\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 5.0.1\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n\n  - Added dependency [`@graphql-codegen/client-preset@^4.1.0` ↗︎](https://www.npmjs.com/package/@graphql-codegen/client-preset/v/4.1.0) (to `dependencies`)\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - ignore events in `.git` directory\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - Surface error occurring during import of @parcel/watcher\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - Include @graphql-codegen/client-preset in @graphql-codegen/cli by default\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - fix watcher unable to find highest common directory on Windows\n\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/client-preset@4.2.0\n  - @graphql-codegen/core@4.0.1\n  - @graphql-codegen/plugin-helpers@5.0.2\n\n## 5.0.0\n\n### Major Changes\n\n- [#9506](https://github.com/dotansimha/graphql-code-generator/pull/9506) [`dd9c7e148`](https://github.com/dotansimha/graphql-code-generator/commit/dd9c7e14872f48592e530ff0d646449a5cb722b4) Thanks [@valkum](https://github.com/valkum)! - Make @parcel/watcher optional\n\n### Patch Changes\n\n- [#9513](https://github.com/dotansimha/graphql-code-generator/pull/9513) [`fdd19d24d`](https://github.com/dotansimha/graphql-code-generator/commit/fdd19d24df21d3257f3e969b79856d18b6f73123) Thanks [@cichelero](https://github.com/cichelero)! - Update yaml dependency to 2.3.1\n\n- Updated dependencies [[`bb1e0e96e`](https://github.com/dotansimha/graphql-code-generator/commit/bb1e0e96ed9d519684630cd7ea53869b48b4632e)]:\n  - @graphql-codegen/plugin-helpers@5.0.1\n\n## 4.0.1\n\n### Patch Changes\n\n- [#9479](https://github.com/dotansimha/graphql-code-generator/pull/9479) [`0aa444b5d`](https://github.com/dotansimha/graphql-code-generator/commit/0aa444b5d092565c321643a55fb05c7301e303bf) Thanks [@gilgardosh](https://github.com/gilgardosh)! - dependencies updates:\n\n  - Updated dependency [`graphql-config@^5.0.2` ↗︎](https://www.npmjs.com/package/graphql-config/v/5.0.2) (from `^5.0.1`, in `dependencies`)\n\n- [#9479](https://github.com/dotansimha/graphql-code-generator/pull/9479) [`0aa444b5d`](https://github.com/dotansimha/graphql-code-generator/commit/0aa444b5d092565c321643a55fb05c7301e303bf) Thanks [@gilgardosh](https://github.com/gilgardosh)! - Update graphql-config to v^5.0.2\n\n## 4.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Patch Changes\n\n- [#9449](https://github.com/dotansimha/graphql-code-generator/pull/9449) [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n\n  - Updated dependency [`graphql-config@^5.0.0` ↗︎](https://www.npmjs.com/package/graphql-config/v/5.0.0) (from `^4.5.0`, in `dependencies`)\n\n- [#9449](https://github.com/dotansimha/graphql-code-generator/pull/9449) [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n\n  - Updated dependency [`@graphql-tools/apollo-engine-loader@^8.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/apollo-engine-loader/v/8.0.0) (from `^7.3.6`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/code-file-loader@^8.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/code-file-loader/v/8.0.0) (from `^7.3.17`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/git-loader@^8.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/git-loader/v/8.0.0) (from `^7.2.13`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/github-loader@^8.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/github-loader/v/8.0.0) (from `^7.3.28`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/graphql-file-loader@^8.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/graphql-file-loader/v/8.0.0) (from `^7.5.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/json-file-loader@^8.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/json-file-loader/v/8.0.0) (from `^7.4.1`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/load@^8.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/load/v/8.0.0) (from `^7.8.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/prisma-loader@^8.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/prisma-loader/v/8.0.0) (from `^7.2.69`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/url-loader@^8.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/url-loader/v/8.0.0) (from `^7.17.17`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/utils@^10.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.0.0) (from `^9.0.0`, in `dependencies`)\n  - Updated dependency [`cosmiconfig@^8.1.3` ↗︎](https://www.npmjs.com/package/cosmiconfig/v/8.1.3) (from `^7.0.0`, in `dependencies`)\n  - Updated dependency [`graphql-config@^5.0.1` ↗︎](https://www.npmjs.com/package/graphql-config/v/5.0.1) (from `^4.5.0`, in `dependencies`)\n\n- [#9371](https://github.com/dotansimha/graphql-code-generator/pull/9371) [`d431f426e`](https://github.com/dotansimha/graphql-code-generator/commit/d431f426eb594b820ac712b9f5c616f4badf6bff) Thanks [@Axxxx0n](https://github.com/Axxxx0n)! - Fixed option ignoreNoDocuments when using graphql configs\n\n- [#9275](https://github.com/dotansimha/graphql-code-generator/pull/9275) [`2a5da5894`](https://github.com/dotansimha/graphql-code-generator/commit/2a5da589468eb5970587187adae9892ff1f13134) Thanks [@milesrichardson](https://github.com/milesrichardson)! - Trigger rebuilds in watch mode while respecting rules of precedence and negation, both in terms of global (top-level) config vs. local (per-output target) config, and in terms of watch patterns (higher priority) vs. documents/schemas (lower priority). This fixes an issue with overly-aggressive rebuilds during watch mode.\n\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0)]:\n  - @graphql-codegen/core@4.0.0\n  - @graphql-codegen/plugin-helpers@5.0.0\n\n## 3.3.1\n\n### Patch Changes\n\n- [#9267](https://github.com/dotansimha/graphql-code-generator/pull/9267) [`183749346`](https://github.com/dotansimha/graphql-code-generator/commit/1837493464e0b661520deb38c1e5cbd5ed46f978) Thanks [@milesrichardson](https://github.com/milesrichardson)! - Fix watch mode to listen to longest common directory prefix of relevant files, rather than only files below the current working directory (fixes #9266).\n\n- [#9280](https://github.com/dotansimha/graphql-code-generator/pull/9280) [`ca1d72c40`](https://github.com/dotansimha/graphql-code-generator/commit/ca1d72c408a5f45ecdb17d556e1a3f7d6811cdf4) Thanks [@saihaj](https://github.com/saihaj)! - fix the default output directory for init command\n\n## 3.3.0\n\n### Minor Changes\n\n- [#9151](https://github.com/dotansimha/graphql-code-generator/pull/9151) [`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29) Thanks [@'./user/schema.mappers#UserMapper',](https://github.com/'./user/schema.mappers#UserMapper',)! - Add `watchPattern` config option for `generates` sections.\n\n  By default, `watch` mode automatically watches all GraphQL schema and document files. This means when a change is detected, Codegen CLI is run.\n\n  A user may want to run Codegen CLI when non-schema and non-document files are changed. Each `generates` section now has a `watchPattern` option to allow more file patterns to be added to the list of patterns to watch.\n\n  In the example below, mappers are exported from `schema.mappers.ts` files. We want to re-run Codegen if the content of `*.mappers.ts` files change because they change the generated types file. To solve this, we can add mapper file patterns to watch using the glob pattern used for schema and document files.\n\n  ```ts\n  // codegen.ts\n  const config: CodegenConfig = {\n    schema: 'src/schema/**/*.graphql',\n    generates: {\n      'src/schema/types.ts': {\n        plugins: ['typescript', 'typescript-resolvers'],\n        config: {\n          mappers: {\n\n            Book: './book/schema.mappers#BookMapper',\n          },\n        }\n        watchPattern: 'src/schema/**/*.mappers.ts', // Watches mapper files in `watch` mode. Use an array for multiple patterns e.g. `['src/*.pattern1.ts','src/*.pattern2.ts']`\n      },\n    },\n  };\n  ```\n\n  Then, run Codegen CLI in `watch` mode:\n\n  ```shell\n  yarn graphql-codegen --watch\n  ```\n\n  Now, updating `*.mappers.ts` files re-runs Codegen! 🎉\n\n  Note: `watchPattern` is only used in `watch` mode i.e. running CLI with `--watch` flag.\n\n### Patch Changes\n\n- Updated dependencies [[`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29), [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087)]:\n  - @graphql-codegen/plugin-helpers@4.2.0\n\n## 3.2.2\n\n### Patch Changes\n\n- [#9086](https://github.com/dotansimha/graphql-code-generator/pull/9086) [`a34cef35b`](https://github.com/dotansimha/graphql-code-generator/commit/a34cef35b4cbbe83c54bd92f88882b325df173fd) Thanks [@beerose](https://github.com/beerose)! - dependencies updates:\n\n  - Updated dependency [`graphql-config@^4.5.0` ↗︎](https://www.npmjs.com/package/graphql-config/v/4.5.0) (from `^4.4.0`, in `dependencies`)\n  - Added dependency [`jiti@^1.17.1` ↗︎](https://www.npmjs.com/package/jiti/v/1.17.1) (to `dependencies`)\n  - Removed dependency [`cosmiconfig-typescript-loader@^4.3.0` ↗︎](https://www.npmjs.com/package/cosmiconfig-typescript-loader/v/4.3.0) (from `dependencies`)\n  - Removed dependency [`ts-node@^10.9.1` ↗︎](https://www.npmjs.com/package/ts-node/v/10.9.1) (from `dependencies`)\n\n- [#9086](https://github.com/dotansimha/graphql-code-generator/pull/9086) [`a34cef35b`](https://github.com/dotansimha/graphql-code-generator/commit/a34cef35b4cbbe83c54bd92f88882b325df173fd) Thanks [@beerose](https://github.com/beerose)! - Support `codegen.ts` in ESM projects\n\n## 3.2.1\n\n### Patch Changes\n\n- [#9051](https://github.com/dotansimha/graphql-code-generator/pull/9051) [`f7313f7ca`](https://github.com/dotansimha/graphql-code-generator/commit/f7313f7cabd81ee708e3345b2934aeeb978f65a3) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n\n  - Added dependency [`micromatch@^4.0.5` ↗︎](https://www.npmjs.com/package/micromatch/v/4.0.5) (to `dependencies`)\n\n- [#9051](https://github.com/dotansimha/graphql-code-generator/pull/9051) [`f7313f7ca`](https://github.com/dotansimha/graphql-code-generator/commit/f7313f7cabd81ee708e3345b2934aeeb978f65a3) Thanks [@saihaj](https://github.com/saihaj)! - only run generate for files that users have listed in config to avoid running this over every change that codegen is not supposed to execute\n\n## 3.2.0\n\n### Minor Changes\n\n- [#9009](https://github.com/dotansimha/graphql-code-generator/pull/9009) [`288ed0977`](https://github.com/dotansimha/graphql-code-generator/commit/288ed097745f9c06dd74a9398a050866caa3942a) Thanks [@saihaj](https://github.com/saihaj)! - use @parcel/watcher for improved watch functionality\n\n### Patch Changes\n\n- [#9009](https://github.com/dotansimha/graphql-code-generator/pull/9009) [`288ed0977`](https://github.com/dotansimha/graphql-code-generator/commit/288ed097745f9c06dd74a9398a050866caa3942a) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Added dependency [`@parcel/watcher@^2.1.0` ↗︎](https://www.npmjs.com/package/@parcel/watcher/v/2.1.0) (to `dependencies`)\n  - Removed dependency [`chokidar@^3.5.2` ↗︎](https://www.npmjs.com/package/chokidar/v/3.5.2) (from `dependencies`)\n\n## 3.1.0\n\n### Minor Changes\n\n- [#8893](https://github.com/dotansimha/graphql-code-generator/pull/8893) [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c) Thanks [@n1ru4l](https://github.com/n1ru4l)! - It is no longer mandatory to declare an empty plugins array when using a preset\n\n- [#8723](https://github.com/dotansimha/graphql-code-generator/pull/8723) [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15) Thanks [@kazekyo](https://github.com/kazekyo)! - Introduce a new feature called DocumentTransform.\n\n  DocumentTransform is a functionality that allows you to modify `documents` before they are processed by plugins. You can use functions passed to the `documentTransforms` option to make changes to GraphQL documents.\n\n  To use this feature, you can write `documentTransforms` as follows:\n\n  ```ts\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: [\n          {\n            transform: ({ documents }) => {\n              // Make some changes to the documents\n              return documents\n            }\n          }\n        ]\n      }\n    }\n  }\n  export default config\n  ```\n\n  For instance, to remove a `@localOnlyDirective` directive from `documents`, you can write the following code:\n\n  ```js\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n  import { visit } from 'graphql'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: [\n          {\n            transform: ({ documents }) => {\n              return documents.map(documentFile => {\n                documentFile.document = visit(documentFile.document, {\n                  Directive: {\n                    leave(node) {\n                      if (node.name.value === 'localOnlyDirective') return null\n                    }\n                  }\n                })\n                return documentFile\n              })\n            }\n          }\n        ]\n      }\n    }\n  }\n  export default config\n  ```\n\n  DocumentTransform can also be specified by file name. You can create a custom file for a specific transformation and pass it to `documentTransforms`.\n\n  Let's create the document transform as a file:\n\n  ```js\n  module.exports = {\n    transform: ({ documents }) => {\n      // Make some changes to the documents\n      return documents\n    }\n  }\n  ```\n\n  Then, you can specify the file name as follows:\n\n  ```ts\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: ['./my-document-transform.js']\n      }\n    }\n  }\n  export default config\n  ```\n\n### Patch Changes\n\n- [#9000](https://github.com/dotansimha/graphql-code-generator/pull/9000) [`4c422ccf6`](https://github.com/dotansimha/graphql-code-generator/commit/4c422ccf6384cfb0d0949ebe5567923973b1a044) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`@whatwg-node/fetch@^0.8.0` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.8.0) (from `^0.6.0`, in `dependencies`)\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/core@3.1.0\n  - @graphql-codegen/plugin-helpers@4.1.0\n\n## 3.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- [#8883](https://github.com/dotansimha/graphql-code-generator/pull/8883) [`321d5112e`](https://github.com/dotansimha/graphql-code-generator/commit/321d5112e802fd1d96daf556095b102a81763804) Thanks [@Solo-steven](https://github.com/Solo-steven)! - Fix PluckConfig overwrite problem.\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/core@3.0.0\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 2.16.5\n\n### Patch Changes\n\n- [#8865](https://github.com/dotansimha/graphql-code-generator/pull/8865) [`e4d073b16`](https://github.com/dotansimha/graphql-code-generator/commit/e4d073b16f904e0879a3d15774ddc9826b0ab5e5) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n\n  - Updated dependency [`@graphql-codegen/core@^2.6.8` ↗︎](https://www.npmjs.com/package/@graphql-codegen/core/v/2.6.8) (from `2.6.8`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/load@^7.8.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/load/v/7.8.0) (from `7.8.0`, in `dependencies`)\n  - Updated dependency [`cosmiconfig-typescript-loader@^4.3.0` ↗︎](https://www.npmjs.com/package/cosmiconfig-typescript-loader/v/4.3.0) (from `4.3.0`, in `dependencies`)\n  - Updated dependency [`graphql-config@^4.4.0` ↗︎](https://www.npmjs.com/package/graphql-config/v/4.4.0) (from `4.4.0`, in `dependencies`)\n  - Added dependency [`ts-node@^10.9.1` ↗︎](https://www.npmjs.com/package/ts-node/v/10.9.1) (to `dependencies`)\n  - Removed dependency [`ts-node@>=10` ↗︎](https://www.npmjs.com/package/ts-node/v/10.0.0) (from `peerDependencies`)\n\n- [#8808](https://github.com/dotansimha/graphql-code-generator/pull/8808) [`884d25c4e`](https://github.com/dotansimha/graphql-code-generator/commit/884d25c4edb099a46bffb23ffd935abec7d14f80) Thanks [@rwu823](https://github.com/rwu823)! - fix: `gqlMagicComment` type\n\n- [#8865](https://github.com/dotansimha/graphql-code-generator/pull/8865) [`e4d073b16`](https://github.com/dotansimha/graphql-code-generator/commit/e4d073b16f904e0879a3d15774ddc9826b0ab5e5) Thanks [@n1ru4l](https://github.com/n1ru4l)! - move ts-node from peer dependencies to dependencies\n\n## 2.16.4\n\n### Patch Changes\n\n- [#8770](https://github.com/dotansimha/graphql-code-generator/pull/8770) [`4774247e9`](https://github.com/dotansimha/graphql-code-generator/commit/4774247e9d29838075660d0e08c6b3c6ea57689f) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`graphql-config@4.4.0` ↗︎](https://www.npmjs.com/package/graphql-config/v/4.4.0) (from `4.3.6`, in `dependencies`)\n\n- [#8790](https://github.com/dotansimha/graphql-code-generator/pull/8790) [`fe12b4826`](https://github.com/dotansimha/graphql-code-generator/commit/fe12b4826d666ef69c38cd72bdd44f1bb262caf6) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`@whatwg-node/fetch@^0.6.0` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.6.0) (from `^0.5.0`, in `dependencies`)\n\n## 2.16.3\n\n### Patch Changes\n\n- [#8779](https://github.com/dotansimha/graphql-code-generator/pull/8779) [`ad5d83313`](https://github.com/dotansimha/graphql-code-generator/commit/ad5d83313fe146f0593df7ae2efa3c35459e577a) Thanks [@louisscruz](https://github.com/louisscruz)! - add ts-node as a peerDependency\n\n## 2.16.2\n\n### Patch Changes\n\n- [#8715](https://github.com/dotansimha/graphql-code-generator/pull/8715) [`b1512a59a`](https://github.com/dotansimha/graphql-code-generator/commit/b1512a59a0195c1f67a7e87d6a450e98d115df39) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`cosmiconfig-typescript-loader@4.2.0` ↗︎](https://www.npmjs.com/package/cosmiconfig-typescript-loader/v/4.2.0) (from `4.1.1`, in `dependencies`)\n\n- [#8729](https://github.com/dotansimha/graphql-code-generator/pull/8729) [`e6ff224fb`](https://github.com/dotansimha/graphql-code-generator/commit/e6ff224fb70cab38e30a963eb9135b2f6257e46c) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`cosmiconfig-typescript-loader@4.3.0` ↗︎](https://www.npmjs.com/package/cosmiconfig-typescript-loader/v/4.3.0) (from `4.2.0`, in `dependencies`)\n\n- [#8771](https://github.com/dotansimha/graphql-code-generator/pull/8771) [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`@graphql-tools/utils@^9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/9.0.0) (from `^8.9.0`, in `dependencies`)\n\n- [#8765](https://github.com/dotansimha/graphql-code-generator/pull/8765) [`a9c5414d2`](https://github.com/dotansimha/graphql-code-generator/commit/a9c5414d2ca4d0138eed3d14b0c22046128607dc) Thanks [@aniketdd](https://github.com/aniketdd)! - update @graphql-tools/prisma-loader\n\n- Updated dependencies [[`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`6c6b6f2df`](https://github.com/dotansimha/graphql-code-generator/commit/6c6b6f2df88a3a37b437a25320dab5590f033316)]:\n  - @graphql-codegen/plugin-helpers@3.1.2\n\n## 2.16.1\n\n### Patch Changes\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81), [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n  - @graphql-codegen/core@2.6.8\n\n## 2.16.0\n\n### Minor Changes\n\n- [#8662](https://github.com/dotansimha/graphql-code-generator/pull/8662) [`c0183810f`](https://github.com/dotansimha/graphql-code-generator/commit/c0183810f0178aec6f49ab8a6f35f7adc4d9f13e) Thanks [@jantimon](https://github.com/jantimon)! - the life cycle hook beforeOneFileWrite is now able to modify the generated content\n\n### Patch Changes\n\n- Updated dependencies [[`c0183810f`](https://github.com/dotansimha/graphql-code-generator/commit/c0183810f0178aec6f49ab8a6f35f7adc4d9f13e)]:\n  - @graphql-codegen/plugin-helpers@3.1.0\n\n## 2.15.1\n\n### Patch Changes\n\n- [#8673](https://github.com/dotansimha/graphql-code-generator/pull/8673) [`a07b6d6c1`](https://github.com/dotansimha/graphql-code-generator/commit/a07b6d6c1b05b2f77efb398b05d29130bae429e9) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n\n  - Removed dependency [`ansi-escapes@^4.3.1` ↗︎](https://www.npmjs.com/package/ansi-escapes/v/4.3.1) (from `dependencies`)\n\n- [#8706](https://github.com/dotansimha/graphql-code-generator/pull/8706) [`8ff9b41bd`](https://github.com/dotansimha/graphql-code-generator/commit/8ff9b41bd9323b6f3dde2014fecc4fd39c6a26fc) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`@whatwg-node/fetch@^0.5.0` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.5.0) (from `^0.3.0`, in `dependencies`)\n\n- [#8661](https://github.com/dotansimha/graphql-code-generator/pull/8661) [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482) Thanks [@jantimon](https://github.com/jantimon)! - refactor hook execution\n\n- [#8652](https://github.com/dotansimha/graphql-code-generator/pull/8652) [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84) Thanks [@jantimon](https://github.com/jantimon)! - improve typings for life cycle hooks\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n  - @graphql-codegen/core@2.6.7\n\n## 2.15.0\n\n### Minor Changes\n\n- [#8590](https://github.com/dotansimha/graphql-code-generator/pull/8590) [`2c7fa51c6`](https://github.com/dotansimha/graphql-code-generator/commit/2c7fa51c628a0337f2abfe1b91fe00c6d5fbe749) Thanks [@Diizzayy](https://github.com/Diizzayy)! - register TypeScriptLoader when needed\n\n## 2.14.1\n\n### Patch Changes\n\n- [#8642](https://github.com/dotansimha/graphql-code-generator/pull/8642) [`5afa923e8`](https://github.com/dotansimha/graphql-code-generator/commit/5afa923e8e4e8db9bbd602e8abf6a193761a282d) Thanks [@jantimon](https://github.com/jantimon)! - faster type generation\n\n- [#8653](https://github.com/dotansimha/graphql-code-generator/pull/8653) [`d0bc51283`](https://github.com/dotansimha/graphql-code-generator/commit/d0bc51283bb7e496f8933511a8ff5ac2ba547bc8) Thanks [@saihaj](https://github.com/saihaj)! - fix bad concurrency config\n\n## 2.14.0\n\n### Minor Changes\n\n- [#8647](https://github.com/dotansimha/graphql-code-generator/pull/8647) [`40a6761a6`](https://github.com/dotansimha/graphql-code-generator/commit/40a6761a602fca592c6f4f0653c819e8debe007b) Thanks [@charlypoly](https://github.com/charlypoly)! - Enable support for loading TS files with import assertions\n\n### Patch Changes\n\n- [#8647](https://github.com/dotansimha/graphql-code-generator/pull/8647) [`40a6761a6`](https://github.com/dotansimha/graphql-code-generator/commit/40a6761a602fca592c6f4f0653c819e8debe007b) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/code-file-loader@^7.3.13` ↗︎](https://www.npmjs.com/package/@graphql-tools/code-file-loader/v/7.3.13) (from `^7.3.1`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/git-loader@^7.2.13` ↗︎](https://www.npmjs.com/package/@graphql-tools/git-loader/v/7.2.13) (from `^7.2.1`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/github-loader@^7.3.20` ↗︎](https://www.npmjs.com/package/@graphql-tools/github-loader/v/7.3.20) (from `^7.3.6`, in `dependencies`)\n\n## 2.13.12\n\n### Patch Changes\n\n- Updated dependencies [[`45eb2b18a`](https://github.com/dotansimha/graphql-code-generator/commit/45eb2b18adf25366248bf8d67ef696431db5ee0e), [`45eb2b18a`](https://github.com/dotansimha/graphql-code-generator/commit/45eb2b18adf25366248bf8d67ef696431db5ee0e)]:\n  - @graphql-codegen/core@2.6.6\n\n## 2.13.11\n\n### Patch Changes\n\n- [#8556](https://github.com/dotansimha/graphql-code-generator/pull/8556) [`64e553c3f`](https://github.com/dotansimha/graphql-code-generator/commit/64e553c3f62618a2aedf122d292e2700fd93d6e1) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n  - Updated dependency [`@graphql-codegen/core@2.6.4` ↗︎](https://www.npmjs.com/package/@graphql-codegen/core/v/2.6.4) (from `2.6.3`, in `dependencies`)\n- Updated dependencies [[`64e553c3f`](https://github.com/dotansimha/graphql-code-generator/commit/64e553c3f62618a2aedf122d292e2700fd93d6e1)]:\n  - @graphql-codegen/core@2.6.5\n\n## 2.13.10\n\n### Patch Changes\n\n- Updated dependencies [[`516170ef6`](https://github.com/dotansimha/graphql-code-generator/commit/516170ef6cb636c950d560ddf12fa1d2f7ee1c57), [`516170ef6`](https://github.com/dotansimha/graphql-code-generator/commit/516170ef6cb636c950d560ddf12fa1d2f7ee1c57)]:\n  - @graphql-codegen/core@2.6.4\n\n## 2.13.9\n\n### Patch Changes\n\n- [#8525](https://github.com/dotansimha/graphql-code-generator/pull/8525) [`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127) Thanks [@charlypoly](https://github.com/charlypoly)! - remove `DetailledError`, not supported by Listr renderer\n\n- Updated dependencies [[`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127)]:\n  - @graphql-codegen/core@2.6.3\n  - @graphql-codegen/plugin-helpers@2.7.2\n\n## 2.13.8\n\n### Patch Changes\n\n- [#8535](https://github.com/dotansimha/graphql-code-generator/pull/8535) [`88aa38ff9`](https://github.com/dotansimha/graphql-code-generator/commit/88aa38ff9eb94b66d783a4af3116d9d3313fdbfd) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n\n  - Updated dependency [`@graphql-tools/load@7.8.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/load/v/7.8.0) (from `^7.7.1`, in `dependencies`)\n\n- [#8535](https://github.com/dotansimha/graphql-code-generator/pull/8535) [`88aa38ff9`](https://github.com/dotansimha/graphql-code-generator/commit/88aa38ff9eb94b66d783a4af3116d9d3313fdbfd) Thanks [@charlypoly](https://github.com/charlypoly)! - Upgrade `@graphql-tools/load` to get benefits of debug mode\n\n## 2.13.7\n\n### Patch Changes\n\n- [#8481](https://github.com/dotansimha/graphql-code-generator/pull/8481) [`8473682c4`](https://github.com/dotansimha/graphql-code-generator/commit/8473682c48559382b0a3edd4a494aeaf1c5b99ff) Thanks [@charlypoly](https://github.com/charlypoly)! - ensure to generate `codegen.ts` in a typescript setup\n\n## 2.13.6\n\n### Patch Changes\n\n- [#8383](https://github.com/dotansimha/graphql-code-generator/pull/8383) [`c4d9566c7`](https://github.com/dotansimha/graphql-code-generator/commit/c4d9566c792413fa26a537bce268a547c61e5f13) Thanks [@vhenzl](https://github.com/vhenzl)! - Fix `executeHooks` to quote args for shell command\n\n## 2.13.5\n\n### Patch Changes\n\n- [#8452](https://github.com/dotansimha/graphql-code-generator/pull/8452) [`cb1f93618`](https://github.com/dotansimha/graphql-code-generator/commit/cb1f93618b3c92cd092b740973d2469c232c2c00) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n\n  - Updated dependency [`graphql-config@4.3.6` ↗︎](https://www.npmjs.com/package/graphql-config/v/4.3.6) (from `^4.3.5`, in `dependencies`)\n\n- [#8452](https://github.com/dotansimha/graphql-code-generator/pull/8452) [`cb1f93618`](https://github.com/dotansimha/graphql-code-generator/commit/cb1f93618b3c92cd092b740973d2469c232c2c00) Thanks [@charlypoly](https://github.com/charlypoly)! - conflict with `graphql-config` also using TypeScriptLoader(), causing a double `ts-node` register.\n\n## 2.13.4\n\n### Patch Changes\n\n- [#8441](https://github.com/dotansimha/graphql-code-generator/pull/8441) [`6785f7f0d`](https://github.com/dotansimha/graphql-code-generator/commit/6785f7f0df6b3eb14d30abf37924791c45a4d586) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n\n  - Added dependency [`cosmiconfig-typescript-loader@4.1.1` ↗︎](https://www.npmjs.com/package/cosmiconfig-typescript-loader/v/4.1.1) (to `dependencies`)\n  - Removed dependency [`cosmiconfig-typescript-swc-loader@0.0.2` ↗︎](https://www.npmjs.com/package/cosmiconfig-typescript-swc-loader/v/0.0.2) (from `dependencies`)\n\n- [#8441](https://github.com/dotansimha/graphql-code-generator/pull/8441) [`6785f7f0d`](https://github.com/dotansimha/graphql-code-generator/commit/6785f7f0df6b3eb14d30abf37924791c45a4d586) Thanks [@charlypoly](https://github.com/charlypoly)! - fix(cli): revert to `cosmiconfig-typescript-loader`\n\n## 2.13.3\n\n### Patch Changes\n\n- [#8415](https://github.com/dotansimha/graphql-code-generator/pull/8415) [`15d500776`](https://github.com/dotansimha/graphql-code-generator/commit/15d50077680ff96a8d09cc65acd2f82683e67fb5) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n\n  - Added dependency [`cosmiconfig-typescript-swc-loader@0.0.2` ↗︎](https://www.npmjs.com/package/cosmiconfig-typescript-swc-loader/v/0.0.2) (to `dependencies`)\n  - Removed dependency [`cosmiconfig-typescript-loader@4.0.0` ↗︎](https://www.npmjs.com/package/cosmiconfig-typescript-loader/v/4.0.0) (from `dependencies`)\n\n- [#8415](https://github.com/dotansimha/graphql-code-generator/pull/8415) [`15d500776`](https://github.com/dotansimha/graphql-code-generator/commit/15d50077680ff96a8d09cc65acd2f82683e67fb5) Thanks [@charlypoly](https://github.com/charlypoly)! - feat(cli): drop peerDep on \"typescript\" by using `cosmiconfig-typescript-swc-loader`\n\n## 2.13.2\n\n### Patch Changes\n\n- [#8427](https://github.com/dotansimha/graphql-code-generator/pull/8427) [`5524ac447`](https://github.com/dotansimha/graphql-code-generator/commit/5524ac447612ff05bfd68f4b758dfcd0fa9e7356) Thanks [@charlypoly](https://github.com/charlypoly)! - Fix issue with `graphql-codegen init` installation wizard\n\n## 2.13.1\n\n### Patch Changes\n\n- [#8405](https://github.com/dotansimha/graphql-code-generator/pull/8405) [`7f7e52bc2`](https://github.com/dotansimha/graphql-code-generator/commit/7f7e52bc22749d1dd6946510856103ab683a1807) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n\n  - Removed dependency [`@graphql-codegen/client-preset@1.0.1` ↗︎](https://www.npmjs.com/package/@graphql-codegen/client-preset/v/1.0.1) (from `dependencies`)\n\n- [#8405](https://github.com/dotansimha/graphql-code-generator/pull/8405) [`7f7e52bc2`](https://github.com/dotansimha/graphql-code-generator/commit/7f7e52bc22749d1dd6946510856103ab683a1807) Thanks [@charlypoly](https://github.com/charlypoly)! - remove `@graphql-codegen/client-preset` direct dependency\n\n## 2.13.0\n\n### Minor Changes\n\n- [#8302](https://github.com/dotansimha/graphql-code-generator/pull/8302) [`876844e76`](https://github.com/dotansimha/graphql-code-generator/commit/876844e7644a917172f09b3c4eb54a2f4c90e4c6) Thanks [@charlypoly](https://github.com/charlypoly)! - **`@graphql-codegen/gql-tag-operations` and `@graphql-codegen/gql-tag-operations-preset`**\n\n  Introduce a `gqlTagName` configuration option\n\n  ***\n\n  **`@graphql-codegen/client-preset`**\n\n  New preset for GraphQL Code Generator v3, more information on the RFC: https://github.com/dotansimha/graphql-code-generator/issues/8296\n\n  ***\n\n  **`@graphql-codegen/cli`**\n\n  Update init wizard with 3.0 recommendations (`codegen.ts`, `client` preset)\n\n### Patch Changes\n\n- [#8302](https://github.com/dotansimha/graphql-code-generator/pull/8302) [`876844e76`](https://github.com/dotansimha/graphql-code-generator/commit/876844e7644a917172f09b3c4eb54a2f4c90e4c6) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n  - Updated dependency [`@graphql-codegen/plugin-helpers@^2.6.2` ↗︎](https://www.npmjs.com/package/@graphql-codegen/plugin-helpers/v/2.6.2) (from `^2.7.1`, in `dependencies`)\n  - Updated dependency [`@whatwg-node/fetch@^0.3.0` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/0.3.0) (from `^0.4.0`, in `dependencies`)\n  - Updated dependency [`cosmiconfig-typescript-loader@4.0.0` ↗︎](https://www.npmjs.com/package/cosmiconfig-typescript-loader/v/4.0.0) (from `^4.0.0`, in `dependencies`)\n  - Added dependency [`@babel/generator@^7.18.13` ↗︎](https://www.npmjs.com/package/@babel/generator/v/7.18.13) (to `dependencies`)\n  - Added dependency [`@babel/template@^7.18.10` ↗︎](https://www.npmjs.com/package/@babel/template/v/7.18.10) (to `dependencies`)\n  - Added dependency [`@babel/types@^7.18.13` ↗︎](https://www.npmjs.com/package/@babel/types/v/7.18.13) (to `dependencies`)\n  - Added dependency [`@graphql-codegen/client-preset@1.0.1-alpha-20220823170145-c93d8aee3` ↗︎](https://www.npmjs.com/package/@graphql-codegen/client-preset/v/1.0.1) (to `dependencies`)\n- Updated dependencies [[`876844e76`](https://github.com/dotansimha/graphql-code-generator/commit/876844e7644a917172f09b3c4eb54a2f4c90e4c6)]:\n  - @graphql-codegen/client-preset@1.0.1\n\n## 2.12.2\n\n### Patch Changes\n\n- [#8384](https://github.com/dotansimha/graphql-code-generator/pull/8384) [`9d3eedaea`](https://github.com/dotansimha/graphql-code-generator/commit/9d3eedaea6a5a505a8f693378bed44a1648a3a37) Thanks [@charlypoly](https://github.com/charlypoly)! - CLI: properly print error that occurred during hook execution\n\n## 2.12.1\n\n### Patch Changes\n\n- [#8335](https://github.com/dotansimha/graphql-code-generator/pull/8335) [`3e121d92e`](https://github.com/dotansimha/graphql-code-generator/commit/3e121d92ebd563a82dbc367cd3e9194ebe5ca1ee) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`@whatwg-node/fetch@^0.4.0` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/null) (from `^0.3.0`, in `dependencies`)\n\n- [#8368](https://github.com/dotansimha/graphql-code-generator/pull/8368) [`4113b1bd3`](https://github.com/dotansimha/graphql-code-generator/commit/4113b1bd39f3d32759c68a292e8492a0dd4f7371) Thanks [@charlypoly](https://github.com/charlypoly)! - fix(cli): support ApolloEngine loader in TypeScript config\n\n- Updated dependencies [[`4113b1bd3`](https://github.com/dotansimha/graphql-code-generator/commit/4113b1bd39f3d32759c68a292e8492a0dd4f7371)]:\n  - @graphql-codegen/plugin-helpers@2.7.1\n\n## 2.12.0\n\n### Minor Changes\n\n- [#8301](https://github.com/dotansimha/graphql-code-generator/pull/8301) [`2ed21a471`](https://github.com/dotansimha/graphql-code-generator/commit/2ed21a471f8de58ecafebf4bf64b3c32cee24d2f) Thanks [@charlypoly](https://github.com/charlypoly)! - Introduces support for TypeScript config file and a new preset lifecycle (required for `client-preset`)\n\n### Patch Changes\n\n- [#8291](https://github.com/dotansimha/graphql-code-generator/pull/8291) [`d8b4012e1`](https://github.com/dotansimha/graphql-code-generator/commit/d8b4012e1fdbdcff6f9e62365b57426cef578d9a) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n\n  - Updated dependency [`graphql-config@^4.3.5` ↗︎](https://www.npmjs.com/package/graphql-config/v/null) (from `^4.3.4`, in `dependencies`)\n\n- [#8301](https://github.com/dotansimha/graphql-code-generator/pull/8301) [`2ed21a471`](https://github.com/dotansimha/graphql-code-generator/commit/2ed21a471f8de58ecafebf4bf64b3c32cee24d2f) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n\n  - Added dependency [`cosmiconfig-typescript-loader@^4.0.0` ↗︎](https://www.npmjs.com/package/cosmiconfig-typescript-loader/v/null) (to `dependencies`)\n\n- Updated dependencies [[`2ed21a471`](https://github.com/dotansimha/graphql-code-generator/commit/2ed21a471f8de58ecafebf4bf64b3c32cee24d2f)]:\n  - @graphql-codegen/plugin-helpers@2.7.0\n\n## 2.11.8\n\n### Patch Changes\n\n- [#8289](https://github.com/dotansimha/graphql-code-generator/pull/8289) [`b5897fcad`](https://github.com/dotansimha/graphql-code-generator/commit/b5897fcad2832d9ffbed0eb2f59e6b7535f4b61c) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n\n  - Updated dependency [`graphql-config@^4.3.4` ↗︎](https://www.npmjs.com/package/graphql-config/v/null) (from `^4.3.1`, in `dependencies`)\n\n- [#8289](https://github.com/dotansimha/graphql-code-generator/pull/8289) [`b5897fcad`](https://github.com/dotansimha/graphql-code-generator/commit/b5897fcad2832d9ffbed0eb2f59e6b7535f4b61c) Thanks [@n1ru4l](https://github.com/n1ru4l)! - resolve issue for loading typescript configs\n\n## 2.11.7\n\n### Patch Changes\n\n- [#8274](https://github.com/dotansimha/graphql-code-generator/pull/8274) [`b18a0319f`](https://github.com/dotansimha/graphql-code-generator/commit/b18a0319f5f24f2675df8d12d9b440b67b0445bf) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`@whatwg-node/fetch@^0.3.0` ↗︎](https://www.npmjs.com/package/@whatwg-node/fetch/v/null) (from `^0.2.3`, in `dependencies`)\n\n## 2.11.6\n\n### Patch Changes\n\n- Updated dependencies [[`6c7d3e54b`](https://github.com/dotansimha/graphql-code-generator/commit/6c7d3e54bb3cb53d8bbbd25e31c45b66f29f4640)]:\n  - @graphql-codegen/core@2.6.2\n\n## 2.11.5\n\n### Patch Changes\n\n- [#8198](https://github.com/dotansimha/graphql-code-generator/pull/8198) [`1c7a8c0ad`](https://github.com/dotansimha/graphql-code-generator/commit/1c7a8c0ade2cd1f505b303c742aa31b4489cc12d) Thanks [@charlypoly](https://github.com/charlypoly)! - fix(ci): regression on error output\n\n## 2.11.4\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f)]:\n  - @graphql-codegen/core@2.6.1\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 2.11.3\n\n### Patch Changes\n\n- b75ca4b48: Prevent cli from early returning when run init command.\n\n## 2.11.2\n\n### Patch Changes\n\n- 8cd1526c4: chore(deps): update `@whatwg-node/fetch` to fix vulnerability\n\n## 2.11.1\n\n### Patch Changes\n\n- 20bf4b225: support for path containing \"&\" characters\n\n## 2.11.0\n\n### Minor Changes\n\n- fd6be805b: feat(cli): add a dry-run mode with `--check` cli flag\n\n### Patch Changes\n\n- 6a2e328e6: feat(cli): `--verbose` and `--debug` flags\n- Updated dependencies [6a2e328e6]\n  - @graphql-codegen/plugin-helpers@2.6.1\n\n## 2.10.0\n\n### Minor Changes\n\n- 273ad602f: Replace cross-undici-fetch with @whatwg-node/fetch to fix security vulnerability from undici\n\n### Patch Changes\n\n- cc18923d3: feat(hooks): forward hooks logs to debug logs\n\n## 2.9.1\n\n### Patch Changes\n\n- e2cfc5c36: fix(cli): prevent duplicated error messages on fail (without watcher)\n\n## 2.9.0\n\n### Minor Changes\n\n- 2cbcbb371: Add new flag to emit legacy common js imports. Default it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\n\n  You can use the option in your config:\n\n  ```yaml\n  schema: 'schema.graphql'\n   documents:\n     - 'src/**/*.graphql'\n   emitLegacyCommonJSImports: true\n  ```\n\n  Alternative you can use the CLI to set this option:\n\n  ```bash\n  $ codegen --config-file=config.yml --emit-legacy-common-js-imports\n  ```\n\n### Patch Changes\n\n- 32c1560f1: getPluginByName fails unexpectedly when plugin is not prefixed with @graphq-codegen in ESM context\n\n  MODULE_NOT_FOUND is the error code you receive in a CommonJS context when you require() a module and it does not exist.\n  ERR_MODULE_NOT_FOUND is the error code you receive in an ESM context when you import or import() ad module that does not exist.\n\n- Updated dependencies [2cbcbb371]\n  - @graphql-codegen/plugin-helpers@2.6.0\n\n## 2.8.1\n\n### Patch Changes\n\n- 147e801bf: Add `tslib` as a dependency. See https://github.com/dotansimha/graphql-code-generator/issues/8075\n\n## 2.8.0\n\n### Minor Changes\n\n- d84afec09: Add bin CLI command for running `graphql-code-generator` in ESM mode. You can now use `graphql-codegen-esm` instead of `graphql-codegen`.\n\n  GraphQL Code Generator will continue supporting both ESM and CommonJS in parallel.\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n- 8e44df58b: Add new config option to not exit with non-zero exit code when there are no documents.\n\n  You can use this option in your config:\n\n  ```yaml\n  schema: 'schema.graphql'\n  documents:\n    - 'src/**/*.graphql'\n  ignoreNoDocuments: true\n  ```\n\n  Alternative you can use the CLI to set this option:\n\n  ```bash\n  $ codegen --config-file=config.yml --ignore-no-documents\n  ```\n\n### Patch Changes\n\n- e7870ac28: Fix security vulnerability by removing `latest-version` dependency.\n- dce40edeb: Allow to disable watch mode from CLI to overwrite the config. Now you can do:\n\n  ```bash\n  $ graphql-codegen --watch=false\n  ```\n\n- 2e86ecb65: ### Summary\n\n  - Migrate to [`listr2`](https://listr2.kilic.dev)\n  - Remove custom renderer for `listr`\n  - Remove unused dependencies\n\n  ### Why\n\n  [`listr`](https://github.com/SamVerschueren/listr) is not actively maintained and we have to maintain our custom renderer for it to display errors. Migrating to `listr2` it just works out of the almost similar to how it was working in past and is a actively maintained.\n\n  ### Dev notes\n\n  Big change for us is how errors were collected. In `listr` errors were thrown and were caught in the `end` function of our custom `listr` Renderer but with `listr2` we don't really get `Error` in `end` function always so instead we use the [context](https://listr2.kilic.dev/getting-started/the-concept-of-context) to collect errors from all the tasks and then show them after all the tasks are finished.\n\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/core@2.6.0\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 2.7.0\n\n### Minor Changes\n\n- e050230c0: Remove unnecessary browser check\n\n### Patch Changes\n\n- dfd9f07dc: Fix/multi project\n- 2fb1d8b87: Remove unused `tryToBuildSchema` function\n- 4dce44263: Bumps `@graphql-tools/url-loader` to the latest `cross-undici-fetch` version that has pinned `undici` to `~5.5.0` in order to fix a bug/breaking-change introduced with `undici@5.6.0` that causes a `GET/HEAD requests cannot have 'body'` error.\n  See https://github.com/ardatan/graphql-tools/pull/4559#issue-1292915844 for more details.\n\n## 2.6.4\n\n### Patch Changes\n\n- 92f714278: Revert \"Upgrade latest version\"\n\n## 2.6.3\n\n### Patch Changes\n\n- c1fe7758a: Remove unused deps\n- 52b41e90e: bump latest-version to patch vuln\n\n## 2.6.2\n\n### Patch Changes\n\n- 1e3d37a34: resolve local presets\n\n## 2.6.1\n\n### Patch Changes\n\n- cb9adeb96: Cache validation of documents\n- Updated dependencies [cb9adeb96]\n  - @graphql-codegen/core@2.5.1\n  - @graphql-codegen/plugin-helpers@2.4.1\n\n## 2.6.0\n\n### Minor Changes\n\n- 35566a02c: Use os.cpus to calculate concurrency limit\n- acc62e548: fix(deps): remove unnecessary `dotenv` main dependency\n- 35566a02c: Async File System\n\n## 2.5.0\n\n### Minor Changes\n\n- 754a33715: Performance Profiler --profile\n\n### Patch Changes\n\n- f13d3554e: #5064 Display detailed errors from CLI\n- be7cb3a82: Performance work: resolvers plugins, documents loading\n- Updated dependencies [754a33715]\n  - @graphql-codegen/core@2.5.0\n  - @graphql-codegen/plugin-helpers@2.4.0\n\n## 2.4.0\n\n### Minor Changes\n\n- 4c42e2a71: Performance optimizations in schema and documents loading (shared promises)\n\n## 2.3.1\n\n### Patch Changes\n\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [8643b3bf3]\n- Updated dependencies [b61dc57cf]\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/core@2.4.0\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 2.3.0\n\n### Minor Changes\n\n- 50c1d3247: feat(cli): export loadCodegenConfig to load codegen configuration files\n\n### Patch Changes\n\n- 04e2d833b: export generateSearchPlaces\n\n## 2.2.2\n\n### Patch Changes\n\n- Updated dependencies [97ddb487a]\n  - @graphql-codegen/core@2.3.0\n  - @graphql-codegen/plugin-helpers@2.3.0\n\n## 2.2.1\n\n### Patch Changes\n\n- Updated dependencies [7c60e5acc]\n  - @graphql-codegen/core@2.2.0\n  - @graphql-codegen/plugin-helpers@2.2.0\n\n## 2.2.0\n\n### Minor Changes\n\n- 3e38de399: enhance: sort the schema before processing to have more consistent results. You can disable it with `sort: false`.\n\n### Patch Changes\n\n- 3e38de399: fix: handle convertExtensions properly with schema definitions\n\n## 2.1.1\n\n### Patch Changes\n\n- d3c556f8e: fix: do not alter the indentation of documents\n\n## 2.1.0\n\n### Minor Changes\n\n- 39773f59b: enhance(plugins): use getDocumentNodeFromSchema and other utilities from @graphql-tools/utils\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- 24185985a: bump graphql-tools package versions\n- 72044c1bd: fix: do not alter the indentation of documents loaded via graphql-config\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/core@2.1.0\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 2.0.1\n\n### Patch Changes\n\n- edd029e87: fix(graphql-modules-preset): do not parse SDL and use extendedSources that have parsed document already\n\n## 2.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- Updated dependencies [b0cb13df4]\n- Updated dependencies [d80efdec4]\n  - @graphql-codegen/core@2.0.0\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 1.21.8\n\n### Patch Changes\n\n- e1643e6d4: Fix exception `loader.loaderId is not a function` caused by conflict with an internal dependency of Codegen.\n\n## 1.21.7\n\n### Patch Changes\n\n- 470336a1: don't require plugins for for config if preset provides plugin. Instead the preset should throw if no plugins were provided.\n- Updated dependencies [470336a1]\n  - @graphql-codegen/plugin-helpers@1.18.8\n\n## 1.21.6\n\n### Patch Changes\n\n- 3b82d1bd: update chokidar\n\n## 1.21.5\n\n### Patch Changes\n\n- dfd25caf: chore(deps): bump graphql-tools versions\n- Updated dependencies [dfd25caf]\n  - @graphql-codegen/core@1.17.10\n  - @graphql-codegen/plugin-helpers@1.18.7\n\n## 1.21.4\n\n### Patch Changes\n\n- d9212aa0: fix(visitor-plugin-common): guard for a runtime type error\n- Updated dependencies [d9212aa0]\n  - @graphql-codegen/plugin-helpers@1.18.5\n\n## 1.21.3\n\n### Patch Changes\n\n- 23862e7e: fix(naming-convention): revert and pin change-case-all dependency for workaround #3256\n- Updated dependencies [23862e7e]\n  - @graphql-codegen/plugin-helpers@1.18.4\n\n## 1.21.2\n\n### Patch Changes\n\n- 29b75b1e: enhance(namingConvention): use change-case-all instead of individual packages for naming convention\n- Updated dependencies [29b75b1e]\n  - @graphql-codegen/plugin-helpers@1.18.3\n\n## 1.21.0\n\n### Minor Changes\n\n- dfef1c7c: feat(cli): pass parameters to loaders from plugin config\n\n## 1.20.1\n\n### Patch Changes\n\n- f86365c2: Dependencies cleanup\n\n## 1.20.0\n\n### Minor Changes\n\n- 0e9ddb5a: Add `merge` (`<<`) syntax for `yaml` configurations\n\n### Patch Changes\n\n- bff3fa88: CLI with watch option will reload using new config on change\n- 9ebf1877: Fix wrong MODULE_NOT_FOUND for missing dependencies\n- aa955f15: fix hooks as single function\n\n## 1.19.4\n\n### Patch Changes\n\n- 920d8e95: Allow loading configuration from package.json file\n\n## 1.19.3\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/core@1.17.9\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 1.19.2\n\n### Patch Changes\n\n- faa13973: Fix issues with missing sources in loadSchema\n- faa13973: fix(cli): use default options of codegen for graphql-config's load methods\n\n## 1.19.1\n\n### Patch Changes\n\n- 4ad0319a: Resolve modules passed through the -r flag relative to the cwd\n- 93e49f89: Correctly resolve relative to the cwd\n- Updated dependencies [eaf45d1f]\n  - @graphql-codegen/plugin-helpers@1.18.1\n\n## 1.19.0\n\n### Minor Changes\n\n- 857c603c: Adds the --errors-only flag to the cli to print errors only.\n\n### Patch Changes\n\n- Updated dependencies [857c603c]\n  - @graphql-codegen/plugin-helpers@1.18.0\n\n## 1.18.0\n\n### Minor Changes\n\n- ceb9fe0c: Changes watch mode to not use polling by default and adds configurable override\n\n### Patch Changes\n\n- 186962c9: Use `fs.statSync` when creating custom require instead of `path.extname`\n\n## 1.17.10\n\n### Patch Changes\n\n- 2900ee29: Check the error code instead of the error message to determine if a package wasn't found\n\n## 1.17.9\n\n### Patch Changes\n\n- e7d56e32: fix issues with init command and missing versions\n- 398b094b: Load user provided things relative to the config\n- Updated dependencies [da8bdd17]\n  - @graphql-codegen/plugin-helpers@1.17.9\n\n## 1.17.8\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n- Updated dependencies [ac067ea0]\n  - @graphql-codegen/core@1.17.8\n  - @graphql-codegen/plugin-helpers@1.17.8\n"
  },
  {
    "path": "packages/graphql-codegen-cli/README.md",
    "content": "# GraphQL Code Generator\n\n<p align=\"center\">\n    <img src=\"https://github.com/dotansimha/graphql-code-generator/blob/master/logo.png?raw=true\" />\n</p>\n\nLive demo and full documentation: [the-guild.dev/graphql/codegen](https://the-guild.dev/graphql/codegen)\n\nProject repository: [graphql-code-generator](https://github.com/dotansimha/graphql-code-generator)\n"
  },
  {
    "path": "packages/graphql-codegen-cli/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/cli\",\n  \"version\": \"6.2.1\",\n  \"license\": \"MIT\",\n  \"bin\": {\n    \"gql-gen\": \"dist/cjs/bin.js\",\n    \"graphql-codegen\": \"dist/cjs/bin.js\",\n    \"graphql-code-generator\": \"dist/cjs/bin.js\",\n    \"graphql-codegen-esm\": \"dist/esm/bin.js\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/graphql-codegen-cli\"\n  },\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"keywords\": [\n    \"gql\",\n    \"generator\",\n    \"code\",\n    \"types\",\n    \"interfaces\",\n    \"graphql\",\n    \"codegen\",\n    \"apollo\",\n    \"node\",\n    \"typescript\",\n    \"ts\",\n    \"flow\",\n    \"types\",\n    \"d.ts\",\n    \"typings\"\n  ],\n  \"author\": \"Dotan Simha <dotansimha@gmail.com>\",\n  \"bugs\": {\n    \"url\": \"https://github.com/dotansimha/graphql-codegen/issues\"\n  },\n  \"homepage\": \"https://github.com/dotansimha/graphql-code-generator#readme\",\n  \"dependencies\": {\n    \"@babel/generator\": \"^7.18.13\",\n    \"@babel/template\": \"^7.18.10\",\n    \"@babel/types\": \"^7.18.13\",\n    \"@graphql-codegen/client-preset\": \"^5.2.4\",\n    \"@graphql-codegen/core\": \"^5.0.1\",\n    \"@graphql-codegen/plugin-helpers\": \"^6.2.0\",\n    \"@graphql-tools/apollo-engine-loader\": \"^8.0.28\",\n    \"@graphql-tools/code-file-loader\": \"^8.1.28\",\n    \"@graphql-tools/git-loader\": \"^8.0.32\",\n    \"@graphql-tools/github-loader\": \"^9.0.6\",\n    \"@graphql-tools/graphql-file-loader\": \"^8.1.11\",\n    \"@graphql-tools/json-file-loader\": \"^8.0.26\",\n    \"@graphql-tools/load\": \"^8.1.8\",\n    \"@graphql-tools/url-loader\": \"^9.0.6\",\n    \"@graphql-tools/merge\": \"^9.0.6\",\n    \"@graphql-tools/utils\": \"^11.0.0\",\n    \"@inquirer/prompts\": \"^7.8.2\",\n    \"@whatwg-node/fetch\": \"^0.10.0\",\n    \"chalk\": \"^4.1.0\",\n    \"cosmiconfig\": \"^9.0.0\",\n    \"debounce\": \"^2.0.0\",\n    \"detect-indent\": \"^6.0.0\",\n    \"graphql-config\": \"^5.1.6\",\n    \"is-glob\": \"^4.0.1\",\n    \"jiti\": \"^2.3.0\",\n    \"json-to-pretty-yaml\": \"^1.2.2\",\n    \"listr2\": \"^9.0.0\",\n    \"log-symbols\": \"^4.0.0\",\n    \"micromatch\": \"^4.0.5\",\n    \"shell-quote\": \"^1.7.3\",\n    \"string-env-interpolation\": \"^1.0.1\",\n    \"ts-log\": \"^2.2.3\",\n    \"tslib\": \"^2.4.0\",\n    \"yaml\": \"^2.3.1\",\n    \"yargs\": \"^17.0.0\"\n  },\n  \"devDependencies\": {\n    \"@parcel/watcher\": \"^2.1.0\",\n    \"@types/is-glob\": \"4.0.4\",\n    \"@types/js-yaml\": \"4.0.9\",\n    \"@types/micromatch\": \"^4.0.2\",\n    \"@types/shell-quote\": \"1.7.5\",\n    \"bdd-stdin\": \"0.2.0\",\n    \"change-case-all\": \"1.0.15\",\n    \"js-yaml\": \"4.1.0\",\n    \"make-dir\": \"4.0.0\",\n    \"prettier\": \"2.8.8\"\n  },\n  \"peerDependencies\": {\n    \"@parcel/watcher\": \"^2.1.0\",\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"peerDependenciesMeta\": {\n    \"@parcel/watcher\": {\n      \"optional\": true\n    }\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/bin.ts",
    "content": "#!/usr/bin/env node\nimport { runCli } from './cli.js';\nimport { cliError } from './utils/cli-error.js';\n\nconst [, , cmd] = process.argv;\n\nrunCli(cmd)\n  .then(returnCode => {\n    process.exit(returnCode);\n  })\n  .catch(error => {\n    cliError(error);\n  });\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/cli.ts",
    "content": "import { createContext } from './config.js';\nimport { generate } from './generate-and-save.js';\nimport { lifecycleHooks } from './hooks.js';\nimport { init } from './init/index.js';\n\nexport async function runCli(cmd: string): Promise<number> {\n  await ensureGraphQlPackage();\n\n  if (cmd === 'init') {\n    await init();\n    return 0;\n  }\n\n  const context = await createContext();\n  try {\n    await generate(context);\n    if (context.checkMode && context.checkModeStaleFiles.length > 0) {\n      // eslint-disable-next-line no-console\n      console.log(\n        `The following stale files were detected:\\n${context.checkModeStaleFiles.map(file => `  - ${file}\\n`)}`\n      );\n      return 1;\n    }\n    return 0;\n  } catch (error) {\n    await lifecycleHooks(context.getConfig().hooks).onError(error.toString());\n    return 1;\n  }\n}\n\nexport async function ensureGraphQlPackage() {\n  try {\n    await import('graphql');\n  } catch {\n    throw new Error(\n      `Unable to load \"graphql\" package. Please make sure to install \"graphql\" as a dependency! \\n\n       To install \"graphql\", run:\n         yarn add graphql\n       Or, with NPM:\n         npm install --save graphql`\n    );\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/codegen.ts",
    "content": "import fs from 'fs';\nimport { createRequire } from 'module';\nimport { cpus } from 'os';\nimport path from 'path';\nimport { codegen } from '@graphql-codegen/core';\nimport {\n  CodegenPlugin,\n  getCachedDocumentNodeFromSchema,\n  normalizeConfig,\n  normalizeImportExtension,\n  normalizeInstanceOrArray,\n  normalizeOutputParam,\n  Types,\n} from '@graphql-codegen/plugin-helpers';\nimport { NoTypeDefinitionsFound } from '@graphql-tools/load';\nimport { buildASTSchema, DocumentNode, GraphQLError, GraphQLSchema, isSchema } from 'graphql';\nimport { mergeTypeDefs } from '@graphql-tools/merge';\nimport { Listr, ListrTask } from 'listr2';\nimport { CodegenContext, ensureContext } from './config.js';\nimport { getPluginByName } from './plugins.js';\nimport { getPresetByName } from './presets.js';\nimport { debugLog, printLogs } from './utils/debugging.js';\nimport { getDocumentTransform } from './documentTransforms.js';\n\n/**\n * Poor mans ESM detection.\n * Looking at this and you have a better method?\n * Send a PR.\n */\nconst isESMModule = (typeof __dirname === 'string') === false;\n\nconst makeDefaultLoader = (from: string) => {\n  if (fs.statSync(from).isDirectory()) {\n    from = path.join(from, '__fake.js');\n  }\n\n  const relativeRequire = createRequire(from);\n\n  return async (mod: string) => {\n    return import(\n      isESMModule\n        ? /**\n           * For ESM we currently have no \"resolve path\" solution\n           * as import.meta is unavailable in a CommonJS context\n           * and furthermore unavailable in stable Node.js.\n           **/\n          mod\n        : relativeRequire.resolve(mod)\n    );\n  };\n};\n\ntype Ctx = { errors: Error[] };\n\nfunction createCache(): <T>(namespace: string, key: string, factory: () => Promise<T>) => Promise<T> {\n  const cache = new Map<string, Promise<unknown>>();\n\n  return function ensure<T>(namespace: string, key: string, factory: () => Promise<T>): Promise<T> {\n    const cacheKey = `${namespace}:${key}`;\n\n    const cachedValue = cache.get(cacheKey);\n\n    if (cachedValue) {\n      return cachedValue as Promise<T>;\n    }\n\n    const value = factory();\n    cache.set(cacheKey, value);\n\n    return value;\n  };\n}\n\nexport async function executeCodegen(\n  input: CodegenContext | Types.Config\n): Promise<{ result: Types.FileOutput[]; error: Error | null }> {\n  const context = ensureContext(input);\n  const config = context.getConfig();\n  const pluginContext = context.getPluginContext();\n  const result: Types.FileOutput[] = [];\n\n  let rootConfig: { [key: string]: any } = {};\n  let rootSchemas: Types.Schema[];\n  let rootDocuments: Types.OperationDocument[];\n  const generates: { [filename: string]: Types.ConfiguredOutput } = {};\n\n  const cache = createCache();\n\n  // We need a simple string to uniqually identify the provided GraphQLSchema objects for the above cache.\n  // Because JavaScript does not provide access to its internal object ids, we need a workaround.\n  // Below is a common way to get unique ids for objects in JavaScript,\n  // by using a WeakMap and autoincrementing the id.\n  const jsObjectIds = new WeakMap<GraphQLSchema, number>();\n  let jsObjectIdCounter = 0;\n  function getJsObjectId(schema: GraphQLSchema): number {\n    if (!jsObjectIds.has(schema)) {\n      jsObjectIds.set(schema, jsObjectIdCounter++);\n    }\n    return jsObjectIds.get(schema)!;\n  }\n\n  function wrapTask(task: () => void | Promise<void>, source: string, taskName: string, ctx: Ctx) {\n    return () =>\n      context.profiler.run(async () => {\n        try {\n          await Promise.resolve().then(() => task());\n        } catch (error) {\n          if (source && !(error instanceof GraphQLError)) {\n            error.source = source;\n          }\n          ctx.errors.push(error);\n\n          throw error;\n        }\n      }, taskName);\n  }\n\n  async function normalize() {\n    /* Load Require extensions */\n    const requireExtensions = normalizeInstanceOrArray<string>(config.require);\n    const loader = makeDefaultLoader(context.cwd);\n    for (const mod of requireExtensions) {\n      await loader(mod);\n    }\n\n    /* Root plugin  config */\n    rootConfig = config.config || {};\n\n    /* Normalize root \"schema\" field */\n    rootSchemas = normalizeInstanceOrArray<Types.Schema>(config.schema);\n\n    /* Normalize root \"documents\" field */\n    rootDocuments = normalizeInstanceOrArray<Types.OperationDocument>(config.documents);\n\n    /* Normalize \"generators\" field */\n    const generateKeys = Object.keys(config.generates || {});\n\n    if (generateKeys.length === 0) {\n      throw new Error(\n        `Invalid Codegen Configuration! \\n\n        Please make sure that your codegen config file contains the \"generates\" field, with a specification for the plugins you need.\n\n        It should looks like that:\n\n        schema:\n          - my-schema.graphql\n        generates:\n          my-file.ts:\n            - plugin1\n            - plugin2\n            - plugin3`\n      );\n    }\n\n    for (const filename of generateKeys) {\n      const output = (generates[filename] = normalizeOutputParam(config.generates[filename]));\n\n      if (!output.preset && (!output.plugins || output.plugins.length === 0)) {\n        throw new Error(\n          `Invalid Codegen Configuration! \\n\n          Please make sure that your codegen config file has defined plugins list for output \"${filename}\".\n\n          It should looks like that:\n\n          schema:\n            - my-schema.graphql\n          generates:\n            my-file.ts:\n              - plugin1\n              - plugin2\n              - plugin3\n          `\n        );\n      }\n    }\n\n    if (\n      rootSchemas.length === 0 &&\n      Object.keys(generates).some(\n        filename =>\n          !generates[filename].schema ||\n          (Array.isArray(generates[filename].schema === 'object') &&\n            (generates[filename].schema as unknown as any[]).length === 0)\n      )\n    ) {\n      throw new Error(\n        `Invalid Codegen Configuration! \\n\n        Please make sure that your codegen config file contains either the \"schema\" field\n        or every generated file has its own \"schema\" field.\n\n        It should looks like that:\n        schema:\n          - my-schema.graphql\n\n        or:\n        generates:\n          path/to/output:\n            schema: my-schema.graphql\n      `\n      );\n    }\n  }\n\n  const isTest = process.env.NODE_ENV === 'test';\n\n  const tasks = new Listr<Ctx, 'default' | 'verbose'>(\n    [\n      {\n        title: 'Parse Configuration',\n        task: () => normalize(),\n      },\n      {\n        title: 'Generate outputs',\n        task: (ctx, task) => {\n          const generateTasks: ListrTask<Ctx>[] = Object.keys(generates).map(filename => {\n            const outputConfig = generates[filename];\n            const hasPreset = !!outputConfig.preset;\n\n            const title = `Generate to ${filename}`;\n\n            return {\n              title,\n              async task(_, subTask) {\n                let outputSchemaAst: GraphQLSchema;\n                let outputSchema: DocumentNode;\n                const outputFileTemplateConfig = outputConfig.config || {};\n                let outputDocuments: Types.DocumentFile[] = [];\n                const outputSpecificSchemas = normalizeInstanceOrArray<Types.Schema>(outputConfig.schema);\n                let outputSpecificDocuments = normalizeInstanceOrArray<Types.OperationDocument>(outputConfig.documents);\n\n                const preset: Types.OutputPreset | null = hasPreset\n                  ? typeof outputConfig.preset === 'string'\n                    ? await getPresetByName(outputConfig.preset, makeDefaultLoader(context.cwd))\n                    : outputConfig.preset\n                  : null;\n\n                if (preset?.prepareDocuments) {\n                  outputSpecificDocuments = await preset.prepareDocuments(filename, outputSpecificDocuments);\n                }\n\n                return subTask.newListr(\n                  [\n                    {\n                      title: 'Load GraphQL schemas',\n                      task: wrapTask(\n                        async () => {\n                          debugLog(`[CLI] Loading Schemas`);\n                          const schemaPointerMap: any = {};\n                          const parsedSchemas: GraphQLSchema[] = [];\n                          const allSchemaDenormalizedPointers = [...rootSchemas, ...outputSpecificSchemas];\n\n                          for (const denormalizedPtr of allSchemaDenormalizedPointers) {\n                            if (isSchema(denormalizedPtr)) {\n                              parsedSchemas.push(denormalizedPtr);\n                            } else if (typeof denormalizedPtr === 'string') {\n                              schemaPointerMap[denormalizedPtr] = {};\n                            } else if (typeof denormalizedPtr === 'object') {\n                              Object.assign(schemaPointerMap, denormalizedPtr);\n                            }\n                          }\n\n                          const hash = JSON.stringify(schemaPointerMap) + parsedSchemas.map(getJsObjectId).join(',');\n                          const result = await cache('schema', hash, async () => {\n                            // collect parsed schemas\n                            const schemasToMerge: GraphQLSchema[] = [...parsedSchemas];\n                            // collect schemas, provided by pointers\n                            if (Object.keys(schemaPointerMap).length) {\n                              schemasToMerge.push(await context.loadSchema(schemaPointerMap));\n                            }\n                            // merge all collected schemas into one\n                            const outputSchemaAst =\n                              schemasToMerge.length === 1\n                                ? schemasToMerge[0]\n                                : buildASTSchema(mergeTypeDefs(schemasToMerge));\n                            const outputSchema = getCachedDocumentNodeFromSchema(outputSchemaAst);\n                            return {\n                              outputSchemaAst,\n                              outputSchema,\n                            };\n                          });\n\n                          outputSchemaAst = result.outputSchemaAst;\n                          outputSchema = result.outputSchema;\n                        },\n                        filename,\n                        `Load GraphQL schemas: ${filename}`,\n                        ctx\n                      ),\n                    },\n                    {\n                      title: 'Load GraphQL documents',\n                      task: wrapTask(\n                        async () => {\n                          debugLog(`[CLI] Loading Documents`);\n                          const documentPointerMap: any = {};\n                          const allDocumentsDenormalizedPointers = [...rootDocuments, ...outputSpecificDocuments];\n                          for (const denormalizedPtr of allDocumentsDenormalizedPointers) {\n                            if (typeof denormalizedPtr === 'string') {\n                              documentPointerMap[denormalizedPtr] = {};\n                            } else if (typeof denormalizedPtr === 'object') {\n                              Object.assign(documentPointerMap, denormalizedPtr);\n                            }\n                          }\n\n                          const hash = JSON.stringify(documentPointerMap);\n                          const result = await cache('documents', hash, async () => {\n                            try {\n                              const documents = await context.loadDocuments(documentPointerMap);\n                              return {\n                                documents,\n                              };\n                            } catch (error) {\n                              if (error instanceof NoTypeDefinitionsFound && config.ignoreNoDocuments) {\n                                return {\n                                  documents: [],\n                                };\n                              }\n\n                              throw error;\n                            }\n                          });\n\n                          outputDocuments = result.documents;\n                        },\n                        filename,\n                        `Load GraphQL documents: ${filename}`,\n                        ctx\n                      ),\n                    },\n                    {\n                      title: 'Generate',\n                      task: wrapTask(\n                        async () => {\n                          debugLog(`[CLI] Generating output`);\n                          const normalizedPluginsArray = normalizeConfig(outputConfig.plugins);\n\n                          const pluginLoader = config.pluginLoader || makeDefaultLoader(context.cwd);\n                          const pluginPackages = await Promise.all(\n                            normalizedPluginsArray.map(plugin => getPluginByName(Object.keys(plugin)[0], pluginLoader))\n                          );\n\n                          const pluginMap: {\n                            [name: string]: CodegenPlugin;\n                          } = Object.fromEntries(\n                            pluginPackages.map((pkg, i) => {\n                              const plugin = normalizedPluginsArray[i];\n                              const name = Object.keys(plugin)[0];\n                              return [name, pkg];\n                            })\n                          );\n\n                          const rawMergedConfig = {\n                            ...rootConfig,\n                            emitLegacyCommonJSImports: config.emitLegacyCommonJSImports,\n                            importExtension: config.importExtension,\n                            ...(typeof outputFileTemplateConfig === 'string'\n                              ? { value: outputFileTemplateConfig }\n                              : outputFileTemplateConfig),\n                          };\n\n                          const importExtension = normalizeImportExtension({\n                            emitLegacyCommonJSImports: rawMergedConfig.emitLegacyCommonJSImports,\n                            importExtension: rawMergedConfig.importExtension,\n                          });\n\n                          const mergedConfig = {\n                            ...rawMergedConfig,\n                            importExtension,\n                            emitLegacyCommonJSImports: rawMergedConfig.emitLegacyCommonJSImports ?? true,\n                          };\n\n                          const documentTransforms = Array.isArray(outputConfig.documentTransforms)\n                            ? await Promise.all(\n                                outputConfig.documentTransforms.map(async (config, index) => {\n                                  return await getDocumentTransform(\n                                    config,\n                                    makeDefaultLoader(context.cwd),\n                                    `the element at index ${index} of the documentTransforms`\n                                  );\n                                })\n                              )\n                            : [];\n\n                          const outputs: Types.GenerateOptions[] = preset\n                            ? await context.profiler.run(\n                                async () =>\n                                  preset.buildGeneratesSection({\n                                    baseOutputDir: filename,\n                                    presetConfig: outputConfig.presetConfig || {},\n                                    plugins: normalizedPluginsArray,\n                                    schema: outputSchema,\n                                    schemaAst: outputSchemaAst,\n                                    documents: outputDocuments,\n                                    config: mergedConfig,\n                                    pluginMap,\n                                    pluginContext,\n                                    profiler: context.profiler,\n                                    documentTransforms,\n                                  }),\n                                `Build Generates Section: ${filename}`\n                              )\n                            : [\n                                {\n                                  filename,\n                                  plugins: normalizedPluginsArray,\n                                  schema: outputSchema,\n                                  schemaAst: outputSchemaAst,\n                                  documents: outputDocuments,\n                                  config: mergedConfig,\n                                  pluginMap,\n                                  pluginContext,\n                                  profiler: context.profiler,\n                                  documentTransforms,\n                                },\n                              ];\n\n                          const process = async (outputArgs: Types.GenerateOptions) => {\n                            const output = await codegen({\n                              ...outputArgs,\n                              importExtension,\n                              emitLegacyCommonJSImports: rawMergedConfig.emitLegacyCommonJSImports ?? true,\n                              cache,\n                            });\n                            result.push({\n                              filename: outputArgs.filename,\n                              content: output,\n                              hooks: outputConfig.hooks || {},\n                            });\n                          };\n\n                          await context.profiler.run(() => Promise.all(outputs.map(process)), `Codegen: ${filename}`);\n                        },\n                        filename,\n                        `Generate: ${filename}`,\n                        ctx\n                      ),\n                    },\n                  ],\n                  {\n                    /**\n                     * For each `generates` task, we must do the following in order:\n                     *\n                     * 1. Load schema\n                     * 2. Load documents\n                     * 3. Generate based on the schema + documents\n                     *\n                     * This way, the 3rd step has all the schema and documents loaded in previous steps to work correctly\n                     */\n                    exitOnError: true,\n                    concurrent: false,\n                  }\n                );\n              },\n              // It doesn't stop when one of tasks failed, to finish at least some of outputs\n              exitOnError: false,\n            };\n          });\n\n          return task.newListr(generateTasks, { concurrent: cpus().length || 1 });\n        },\n      },\n    ],\n    {\n      rendererOptions: {\n        clearOutput: false,\n        collapseSubtasks: true,\n        formatOutput: 'wrap',\n        removeEmptyLines: false,\n      },\n      renderer: config.verbose ? 'verbose' : 'default',\n      ctx: { errors: [] },\n      silentRendererCondition: isTest || config.silent,\n      exitOnError: true,\n    }\n  );\n\n  // All the errors throw in `listr2` are collected in context\n  // Running tasks doesn't throw anything\n  const executedContext = await tasks.run();\n  if (config.debug) {\n    // if we have debug logs, make sure to print them before throwing the errors\n    printLogs();\n  }\n\n  let error: Error | null = null;\n  if (executedContext.errors.length > 0) {\n    const errors = executedContext.errors.map(subErr => subErr.message || subErr.toString());\n    error = new AggregateError(executedContext.errors, String(errors.join('\\n\\n')));\n    // Best-effort to all stack traces for debugging\n    error.stack = `${error.stack}\\n\\n${executedContext.errors.map(subErr => subErr.stack).join('\\n\\n')}`;\n  }\n\n  return { result, error };\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/config.ts",
    "content": "import { createHash, BinaryToTextEncoding } from 'crypto';\nimport { promises } from 'fs';\nimport { createRequire } from 'module';\nimport { resolve } from 'path';\n\nimport {\n  createNoopProfiler,\n  createProfiler,\n  getCachedDocumentNodeFromSchema,\n  Profiler,\n  Types,\n} from '@graphql-codegen/plugin-helpers';\nimport { cosmiconfig, defaultLoaders } from 'cosmiconfig';\nimport { createJiti } from 'jiti';\nimport { GraphQLSchema, GraphQLSchemaExtensions, print } from 'graphql';\nimport { GraphQLConfig } from 'graphql-config';\nimport { env } from 'string-env-interpolation';\nimport yaml from 'yaml';\nimport yargs from 'yargs';\nimport { findAndLoadGraphQLConfig } from './graphql-config.js';\nimport { defaultDocumentsLoadOptions, defaultSchemaLoadOptions, loadDocuments, loadSchema } from './load.js';\n\nconst { lstat } = promises;\n\nexport type CodegenConfig = Types.Config;\n\nexport type YamlCliFlags = {\n  config: string;\n  watch: boolean | string | string[];\n  require: string[];\n  overwrite: boolean;\n  project: string;\n  silent: boolean;\n  errorsOnly: boolean;\n  profile: boolean;\n  check?: boolean;\n  verbose?: boolean;\n  debug?: boolean;\n  ignoreNoDocuments?: boolean;\n  emitLegacyCommonJSImports?: boolean;\n  importExtension?: '' | `.${string}`;\n};\n\nexport function generateSearchPlaces(moduleName: string) {\n  const extensions = ['json', 'yaml', 'yml', 'js', 'ts', 'config.js'];\n  // gives codegen.json...\n  const regular = extensions.map(ext => `${moduleName}.${ext}`);\n  // gives .codegenrc.json... but no .codegenrc.config.js\n  const dot = extensions.filter(ext => ext !== 'config.js').map(ext => `.${moduleName}rc.${ext}`);\n\n  return [...regular.concat(dot), 'package.json'];\n}\n\nfunction customLoader(ext: 'json' | 'yaml' | 'js' | 'ts' | 'mts' | 'cts'): CodegenConfigLoader {\n  return async function loader(filepath, content) {\n    if (typeof process !== 'undefined' && 'env' in process) {\n      content = env(content);\n    }\n\n    if (ext === 'json') {\n      return defaultLoaders['.json'](filepath, content);\n    }\n\n    if (ext === 'yaml') {\n      try {\n        const result = yaml.parse(content, { prettyErrors: true, merge: true });\n        return result;\n      } catch (error) {\n        error.message = `YAML Error in ${filepath}:\\n${error.message}`;\n        throw error;\n      }\n    }\n\n    if (ext === 'js') {\n      return defaultLoaders['.js'](filepath, content);\n    }\n\n    if (ext === 'ts') {\n      const jitiLoader = createJiti('');\n      return jitiLoader.import(filepath, { default: true });\n    }\n  };\n}\n\nexport type CodegenConfigLoader = (filepath: string, content: string) => Promise<Types.Config> | Types.Config;\n\nexport interface LoadCodegenConfigOptions {\n  /**\n   * The path to the config file or directory contains the config file.\n   * @default process.cwd()\n   */\n  configFilePath?: string;\n  /**\n   * The name of the config file\n   * @default codegen\n   */\n  moduleName?: string;\n  /**\n   * Additional search paths for the config file you want to check\n   */\n  searchPlaces?: string[];\n  /**\n   * @default codegen\n   */\n  packageProp?: string;\n  /**\n   * Overrides or extends the loaders for specific file extensions\n   */\n  loaders?: Record<string, CodegenConfigLoader>;\n}\n\nexport interface LoadCodegenConfigResult {\n  filepath: string;\n  config: Types.Config;\n  isEmpty?: boolean;\n}\n\nexport async function loadCodegenConfig({\n  configFilePath,\n  moduleName,\n  searchPlaces: additionalSearchPlaces,\n  packageProp,\n  loaders: customLoaders,\n}: LoadCodegenConfigOptions): Promise<LoadCodegenConfigResult> {\n  configFilePath ||= process.cwd();\n  moduleName ||= 'codegen';\n  packageProp ||= moduleName;\n  const cosmi = cosmiconfig(moduleName, {\n    searchPlaces: generateSearchPlaces(moduleName).concat(additionalSearchPlaces || []),\n    packageProp,\n    loaders: {\n      '.json': customLoader('json'),\n      '.yaml': customLoader('yaml'),\n      '.yml': customLoader('yaml'),\n      '.js': customLoader('js'),\n      '.ts': customLoader('ts'),\n      '.mts': customLoader('ts'),\n      '.cts': customLoader('ts'),\n      noExt: customLoader('yaml'),\n      ...customLoaders,\n    },\n  });\n  const pathStats = await lstat(configFilePath);\n  return pathStats.isDirectory() ? cosmi.search(configFilePath) : cosmi.load(configFilePath);\n}\n\nexport async function loadContext(configFilePath?: string): Promise<CodegenContext> | never {\n  const graphqlConfig = await findAndLoadGraphQLConfig(configFilePath);\n\n  if (graphqlConfig) {\n    return new CodegenContext({ graphqlConfig });\n  }\n\n  const result = await loadCodegenConfig({ configFilePath });\n\n  if (!result) {\n    if (configFilePath) {\n      throw new Error(\n        `\n        Config ${configFilePath} does not exist.\n\n          $ graphql-codegen --config ${configFilePath}\n\n        Please make sure the --config points to a correct file.\n      `\n      );\n    }\n\n    throw new Error(\n      `Unable to find Codegen config file! \\n\n        Please make sure that you have a configuration file under the current directory!\n      `\n    );\n  }\n\n  if (result.isEmpty) {\n    throw new Error(\n      `Found Codegen config file but it was empty! \\n\n        Please make sure that you have a valid configuration file under the current directory!\n      `\n    );\n  }\n\n  return new CodegenContext({\n    filepath: result.filepath,\n    config: result.config as Types.Config,\n  });\n}\n\nfunction getCustomConfigPath(cliFlags: YamlCliFlags): string | null | never {\n  const configFile = cliFlags.config;\n\n  return configFile ? resolve(process.cwd(), configFile) : null;\n}\n\nexport function buildOptions() {\n  return {\n    c: {\n      alias: 'config',\n      type: 'string' as const,\n      describe: 'Path to GraphQL codegen YAML config file, defaults to \"codegen.yml\" on the current directory',\n    },\n    w: {\n      alias: 'watch',\n      describe:\n        'Watch for changes and execute generation automatically. You can also specify a glob expression for custom watch list.',\n      coerce(watch: any) {\n        if (watch === 'false') {\n          return false;\n        }\n        if (typeof watch === 'string' || Array.isArray(watch)) {\n          return watch;\n        }\n        return !!watch;\n      },\n    },\n    r: {\n      alias: 'require',\n      describe: 'Loads specific require.extensions before running the codegen and reading the configuration',\n      type: 'array' as const,\n      default: [],\n    },\n    o: {\n      alias: 'overwrite',\n      describe: 'Overwrites existing files',\n      type: 'boolean' as const,\n    },\n    s: {\n      alias: 'silent',\n      describe: 'Suppresses printing errors',\n      type: 'boolean' as const,\n    },\n    e: {\n      alias: 'errors-only',\n      describe: 'Only print errors',\n      type: 'boolean' as const,\n    },\n    profile: {\n      describe: 'Use profiler to measure performance',\n      type: 'boolean' as const,\n    },\n    p: {\n      alias: 'project',\n      describe: 'Name of a project in GraphQL Config',\n      type: 'string' as const,\n    },\n    v: {\n      alias: 'verbose',\n      describe: 'output more detailed information about performed tasks',\n      type: 'boolean' as const,\n      default: false,\n    },\n    d: {\n      alias: 'debug',\n      describe: 'Print debug logs to stdout',\n      type: 'boolean' as const,\n      default: false,\n    },\n    'emit-legacy-common-js-imports': {\n      describe: 'Emit legacy CommonJS imports (deprecated, use import-extension instead)',\n      type: 'boolean' as const,\n    },\n    'import-extension': {\n      describe: 'Extension to append to imports (e.g., .js, .mjs, or empty string for no extension)',\n      type: 'string' as const,\n    },\n    'ignore-no-documents': {\n      describe: 'Suppress errors for no documents',\n      type: 'boolean' as const,\n    },\n  };\n}\n\nexport function parseArgv(argv = process.argv): YamlCliFlags {\n  return yargs(argv).options(buildOptions()).parse(argv) as any;\n}\n\nexport async function createContext(cliFlags: YamlCliFlags = parseArgv(process.argv)): Promise<CodegenContext> {\n  if (cliFlags.require && cliFlags.require.length > 0) {\n    const relativeRequire = createRequire(process.cwd());\n    await Promise.all(\n      cliFlags.require.map(\n        mod =>\n          import(\n            relativeRequire.resolve(mod, {\n              paths: [process.cwd()],\n            })\n          )\n      )\n    );\n  }\n\n  const customConfigPath = getCustomConfigPath(cliFlags);\n  const context = await loadContext(customConfigPath);\n  updateContextWithCliFlags(context, cliFlags);\n  return context;\n}\n\nexport function updateContextWithCliFlags(context: CodegenContext, cliFlags: YamlCliFlags) {\n  const config: Partial<Types.Config & { configFilePath?: string }> = {\n    configFilePath: context.filepath,\n  };\n\n  if (cliFlags.watch !== undefined) {\n    config.watch = cliFlags.watch;\n  }\n\n  if (cliFlags.overwrite === true) {\n    config.overwrite = cliFlags.overwrite;\n  }\n\n  if (cliFlags.silent === true) {\n    config.silent = cliFlags.silent;\n  }\n\n  if (cliFlags.verbose === true || process.env.VERBOSE) {\n    config.verbose = true;\n  }\n\n  if (cliFlags.debug === true || process.env.DEBUG) {\n    config.debug = true;\n  }\n\n  if (cliFlags.errorsOnly === true) {\n    config.errorsOnly = cliFlags.errorsOnly;\n  }\n\n  if (cliFlags['ignore-no-documents'] !== undefined) {\n    // for some reason parsed value is `'false'` string so this ensure it always is a boolean.\n    config.ignoreNoDocuments = cliFlags['ignore-no-documents'] === true;\n  }\n\n  if (cliFlags['emit-legacy-common-js-imports'] !== undefined) {\n    // for some reason parsed value is `'false'` string so this ensure it always is a boolean.\n    config.emitLegacyCommonJSImports = cliFlags['emit-legacy-common-js-imports'] === true;\n  }\n\n  if (cliFlags['import-extension'] !== undefined) {\n    config.importExtension = cliFlags['import-extension'];\n  }\n\n  if (cliFlags.project) {\n    context.useProject(cliFlags.project);\n  }\n\n  if (cliFlags.profile === true) {\n    context.useProfiler();\n  }\n\n  if (cliFlags.check === true) {\n    context.enableCheckMode();\n  }\n\n  context.updateConfig(config);\n}\n\nexport class CodegenContext {\n  private _config: Types.Config;\n  private _graphqlConfig?: GraphQLConfig;\n  private config: Types.Config;\n  private _project?: string;\n  private _checkMode = false;\n  private _pluginContext: { [key: string]: any } = {};\n\n  cwd: string;\n  filepath: string;\n  profiler: Profiler;\n  profilerOutput?: string;\n  checkModeStaleFiles = [];\n\n  constructor({\n    config,\n    graphqlConfig,\n    filepath,\n  }: {\n    config?: Types.Config;\n    graphqlConfig?: GraphQLConfig;\n    filepath?: string;\n  }) {\n    this._config = config;\n    this._graphqlConfig = graphqlConfig;\n    this.filepath = this._graphqlConfig ? this._graphqlConfig.filepath : filepath;\n    this.cwd = this._graphqlConfig ? this._graphqlConfig.dirpath : process.cwd();\n    this.profiler = createNoopProfiler();\n  }\n\n  useProject(name?: string) {\n    this._project = name;\n  }\n\n  getConfig<T>(extraConfig?: T): T & Types.Config {\n    if (!this.config) {\n      if (this._graphqlConfig) {\n        const project = this._graphqlConfig.getProject(this._project);\n\n        this.config = {\n          ...project.extension('codegen'),\n          schema: project.schema,\n          documents: project.documents,\n          pluginContext: this._pluginContext,\n        };\n      } else {\n        this.config = { ...this._config, pluginContext: this._pluginContext };\n      }\n    }\n\n    return {\n      ...extraConfig,\n      ...this.config,\n    };\n  }\n\n  updateConfig(config: Partial<Types.Config>): void {\n    this.config = {\n      ...this.getConfig(),\n      ...config,\n    };\n  }\n\n  enableCheckMode() {\n    this._checkMode = true;\n  }\n\n  get checkMode() {\n    return this._checkMode;\n  }\n\n  useProfiler() {\n    this.profiler = createProfiler();\n\n    const now = new Date(); // 2011-10-05T14:48:00.000Z\n    const datetime = now.toISOString().split('.')[0]; // 2011-10-05T14:48:00\n    const datetimeNormalized = datetime.replace(/-|:/g, ''); // 20111005T144800\n\n    this.profilerOutput = `codegen-${datetimeNormalized}.json`;\n  }\n\n  getPluginContext(): { [key: string]: any } {\n    return this._pluginContext;\n  }\n\n  async loadSchema(pointer: Types.Schema | Types.Schema[]): Promise<GraphQLSchema> {\n    const config = this.getConfig(defaultSchemaLoadOptions);\n    if (this._graphqlConfig) {\n      // TODO: SchemaWithLoader won't work here\n      return addHashToSchema(\n        this._graphqlConfig\n          .getProject(this._project)\n          .loadSchema(pointer, 'GraphQLSchema', { ...config, ...config.config })\n      );\n    }\n    return addHashToSchema(loadSchema(pointer, config));\n  }\n\n  async loadDocuments(pointer: Types.OperationDocument[]): Promise<Types.DocumentFile[]> {\n    const config = this.getConfig(defaultDocumentsLoadOptions);\n    if (this._graphqlConfig) {\n      // TODO: pointer won't work here\n      return addHashToDocumentFiles(\n        this._graphqlConfig.getProject(this._project).loadDocuments(pointer, { ...config, ...config.config })\n      );\n    }\n\n    return addHashToDocumentFiles(loadDocuments(pointer, config));\n  }\n}\n\nexport function ensureContext(input: CodegenContext | Types.Config): CodegenContext {\n  return input instanceof CodegenContext ? input : new CodegenContext({ config: input });\n}\n\nfunction hashContent(content: string, encoding: BinaryToTextEncoding = 'hex'): string {\n  return createHash('sha256').update(content).digest(encoding);\n}\n\nfunction hashSchema(schema: GraphQLSchema): string {\n  return hashContent(print(getCachedDocumentNodeFromSchema(schema)));\n}\n\nfunction addHashToSchema(schemaPromise: Promise<GraphQLSchema>): Promise<GraphQLSchema> {\n  return schemaPromise.then(schema => {\n    // It's consumed later on. The general purpose is to use it for caching.\n    if (!schema.extensions) {\n      (schema.extensions as unknown as GraphQLSchemaExtensions) = {};\n    }\n    (schema.extensions as unknown as GraphQLSchemaExtensions)['hash'] = hashSchema(schema);\n    return schema;\n  });\n}\n\nfunction hashDocument(doc: Types.DocumentFile) {\n  if (doc.rawSDL) {\n    return hashContent(doc.rawSDL);\n  }\n\n  if (doc.document) {\n    return hashContent(print(doc.document));\n  }\n\n  return null;\n}\n\nfunction addHashToDocumentFiles(documentFilesPromise: Promise<Types.DocumentFile[]>): Promise<Types.DocumentFile[]> {\n  return documentFilesPromise.then(documentFiles =>\n    documentFiles.map(doc => {\n      doc.hash = hashDocument(doc);\n\n      return doc;\n    })\n  );\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/declarations.d.ts",
    "content": "declare module 'is-valid-path';\ndeclare module 'listr-update-renderer';\ndeclare module 'indent-string';\ndeclare module 'json-to-pretty-yaml';\ndeclare module 'bdd-stdin';\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/documentTransforms.ts",
    "content": "import { resolve } from 'path';\nimport { Types } from '@graphql-codegen/plugin-helpers';\n\nexport async function getDocumentTransform(\n  documentTransform: Types.OutputDocumentTransform,\n  loader: Types.PackageLoaderFn<Types.DocumentTransformObject>,\n  defaultName: string\n): Promise<Types.ConfiguredDocumentTransform> {\n  if (typeof documentTransform === 'string') {\n    const transformObject = await getDocumentTransformByName(documentTransform, loader);\n    return { name: documentTransform, transformObject };\n  }\n  if (isTransformObject(documentTransform)) {\n    return { name: defaultName, transformObject: documentTransform };\n  }\n  if (isTransformFileConfig(documentTransform)) {\n    const name = Object.keys(documentTransform)[0];\n    const transformObject = await getDocumentTransformByName(name, loader);\n    return { name, transformObject, config: Object.values(documentTransform)[0] };\n  }\n  throw new Error(\n    `\n        An unknown format document transform: '${defaultName}'.\n    `\n  );\n}\n\nfunction isTransformObject(config: Types.OutputDocumentTransform): config is Types.DocumentTransformObject {\n  return typeof config === 'object' && config.transform && typeof config.transform === 'function';\n}\n\nfunction isTransformFileConfig(config: Types.OutputDocumentTransform): config is Types.DocumentTransformFileConfig {\n  const keys = Object.keys(config);\n  return keys.length === 1 && typeof keys[0] === 'string';\n}\n\nexport async function getDocumentTransformByName(\n  name: string,\n  loader: Types.PackageLoaderFn<Types.DocumentTransformObject>\n): Promise<Types.DocumentTransformObject> {\n  const possibleNames = [\n    `@graphql-codegen/${name}`,\n    `@graphql-codegen/${name}-document-transform`,\n    name,\n    resolve(process.cwd(), name),\n  ];\n\n  const possibleModules = possibleNames.concat(resolve(process.cwd(), name));\n\n  for (const moduleName of possibleModules) {\n    try {\n      return await loader(moduleName);\n    } catch (err) {\n      if (err.code !== 'MODULE_NOT_FOUND' && err.code !== 'ERR_MODULE_NOT_FOUND') {\n        throw new Error(\n          `\n              Unable to load document transform matching '${name}'.\n              Reason:\n                ${err.message}\n            `\n        );\n      }\n    }\n  }\n\n  const possibleNamesMsg = possibleNames\n    .map(name =>\n      `\n        - ${name}\n    `.trimEnd()\n    )\n    .join('');\n\n  throw new Error(\n    `\n        Unable to find document transform matching '${name}'\n        Install one of the following packages:\n\n        ${possibleNamesMsg}\n      `\n  );\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/generate-and-save.ts",
    "content": "import { createHash } from 'crypto';\nimport { dirname, isAbsolute, join } from 'path';\nimport logSymbols from 'log-symbols';\nimport { Types } from '@graphql-codegen/plugin-helpers';\nimport { executeCodegen } from './codegen.js';\nimport { CodegenContext, ensureContext } from './config.js';\nimport { lifecycleHooks } from './hooks.js';\nimport { debugLog } from './utils/debugging.js';\nimport { mkdirp, readFile, unlinkFile, writeFile } from './utils/file-system.js';\nimport { createWatcher } from './utils/watcher.js';\nimport { getLogger } from './utils/logger.js';\n\nconst hash = (content: string): string => createHash('sha1').update(content).digest('base64');\n\nexport async function generate(\n  input: CodegenContext | (Types.Config & { cwd?: string }),\n  saveToFile = true\n): Promise<\n  | Types.FileOutput[]\n  /**\n   * When this function runs in watch mode, it'd return an empty promise that doesn't resolve until the watcher exits\n   * FIXME: this effectively makes the result `any`, which loses type-hints\n   */\n  | any\n> {\n  const context = ensureContext(input);\n  const config = context.getConfig();\n  await context.profiler.run(() => lifecycleHooks(config.hooks).afterStart(), 'Lifecycle: afterStart');\n\n  let previouslyGeneratedFilenames: string[] = [];\n\n  function removeStaleFiles(config: Types.Config, generationResult: Types.FileOutput[]) {\n    const filenames = generationResult.map(o => o.filename);\n    // find stale files from previous build which are not present in current build\n    const staleFilenames = previouslyGeneratedFilenames.filter(f => !filenames.includes(f));\n    for (const filename of staleFilenames) {\n      if (shouldOverwrite(config, filename)) {\n        unlinkFile(filename, err => {\n          const prettyFilename = filename.replace(`${input.cwd || process.cwd()}/`, '');\n          if (err) {\n            debugLog(`Cannot remove stale file: ${prettyFilename}\\n${err}`);\n          } else {\n            debugLog(`Removed stale file: ${prettyFilename}`);\n          }\n        });\n      }\n    }\n    previouslyGeneratedFilenames = filenames;\n  }\n\n  const recentOutputHash = new Map<string, string>();\n\n  async function writeOutput(generationResult: Types.FileOutput[]): Promise<Types.FileOutput[]> {\n    if (!saveToFile) {\n      return generationResult;\n    }\n\n    if (config.watch) {\n      removeStaleFiles(config, generationResult);\n    }\n\n    await context.profiler.run(async () => {\n      await lifecycleHooks(config.hooks).beforeAllFileWrite(generationResult.map(r => r.filename));\n    }, 'Lifecycle: beforeAllFileWrite');\n\n    await context.profiler.run(\n      () =>\n        Promise.all(\n          generationResult.map(async (result: Types.FileOutput) => {\n            const previousHash = recentOutputHash.get(result.filename) || (await hashFile(result.filename));\n            const exists = previousHash !== null;\n\n            // Store previous hash to avoid reading from disk again\n            if (previousHash) {\n              recentOutputHash.set(result.filename, previousHash);\n            }\n\n            if (!shouldOverwrite(config, result.filename) && exists) {\n              return;\n            }\n\n            let content = result.content || '';\n            const currentHash = hash(content);\n\n            if (previousHash && currentHash === previousHash) {\n              debugLog(`Skipping file (${result.filename}) writing due to indentical hash...`);\n              return;\n            }\n\n            // skip updating file in dry mode\n            if (context.checkMode) {\n              context.checkModeStaleFiles.push(result.filename);\n              return;\n            }\n\n            if (content.length === 0) {\n              return;\n            }\n\n            const absolutePath = isAbsolute(result.filename)\n              ? result.filename\n              : join(input.cwd || process.cwd(), result.filename);\n\n            const basedir = dirname(absolutePath);\n            await mkdirp(basedir);\n\n            content = await lifecycleHooks(result.hooks).beforeOneFileWrite(absolutePath, content);\n            content = await lifecycleHooks(config.hooks).beforeOneFileWrite(absolutePath, content);\n\n            if (content !== result.content) {\n              result.content = content;\n              // compare the prettified content with the previous hash\n              // to compare the content with an existing prettified file\n              if (hash(content) === previousHash) {\n                debugLog(`Skipping file (${result.filename}) writing due to indentical hash after prettier...`);\n                // the modified content is NOT stored in recentOutputHash\n                // so a diff can already be detected before executing the hook\n                return;\n              }\n            }\n\n            await writeFile(absolutePath, result.content);\n            recentOutputHash.set(result.filename, currentHash);\n\n            await lifecycleHooks(result.hooks).afterOneFileWrite(result.filename);\n            await lifecycleHooks(config.hooks).afterOneFileWrite(result.filename);\n          })\n        ),\n      'Write files'\n    );\n\n    await context.profiler.run(\n      () => lifecycleHooks(config.hooks).afterAllFileWrite(generationResult.map(r => r.filename)),\n      'Lifecycle: afterAllFileWrite'\n    );\n\n    return generationResult;\n  }\n\n  // watch mode\n  if (config.watch) {\n    return createWatcher(context, writeOutput).runningWatcher;\n  }\n\n  const { result: outputFiles, error } = await context.profiler.run(() => executeCodegen(context), 'executeCodegen');\n\n  if (error) {\n    // If all generation failed, just throw to return non-zero code.\n    if (outputFiles.length === 0) {\n      throw error;\n    }\n\n    // If partial success, but partial output is not allowed, throw to return non-zero code.\n    if (!config.allowPartialOutputs) {\n      getLogger().error(\n        `  ${logSymbols.error} One or more errors occurred, no files were generated. To allow output on errors, set config.allowPartialOutputs=true`\n      );\n      throw error;\n    }\n\n    // If partial success, and partial output is allowed, warn and proceed to write to files.\n    getLogger().warn(\n      `  ${logSymbols.warning} One or more errors occurred, some files were generated. To prevent any output on errors, set config.allowPartialOutputs=false`\n    );\n  }\n\n  await context.profiler.run(() => writeOutput(outputFiles), 'writeOutput');\n  await context.profiler.run(() => lifecycleHooks(config.hooks).beforeDone(), 'Lifecycle: beforeDone');\n\n  if (context.profilerOutput) {\n    await writeFile(join(context.cwd, context.profilerOutput), JSON.stringify(context.profiler.collect()));\n  }\n\n  return outputFiles;\n}\n\nfunction shouldOverwrite(config: Types.Config, outputPath: string): boolean {\n  const globalValue = config.overwrite === undefined ? true : !!config.overwrite;\n  const outputConfig = config.generates[outputPath];\n\n  if (!outputConfig) {\n    debugLog(`Couldn't find a config of ${outputPath}`);\n    return globalValue;\n  }\n\n  if (isConfiguredOutput(outputConfig) && typeof outputConfig.overwrite === 'boolean') {\n    return outputConfig.overwrite;\n  }\n\n  return globalValue;\n}\n\nfunction isConfiguredOutput(output: any): output is Types.ConfiguredOutput {\n  return typeof output.plugins !== 'undefined';\n}\n\nasync function hashFile(filePath: string): Promise<string | null> {\n  try {\n    return hash(await readFile(filePath));\n  } catch (err) {\n    if (err && err.code === 'ENOENT') {\n      // return null if file does not exist\n      return null;\n    }\n    // rethrow unexpected errors\n    throw err;\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/graphql-config.ts",
    "content": "import { ApolloEngineLoader } from '@graphql-tools/apollo-engine-loader';\nimport { CodeFileLoader } from '@graphql-tools/code-file-loader';\nimport { GitLoader } from '@graphql-tools/git-loader';\nimport { GithubLoader } from '@graphql-tools/github-loader';\nimport { GraphQLConfig, GraphQLExtensionDeclaration, loadConfig } from 'graphql-config';\n\nexport const CodegenExtension: GraphQLExtensionDeclaration = (api: any) => {\n  // Schema\n  api.loaders.schema.register(\n    new CodeFileLoader({\n      pluckConfig: {\n        skipIndent: true,\n      },\n    })\n  );\n  api.loaders.schema.register(new GitLoader());\n  api.loaders.schema.register(new GithubLoader());\n  api.loaders.schema.register(new ApolloEngineLoader());\n  // Documents\n  api.loaders.documents.register(\n    new CodeFileLoader({\n      pluckConfig: {\n        skipIndent: true,\n      },\n    })\n  );\n  api.loaders.documents.register(new GitLoader());\n  api.loaders.documents.register(new GithubLoader());\n\n  return {\n    name: 'codegen',\n  };\n};\n\nexport async function findAndLoadGraphQLConfig(filepath?: string): Promise<GraphQLConfig | void> {\n  const config = await loadConfig({\n    filepath,\n    rootDir: process.cwd(),\n    extensions: [CodegenExtension],\n    throwOnEmpty: false,\n    throwOnMissing: false,\n  });\n\n  if (isGraphQLConfig(config)) {\n    return config;\n  }\n}\n\n// Kamil: user might load a config that is not GraphQL Config\n//        so we need to check if it's a regular config or not\nfunction isGraphQLConfig(config: GraphQLConfig): config is GraphQLConfig {\n  if (!config) {\n    return false;\n  }\n\n  try {\n    return config.getDefault().hasExtension('codegen');\n  } catch {}\n\n  try {\n    for (const projectName in config.projects) {\n      if (Object.prototype.hasOwnProperty.call(config.projects, projectName)) {\n        const project = config.projects[projectName];\n\n        if (project.hasExtension('codegen')) {\n          return true;\n        }\n      }\n    }\n  } catch {}\n\n  return false;\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/hooks.ts",
    "content": "import { exec } from 'child_process';\nimport { delimiter, sep } from 'path';\nimport { Types } from '@graphql-codegen/plugin-helpers';\nimport { quote } from 'shell-quote';\nimport { debugLog } from './utils/debugging.js';\n\nconst DEFAULT_HOOKS: Types.LifecycleHooksDefinition = {\n  afterStart: [],\n  beforeDone: [],\n  onWatchTriggered: [],\n  onError: [],\n  afterOneFileWrite: [],\n  afterAllFileWrite: [],\n  beforeOneFileWrite: [],\n  beforeAllFileWrite: [],\n};\n\nfunction execShellCommand(cmd: string): Promise<string> {\n  return new Promise((resolve, reject) => {\n    exec(\n      cmd,\n      {\n        env: {\n          ...process.env,\n          PATH: `${process.env.PATH}${delimiter}${process.cwd()}${sep}node_modules${sep}.bin`,\n        },\n      },\n      (error, stdout, stderr) => {\n        if (error) {\n          reject(error);\n          // eslint-disable-next-line no-console\n          console.error(error);\n        } else {\n          debugLog(stdout || stderr);\n          resolve(stdout || stderr);\n        }\n      }\n    );\n  });\n}\n\nasync function executeHooks(\n  hookName: string,\n  _scripts: Types.LifeCycleHookValue | Types.LifeCycleAlterHookValue = [],\n  args: string[] = [],\n  initialState?: string\n): Promise<void | string> {\n  debugLog(`Running lifecycle hook \"${hookName}\" scripts...`);\n  let state = initialState;\n  const scripts = Array.isArray(_scripts) ? _scripts : [_scripts];\n\n  const quotedArgs = quote(args);\n  for (const script of scripts) {\n    if (typeof script === 'string') {\n      debugLog(`Running lifecycle hook \"${hookName}\" script: ${script} with args: ${quotedArgs}...`);\n      await execShellCommand(`${script} ${quotedArgs}`);\n    } else {\n      debugLog(`Running lifecycle hook \"${hookName}\" script: ${script.name} with args: ${args.join(' ')}...`);\n      const hookArgs = state === undefined ? args : [...args, state];\n      const hookResult = await script(...hookArgs);\n      if (typeof hookResult === 'string' && typeof state === 'string') {\n        debugLog(`Received new content from lifecycle hook \"${hookName}\" script: ${script.name}`);\n        state = hookResult;\n      }\n    }\n  }\n\n  return state;\n}\n\nexport const lifecycleHooks = (_hooks: Partial<Types.LifecycleHooksDefinition> = {}) => {\n  const hooks = {\n    ...DEFAULT_HOOKS,\n    ..._hooks,\n  };\n\n  return {\n    afterStart: async (): Promise<void> => {\n      await executeHooks('afterStart', hooks.afterStart);\n    },\n    onWatchTriggered: async (event: string, path: string): Promise<void> => {\n      await executeHooks('onWatchTriggered', hooks.onWatchTriggered, [event, path]);\n    },\n    onError: async (error: string): Promise<void> => {\n      await executeHooks('onError', hooks.onError, [error]);\n    },\n    afterOneFileWrite: async (path: string): Promise<void> => {\n      await executeHooks('afterOneFileWrite', hooks.afterOneFileWrite, [path]);\n    },\n    afterAllFileWrite: async (paths: string[]): Promise<void> => {\n      await executeHooks('afterAllFileWrite', hooks.afterAllFileWrite, paths);\n    },\n    beforeOneFileWrite: async (path: string, content: string): Promise<string> => {\n      const result = await executeHooks('beforeOneFileWrite', hooks.beforeOneFileWrite, [path], content);\n      return typeof result === 'string' ? result : content;\n    },\n    beforeAllFileWrite: async (paths: string[]): Promise<void> => {\n      await executeHooks('beforeAllFileWrite', hooks.beforeAllFileWrite, paths);\n    },\n    beforeDone: async (): Promise<void> => {\n      await executeHooks('beforeDone', hooks.beforeDone);\n    },\n  };\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/index.ts",
    "content": "export * from './cli.js';\nexport { executeCodegen } from './codegen.js';\nexport * from './config.js';\nexport { CodegenConfig } from './config.js';\nexport { generate } from './generate-and-save.js';\nexport * from './graphql-config.js';\nexport * from './init/index.js';\nexport * from './utils/cli-error.js';\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/init/helpers.ts",
    "content": "import { readFileSync, writeFileSync } from 'fs';\nimport { relative, resolve } from 'path';\nimport generate from '@babel/generator';\nimport template from '@babel/template';\nimport * as t from '@babel/types';\nimport { Types } from '@graphql-codegen/plugin-helpers';\nimport chalk from 'chalk';\nimport detectIndent from 'detect-indent';\nimport { getLatestVersion } from '../utils/get-latest-version.js';\nimport { Answers, Tags } from './types.js';\n\nfunction jsObjectToBabelObjectExpression<T extends object>(obj: T): ReturnType<typeof t.objectExpression> {\n  const objExp = t.objectExpression([]);\n\n  for (const [key, val] of Object.entries(obj)) {\n    if (Array.isArray(val)) {\n      objExp.properties.push(\n        t.objectProperty(\n          /^[a-zA-Z0-9]+$/.test(key) ? t.identifier(key) : t.stringLiteral(key),\n          t.arrayExpression(\n            val.map(v => (typeof v === 'object' ? jsObjectToBabelObjectExpression(v as object) : t.valueToNode(v)))\n          )\n        )\n      );\n    } else {\n      objExp.properties.push(\n        t.objectProperty(\n          /^[a-zA-Z0-9]+$/.test(key) ? t.identifier(key) : t.stringLiteral(key),\n          typeof val === 'object' ? jsObjectToBabelObjectExpression(val as unknown as object) : t.valueToNode(val)\n        )\n      );\n    }\n  }\n\n  return objExp;\n}\n\n// Parses config and writes it to a file\nexport async function writeConfig(answers: Answers, config: Types.Config) {\n  const YAML = await import('json-to-pretty-yaml').then(m => ('default' in m ? m.default : m));\n  const ext = answers.config.toLocaleLowerCase().split('.')[1];\n  const fullPath = resolve(process.cwd(), answers.config);\n  const relativePath = relative(process.cwd(), answers.config);\n  let content: string;\n\n  if (ext === 'ts') {\n    const buildRequire = template.statement(`%%config%%`);\n\n    const ast = buildRequire({\n      config: jsObjectToBabelObjectExpression(config),\n    });\n\n    content = `\nimport type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = ${generate(ast).code.replace(/\\(|\\)/g, '')}\n\nexport default config;\n`;\n  } else {\n    content = ext === 'json' ? JSON.stringify(config) : YAML.stringify(config);\n  }\n  writeFileSync(fullPath, content, 'utf8');\n\n  return {\n    relativePath,\n    fullPath,\n  };\n}\n\n// Updates package.json (script and plugins as dependencies)\nexport async function writePackage(answers: Answers, configLocation: string) {\n  // script\n  const pkgPath = resolve(process.cwd(), 'package.json');\n  const pkgContent = readFileSync(pkgPath, 'utf8');\n  const pkg = JSON.parse(pkgContent);\n  const { indent } = detectIndent(pkgContent);\n\n  pkg.scripts ||= {};\n\n  pkg.scripts[answers.script] = `graphql-codegen --config ${configLocation}`;\n\n  // plugin\n  pkg.devDependencies ||= {};\n\n  await Promise.all(\n    (answers.plugins || []).map(async plugin => {\n      pkg.devDependencies[plugin.package] = await getLatestVersion(plugin.package);\n    })\n  );\n\n  if (answers.introspection) {\n    pkg.devDependencies['@graphql-codegen/introspection'] = await getLatestVersion('@graphql-codegen/introspection');\n  }\n\n  pkg.devDependencies['@graphql-codegen/cli'] = await getLatestVersion('@graphql-codegen/cli');\n  if (answers.targets.includes(Tags.client)) {\n    pkg.devDependencies['@graphql-codegen/client-preset'] = await getLatestVersion('@graphql-codegen/client-preset');\n  }\n\n  writeFileSync(pkgPath, JSON.stringify(pkg, null, indent));\n}\n\nexport function bold(str: string) {\n  return chalk.bold(str);\n}\n\nexport function grey(str: string) {\n  return chalk.grey(str);\n}\n\nexport function italic(str: string) {\n  return chalk.italic(str);\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/init/index.ts",
    "content": "import type { Types } from '@graphql-codegen/plugin-helpers';\nimport { bold, writeConfig, writePackage } from './helpers.js';\nimport { getAnswers } from './questions.js';\nimport { guessTargets } from './targets.js';\nimport { Tags } from './types.js';\n\nfunction log(...msgs: string[]) {\n  // eslint-disable-next-line no-console\n  console.log(...msgs);\n}\n\nexport async function init() {\n  log(`\n    Welcome to ${bold('GraphQL Code Generator')}!\n    Answer few questions and we will setup everything for you.\n  `);\n\n  const possibleTargets = await guessTargets();\n  const answers = await getAnswers(possibleTargets);\n\n  // define config\n  const config: Types.Config = {\n    overwrite: true,\n    schema: answers.schema,\n    ...(answers.targets.includes(Tags.client) ||\n    answers.targets.includes(Tags.angular) ||\n    answers.targets.includes(Tags.stencil)\n      ? { documents: answers.documents }\n      : {}),\n    generates: {\n      [answers.output]: {\n        ...(answers.targets.includes(Tags.client) ? { preset: 'client' } : {}),\n        plugins: answers.plugins ? answers.plugins.map(p => p.value) : [],\n      },\n    },\n  };\n\n  // introspection\n  if (answers.introspection) {\n    addIntrospection(config);\n  }\n\n  // config file\n  const { relativePath } = await writeConfig(answers, config);\n\n  log(`Fetching latest versions of selected plugins...`);\n\n  // write package.json\n  await writePackage(answers, relativePath);\n\n  // Emit status to the terminal\n  log(`\n    Config file generated at ${bold(relativePath)}\n\n      ${bold('$ npm install')}\n\n    To install the plugins.\n\n      ${bold(`$ npm run ${answers.script}`)}\n\n    To run GraphQL Code Generator.\n  `);\n}\n\n// adds an introspection to `generates`\nfunction addIntrospection(config: Types.Config) {\n  config.generates['./graphql.schema.json'] = {\n    plugins: ['introspection'],\n  };\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/init/plugins.ts",
    "content": "import { italic } from './helpers.js';\nimport { PluginOption, Tags } from './types.js';\n\nexport const plugins: Array<PluginOption> = [\n  {\n    name: `TypeScript ${italic('(required by other typescript plugins)')}`,\n    package: '@graphql-codegen/typescript',\n    value: 'typescript',\n    pathInRepo: 'typescript/typescript',\n    available: hasTag(Tags.typescript),\n    shouldBeSelected: tags =>\n      oneOf(tags, Tags.angular, Tags.stencil) || allOf(tags, Tags.typescript, Tags.react) || noneOf(tags, Tags.flow),\n    defaultExtension: '.ts',\n  },\n  {\n    name: `TypeScript Operations ${italic('(operations and fragments)')}`,\n    package: '@graphql-codegen/typescript-operations',\n    value: 'typescript-operations',\n    pathInRepo: 'typescript/operations',\n    available: tags => allOf(tags, Tags.client, Tags.typescript) || hasTag(Tags.stencil)(tags),\n    shouldBeSelected: tags => oneOf(tags, Tags.angular, Tags.stencil) || allOf(tags, Tags.typescript, Tags.react),\n    defaultExtension: '.ts',\n  },\n  {\n    name: `TypeScript Resolvers ${italic('(strongly typed resolve functions)')}`,\n    package: '@graphql-codegen/typescript-resolvers',\n    value: 'typescript-resolvers',\n    pathInRepo: 'typescript/resolvers',\n    available: tags => allOf(tags, Tags.node, Tags.typescript),\n    shouldBeSelected: tags => noneOf(tags, Tags.flow),\n    defaultExtension: '.ts',\n  },\n  {\n    name: `Flow ${italic('(required by other flow plugins)')}`,\n    package: '@graphql-codegen/flow',\n    value: 'flow',\n    pathInRepo: 'flow/flow',\n    available: hasTag(Tags.flow),\n    shouldBeSelected: tags => noneOf(tags, Tags.typescript),\n    defaultExtension: '.js',\n  },\n  {\n    name: `Flow Operations ${italic('(operations and fragments)')}`,\n    package: '@graphql-codegen/flow-operations',\n    value: 'flow-operations',\n    pathInRepo: 'flow/operations',\n    available: tags => allOf(tags, Tags.client, Tags.flow),\n    shouldBeSelected: tags => noneOf(tags, Tags.typescript),\n    defaultExtension: '.js',\n  },\n  {\n    name: `Flow Resolvers ${italic('(strongly typed resolve functions)')}`,\n    package: '@graphql-codegen/flow-resolvers',\n    value: 'flow-resolvers',\n    pathInRepo: 'flow/resolvers',\n    available: tags => allOf(tags, Tags.node, Tags.flow),\n    shouldBeSelected: tags => noneOf(tags, Tags.typescript),\n    defaultExtension: '.js',\n  },\n  {\n    name: `TypeScript Stencil Apollo ${italic('(typed components)')}`,\n    package: '@graphql-codegen/typescript-stencil-apollo',\n    value: 'typescript-stencil-apollo',\n    pathInRepo: 'typescript/stencil-apollo',\n    available: hasTag(Tags.stencil),\n    shouldBeSelected: () => true,\n    defaultExtension: '.tsx',\n  },\n  {\n    name: `TypeScript MongoDB ${italic('(typed MongoDB objects)')}`,\n    package: '@graphql-codegen/typescript-mongodb',\n    value: 'typescript-mongodb',\n    pathInRepo: 'typescript/mongodb',\n    available: tags => allOf(tags, Tags.node, Tags.typescript),\n    shouldBeSelected: () => false,\n    defaultExtension: '.ts',\n  },\n  {\n    name: `TypeScript GraphQL files modules ${italic('(declarations for .graphql files)')}`,\n    package: '@graphql-codegen/typescript-graphql-files-modules',\n    value: 'typescript-graphql-files-modules',\n    pathInRepo: 'typescript/graphql-files-modules',\n    available: tags => allOf(tags, Tags.client, Tags.typescript) || hasTag(Tags.stencil)(tags),\n    shouldBeSelected: () => false,\n    defaultExtension: '.ts',\n  },\n  {\n    name: `TypeScript GraphQL document nodes ${italic('(embedded GraphQL document)')}`,\n    package: '@graphql-codegen/typescript-document-nodes',\n    value: 'typescript-document-nodes',\n    pathInRepo: 'typescript/document-nodes',\n    available: tags => allOf(tags, Tags.typescript) || hasTag(Tags.stencil)(tags),\n    shouldBeSelected: () => false,\n    defaultExtension: '.ts',\n  },\n  {\n    name: `Introspection Fragment Matcher ${italic('(for Apollo Client)')}`,\n    package: '@graphql-codegen/fragment-matcher',\n    value: 'fragment-matcher',\n    pathInRepo: 'other/fragment-matcher',\n    available: tags => hasTag(Tags.client)(tags) || hasTag(Tags.angular)(tags) || hasTag(Tags.stencil)(tags),\n    shouldBeSelected: () => false,\n    defaultExtension: '.ts',\n  },\n  {\n    name: `Urql Introspection ${italic('(for Urql Client)')}`,\n    package: '@graphql-codegen/urql-introspection',\n    value: 'urql-introspection',\n    pathInRepo: 'other/urql-introspection',\n    available: tags => hasTag(Tags.client)(tags) || hasTag(Tags.stencil)(tags),\n    shouldBeSelected: () => false,\n    defaultExtension: '.ts',\n  },\n  {\n    name: `TypeScript Apollo Angular ${italic('(typed GQL services)')}`,\n    package: '@graphql-codegen/typescript-apollo-angular',\n    value: 'typescript-apollo-angular',\n    pathInRepo: 'typescript/apollo-angular',\n    available: hasTag(Tags.angular),\n    shouldBeSelected: () => true,\n    defaultExtension: '.ts',\n  },\n];\n\nfunction hasTag(tag: Tags) {\n  return (tags: Tags[]) => tags.includes(tag);\n}\n\nfunction oneOf<T>(list: T[], ...items: T[]): boolean {\n  return list.some(i => items.includes(i));\n}\n\nfunction noneOf<T>(list: T[], ...items: T[]): boolean {\n  return !list.some(i => items.includes(i));\n}\n\nfunction allOf<T>(list: T[], ...items: T[]): boolean {\n  return items.every(i => list.includes(i));\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/init/questions.ts",
    "content": "import { checkbox, input, select, confirm } from '@inquirer/prompts';\nimport { grey } from './helpers.js';\nimport { plugins } from './plugins.js';\nimport { type Answers, type PluginOption, Tags } from './types.js';\n\nexport async function getAnswers(possibleTargets: Record<Tags, boolean>): Promise<Answers> {\n  try {\n    const targetChoices = getApplicationTypeChoices(possibleTargets);\n\n    const targets = await select({\n      message: `What type of application are you building?`,\n      choices: targetChoices,\n      default: targetChoices.find(c => c.checked)?.value,\n    });\n    const schema = await input({\n      message: `Where is your schema?: ${grey('(path or url)')}`,\n      default: 'http://localhost:4000', // matches Apollo Server's default\n      validate: str => str.length > 0,\n    });\n\n    let documents: string | undefined;\n    if (targets.includes(Tags.client) || targets.includes(Tags.angular) || targets.includes(Tags.stencil))\n      documents = await input({\n        message: 'Where are your operations and fragments?:',\n        default: getDocumentsDefaultValue(targets),\n        validate: str => str.length > 0,\n      });\n\n    let plugins: PluginOption[];\n    if (!targets.includes(Tags.client)) {\n      plugins = await checkbox({\n        message: 'Pick plugins:',\n        choices: getPluginChoices(targets),\n        validate: plugins => plugins.length > 0,\n      });\n    }\n\n    const output = await input({\n      message: 'Where to write the output:',\n      default: getOutputDefaultValue({ targets, plugins }),\n      validate: str => str.length > 0,\n    });\n\n    const introspection = await confirm({\n      message: 'Do you want to generate an introspection file?',\n      default: false,\n    });\n\n    const config = await input({\n      message: 'How to name the config file?',\n      default: (() =>\n        targets.includes(Tags.client) || targets.includes(Tags.typescript) || targets.includes(Tags.angular)\n          ? 'codegen.ts'\n          : 'codegen.yml')(),\n      validate: str => {\n        const isNotEmpty = str.length > 0;\n        const hasCorrectExtension = ['json', 'yml', 'yaml', 'js', 'ts'].some(ext =>\n          str.toLocaleLowerCase().endsWith(`.${ext}`)\n        );\n\n        return isNotEmpty && hasCorrectExtension;\n      },\n    });\n\n    const script = await input({\n      default: 'codegen',\n      message: 'What script in package.json should run the codegen?',\n      validate: (str: string) => str.length > 0,\n    });\n\n    return {\n      targets,\n      schema,\n      documents,\n      plugins,\n      output,\n      introspection,\n      config,\n      script,\n    };\n  } catch (error) {\n    if (error instanceof Error && error.name === 'ExitPromptError') {\n      // This error because user exited using CMD+C, just exit gracefully or else user would see an ugly error message\n      // https://github.com/SBoudrias/Inquirer.js/blob/ee16061a1e3f99a6cc714a3d473f7cd12b06a3f1/packages/prompts/README.md#handling-ctrlc-gracefully\n      process.exit();\n    } else {\n      throw error;\n    }\n  }\n}\n\nexport function getApplicationTypeChoices(possibleTargets: Record<Tags, boolean>) {\n  function withFlowOrTypescript(tags: Tags[]) {\n    if (possibleTargets.TypeScript) {\n      tags.push(Tags.typescript);\n    } else if (possibleTargets.Flow) {\n      tags.push(Tags.flow);\n    } else if (possibleTargets.Node) {\n      tags.push(Tags.typescript, Tags.flow);\n    }\n    return tags;\n  }\n\n  return [\n    {\n      name: 'Backend - API or server',\n      key: 'backend',\n      value: withFlowOrTypescript([Tags.node]),\n      checked: possibleTargets.Node,\n    },\n    {\n      name: 'Application built with Angular',\n      key: 'angular',\n      value: [Tags.angular],\n      checked: possibleTargets.Angular,\n    },\n    {\n      name: 'Application built with React',\n      key: 'react',\n      value: withFlowOrTypescript([Tags.react, Tags.client]),\n      checked: possibleTargets.React,\n    },\n    {\n      name: 'Application built with Stencil',\n      key: 'stencil',\n      value: [Tags.stencil, Tags.typescript],\n      checked: possibleTargets.Stencil,\n    },\n    {\n      name: 'Application built with Vue',\n      key: 'vue',\n      value: [Tags.vue, Tags.client],\n      checked: possibleTargets.Vue,\n    },\n    {\n      name: 'Application using graphql-request',\n      key: 'graphqlRequest',\n      value: [Tags.graphqlRequest, Tags.client],\n      checked: possibleTargets.graphqlRequest,\n    },\n    {\n      name: 'Application built with other framework or vanilla JS',\n      key: 'client',\n      value: [Tags.typescript, Tags.flow],\n      checked:\n        possibleTargets.Browser && !possibleTargets.Angular && !possibleTargets.React && !possibleTargets.Stencil,\n    },\n  ];\n}\n\nexport function getPluginChoices(targets: Tags[]) {\n  return plugins\n    .filter(p => p.available(targets))\n    .map(p => {\n      return {\n        name: p.name,\n        value: p,\n        checked: p.shouldBeSelected(targets),\n      };\n    });\n}\n\nfunction getOutputDefaultValue({ targets, plugins }: { targets: Tags[]; plugins: PluginOption[] }) {\n  if (targets.includes(Tags.client)) {\n    return 'src/gql/';\n  }\n  if (plugins.some(plugin => plugin.defaultExtension === '.tsx')) {\n    return 'src/generated/graphql.tsx';\n  }\n  if (plugins.some(plugin => plugin.defaultExtension === '.ts')) {\n    return 'src/generated/graphql.ts';\n  }\n  return 'src/generated/graphql.js';\n}\n\nfunction getDocumentsDefaultValue(targets: Tags[]): string {\n  if (targets.includes(Tags.vue)) {\n    return 'src/**/*.vue';\n  }\n  if (targets.includes(Tags.angular)) {\n    return 'src/**/*.ts';\n  }\n  if (targets.includes(Tags.client)) {\n    return 'src/**/*.tsx';\n  }\n  return 'src/**/*.graphql';\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/init/targets.ts",
    "content": "import { readFileSync } from 'fs';\nimport { resolve } from 'path';\nimport { Tags } from './types.js';\n\nexport async function guessTargets(): Promise<Record<Tags, boolean>> {\n  const pkg = JSON.parse(readFileSync(resolve(process.cwd(), 'package.json'), 'utf8'));\n  const dependencies = Object.keys({\n    ...pkg.dependencies,\n    ...pkg.devDependencies,\n  });\n\n  return {\n    [Tags.angular]: isAngular(dependencies),\n    [Tags.react]: isReact(dependencies),\n    [Tags.stencil]: isStencil(dependencies),\n    [Tags.vue]: isVue(dependencies),\n    [Tags.client]: false,\n    [Tags.node]: false,\n    [Tags.typescript]: isTypescript(dependencies),\n    [Tags.flow]: isFlow(dependencies),\n    [Tags.graphqlRequest]: isGraphqlRequest(dependencies),\n  };\n}\n\nfunction isAngular(dependencies: string[]): boolean {\n  return dependencies.includes('@angular/core');\n}\n\nfunction isReact(dependencies: string[]): boolean {\n  return dependencies.includes('react');\n}\n\nfunction isStencil(dependencies: string[]): boolean {\n  return dependencies.includes('@stencil/core');\n}\n\nfunction isVue(dependencies: string[]): boolean {\n  return dependencies.includes('vue') || dependencies.includes('nuxt');\n}\n\nfunction isTypescript(dependencies: string[]): boolean {\n  return dependencies.includes('typescript');\n}\n\nfunction isFlow(dependencies: string[]): boolean {\n  return dependencies.includes('flow');\n}\n\nfunction isGraphqlRequest(dependencies: string[]): boolean {\n  return dependencies.includes('graphql-request');\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/init/types.ts",
    "content": "export interface PluginOption {\n  name: string;\n  package: string;\n  value: string;\n  pathInRepo: string;\n  available(tags: Tags[]): boolean;\n  shouldBeSelected(tags: Tags[]): boolean;\n  defaultExtension: string;\n}\n\nexport interface Answers {\n  targets: Tags[];\n  config: string;\n  plugins?: PluginOption[];\n  schema: string;\n  documents?: string;\n  output: string;\n  script: string;\n  introspection: boolean;\n}\n\nexport enum Tags {\n  client = 'Browser',\n  node = 'Node',\n  typescript = 'TypeScript',\n  flow = 'Flow',\n  angular = 'Angular',\n  stencil = 'Stencil',\n  react = 'React',\n  vue = 'Vue',\n  graphqlRequest = 'graphqlRequest',\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/load.ts",
    "content": "import { extname, join } from 'path';\nimport { Types } from '@graphql-codegen/plugin-helpers';\nimport { ApolloEngineLoader } from '@graphql-tools/apollo-engine-loader';\nimport { CodeFileLoader } from '@graphql-tools/code-file-loader';\nimport { GitLoader } from '@graphql-tools/git-loader';\nimport { GithubLoader } from '@graphql-tools/github-loader';\nimport { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader';\nimport { JsonFileLoader } from '@graphql-tools/json-file-loader';\nimport {\n  loadDocuments as loadDocumentsToolkit,\n  loadSchema as loadSchemaToolkit,\n  NoTypeDefinitionsFound,\n  UnnormalizedTypeDefPointer,\n} from '@graphql-tools/load';\nimport { UrlLoader } from '@graphql-tools/url-loader';\nimport { GraphQLError, GraphQLSchema } from 'graphql';\n\nexport const defaultSchemaLoadOptions = {\n  assumeValidSDL: true,\n  sort: true,\n  convertExtensions: true,\n  includeSources: true,\n};\n\nexport const defaultDocumentsLoadOptions = {\n  sort: true,\n  skipGraphQLImport: true,\n};\n\nexport async function loadSchema(\n  schemaPointers: UnnormalizedTypeDefPointer | UnnormalizedTypeDefPointer[],\n  config: Types.Config\n): Promise<GraphQLSchema> {\n  try {\n    const loaders = [\n      new CodeFileLoader(),\n      new GitLoader(),\n      new GithubLoader(),\n      new GraphQLFileLoader(),\n      new JsonFileLoader(),\n      new UrlLoader(),\n      new ApolloEngineLoader(),\n    ];\n\n    const schema = await loadSchemaToolkit(schemaPointers, {\n      ...defaultSchemaLoadOptions,\n      loaders,\n      ...config,\n      ...config.config,\n    });\n    return schema;\n  } catch (e) {\n    throw new Error(\n      [\n        `Failed to load schema from ${Object.keys(schemaPointers).join(',')}:`,\n        printError(e),\n        '\\nGraphQL Code Generator supports:',\n        '\\n- ES Modules and CommonJS exports (export as default or named export \"schema\")',\n        '- Introspection JSON File',\n        '- URL of GraphQL endpoint',\n        '- Multiple files with type definitions (glob expression)',\n        '- String in config file',\n        '\\nTry to use one of above options and run codegen again.\\n',\n      ].join('\\n')\n    );\n  }\n}\n\nexport async function loadDocuments(\n  documentPointers: UnnormalizedTypeDefPointer | UnnormalizedTypeDefPointer[],\n  config: Types.Config\n): Promise<Types.DocumentFile[]> {\n  const loaders = [\n    new CodeFileLoader({\n      pluckConfig: {\n        skipIndent: true,\n      },\n    }),\n    new GitLoader(),\n    new GithubLoader(),\n    new GraphQLFileLoader(),\n  ];\n\n  const ignore: Array<string> = [];\n  for (const generatePath of Object.keys(config.generates)) {\n    if (extname(generatePath) === '') {\n      // we omit paths that don't resolve to a specific file\n      continue;\n    }\n    ignore.push(join(process.cwd(), generatePath));\n  }\n\n  try {\n    const loadedFromToolkit = await loadDocumentsToolkit(documentPointers, {\n      ...defaultDocumentsLoadOptions,\n      ignore,\n      loaders,\n      ...config,\n      ...config.config,\n    });\n    return loadedFromToolkit;\n  } catch (error) {\n    // NoTypeDefinitionsFound from `@graphql-tools/load` already has a message with pointer, so we can just rethrow the error\n    if (error instanceof NoTypeDefinitionsFound) {\n      throw error;\n    }\n\n    // For other errors, we need to add an error message with documentPointers, so it's better for DevX\n    throw new Error(\n      [`Failed to load documents from ${Object.keys(documentPointers).join(',')}:`, printError(error)].join('\\n')\n    );\n  }\n}\n\nconst printError = (error: any) => {\n  if (error instanceof GraphQLError) {\n    return String(error);\n  }\n  return [String(error.message || error), String(error.stack)].join('\\n');\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/plugins.ts",
    "content": "import { resolve } from 'path';\nimport { CodegenPlugin, Types } from '@graphql-codegen/plugin-helpers';\n\nexport async function getPluginByName(\n  name: string,\n  pluginLoader: Types.PackageLoaderFn<CodegenPlugin>\n): Promise<CodegenPlugin> {\n  const possibleNames = [\n    `@graphql-codegen/${name}`,\n    `@graphql-codegen/${name}-template`,\n    `@graphql-codegen/${name}-plugin`,\n    `graphql-codegen-${name}`,\n    `graphql-codegen-${name}-template`,\n    `graphql-codegen-${name}-plugin`,\n    `codegen-${name}`,\n    `codegen-${name}-template`,\n    name,\n  ];\n  const possibleModules = possibleNames.concat(resolve(process.cwd(), name));\n\n  for (const moduleName of possibleModules) {\n    try {\n      return await pluginLoader(moduleName);\n    } catch (err) {\n      if (err.code !== 'MODULE_NOT_FOUND' && err.code !== 'ERR_MODULE_NOT_FOUND') {\n        throw new Error(\n          `\n              Unable to load template plugin matching '${name}'.\n              Reason:\n                ${err.message}\n            `\n        );\n      }\n    }\n  }\n\n  const possibleNamesMsg = possibleNames\n    .map(name =>\n      `\n        - ${name}\n    `.trimEnd()\n    )\n    .join('');\n\n  throw new Error(\n    `\n        Unable to find template plugin matching '${name}'\n        Install one of the following packages:\n\n        ${possibleNamesMsg}\n      `\n  );\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/presets.ts",
    "content": "import { resolve } from 'path';\nimport { Types } from '@graphql-codegen/plugin-helpers';\n\nexport async function getPresetByName(\n  name: string,\n  loader: Types.PackageLoaderFn<{ preset?: Types.OutputPreset; default?: Types.OutputPreset }>\n): Promise<Types.OutputPreset> {\n  const possibleNames = [\n    `@graphql-codegen/${name}`,\n    `@graphql-codegen/${name}-preset`,\n    name,\n    resolve(process.cwd(), name),\n  ];\n\n  for (const moduleName of possibleNames) {\n    try {\n      const loaded = await loader(moduleName);\n\n      if (loaded?.preset) {\n        return loaded.preset;\n      }\n      if (loaded?.default) {\n        return loaded.default;\n      }\n\n      return loaded as Types.OutputPreset;\n    } catch (err) {\n      if (\n        /** CJS Error code */\n        err.code !== 'MODULE_NOT_FOUND' &&\n        /** ESM Error code */\n        err.code !== 'ERR_MODULE_NOT_FOUND'\n      ) {\n        throw new Error(\n          `Unable to load preset matching ${name}\n\n              Unable to load preset matching '${name}'.\n              Reason:\n                ${err.message}\n            `\n        );\n      }\n    }\n  }\n\n  const possibleNamesMsg = possibleNames\n    .map(name =>\n      `\n        - ${name}\n    `.trimEnd()\n    )\n    .join('');\n\n  throw new Error(\n    `Unable to find preset matching ${name}\n\n        Unable to find preset matching '${name}'\n        Install one of the following packages:\n\n        ${possibleNamesMsg}\n      `\n  );\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/utils/abort-controller-polyfill.ts",
    "content": "import { EventEmitter } from 'events';\nimport { debugLog } from './debugging.js';\n\n/**\n * Node v14 does not have AbortSignal or AbortController, so to safely use it in\n * another module, you can import it from here.\n *\n * Node v14.7+ does have it, but only with flag --experimental-abortcontroller\n *\n * We don't actually use AbortController anywhere except in tests, but it\n * still gets called in watcher.ts, so by polyfilling it we can avoid breaking\n * existing installations using Node v14 without flag --experimental-abortcontroller,\n * and we also ensure that tests continue to pass under Node v14 without any new flags.\n *\n * This polyfill was adapted (TypeScript-ified) from here:\n * https://github.com/southpolesteve/node-abort-controller/blob/master/index.js\n */\n\nclass AbortSignalPolyfill implements AbortSignal {\n  eventEmitter: EventEmitter;\n  onabort: EventListener;\n  aborted: boolean;\n  reason: any | undefined;\n\n  constructor() {\n    this.eventEmitter = new EventEmitter();\n    this.onabort = null;\n    this.aborted = false;\n    this.reason = undefined;\n  }\n  toString() {\n    return '[object AbortSignal]';\n  }\n  get [Symbol.toStringTag]() {\n    return 'AbortSignal';\n  }\n  removeEventListener(name, handler) {\n    this.eventEmitter.removeListener(name, handler);\n  }\n  addEventListener(name, handler) {\n    this.eventEmitter.on(name, handler);\n  }\n  // @ts-expect-error No Event type in Node 14\n  dispatchEvent(type: string) {\n    const event = { type, target: this };\n    const handlerName = `on${event.type}`;\n\n    if (typeof this[handlerName] === 'function') this[handlerName](event);\n\n    return this.eventEmitter.emit(event.type, event);\n  }\n  throwIfAborted() {\n    if (this.aborted) {\n      throw this.reason;\n    }\n  }\n  static abort(reason: any) {\n    const controller = new AbortController();\n    controller.abort(reason);\n    return controller.signal;\n  }\n  static timeout(time) {\n    const controller = new AbortController();\n    setTimeout(() => controller.abort(new Error('TimeoutError')), time);\n    return controller.signal;\n  }\n}\nconst AbortSignal = global.AbortSignal ?? AbortSignalPolyfill;\n\nclass AbortControllerPolyfill implements AbortController {\n  signal: AbortSignal;\n\n  constructor() {\n    debugLog('Using polyfilled AbortController');\n    // @ts-expect-error No Event type in Node 14\n    this.signal = new AbortSignal();\n  }\n  abort(reason?: any) {\n    if (this.signal.aborted) return;\n\n    // @ts-expect-error Not a read only property when polyfilling\n    this.signal.aborted = true;\n\n    if (reason) {\n      // @ts-expect-error Not a read only property when polyfilling\n      this.signal.reason = reason;\n    } else {\n      // @ts-expect-error Not a read only property when polyfilling\n      this.signal.reason = new Error('AbortError');\n    }\n\n    // @ts-expect-error No Event type in Node 14\n    this.signal.dispatchEvent('abort');\n  }\n  toString() {\n    return '[object AbortController]';\n  }\n  get [Symbol.toStringTag]() {\n    return 'AbortController';\n  }\n}\n\nconst AbortController = global.AbortController ?? AbortControllerPolyfill;\n\nexport { AbortController };\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/utils/cli-error.ts",
    "content": "type CompositeError = Error;\ntype ListrError = Error & { errors: CompositeError[] };\nexport function isListrError(err: Error & { name?: unknown; errors?: unknown }): err is ListrError {\n  return err.name === 'ListrError' && Array.isArray(err.errors) && err.errors.length > 0;\n}\n\nexport function cliError(err: any, exitOnError = true) {\n  let msg: string | Error;\n\n  if (err instanceof Error) {\n    msg = err;\n  } else if (typeof err === 'string') {\n    msg = err;\n  } else {\n    msg = JSON.stringify(err);\n  }\n\n  // eslint-disable-next-line no-console\n  console.error(msg);\n\n  if (exitOnError) {\n    process.exit(1);\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/utils/debugging.ts",
    "content": "import { getLogger } from './logger.js';\n\nlet queue: Array<{\n  message: string;\n  meta?: any[];\n}> = [];\n\nexport function debugLog(message: string, ...meta: any[]) {\n  queue.push({\n    message,\n    meta,\n  });\n}\n\nexport function printLogs() {\n  for (const log of queue) {\n    getLogger().info(log.message, ...log.meta);\n  }\n  resetLogs();\n}\n\nexport function resetLogs() {\n  queue = [];\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/utils/file-system.ts",
    "content": "import { promises, unlink as fsUnlink } from 'fs';\n\nconst { access: fsAccess, writeFile: fsWriteFile, readFile: fsReadFile, mkdir } = promises;\n\nexport function access(...args: Parameters<typeof fsAccess>) {\n  return fsAccess(...args);\n}\n\nexport function writeFile(filepath: string, content: string) {\n  return fsWriteFile(filepath, content);\n}\n\nexport function readFile(filepath: string) {\n  return fsReadFile(filepath, 'utf-8');\n}\n\nexport function unlinkFile(filePath: string, cb?: (err?: Error) => any): void {\n  fsUnlink(filePath, cb);\n}\n\nexport function mkdirp(filePath: string) {\n  return mkdir(filePath, { recursive: true });\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/utils/get-latest-version.ts",
    "content": "import { fetch } from '@whatwg-node/fetch';\n\n/**\n * Fetches the version directly from the registry instead of depending on\n * an ESM only module as latest-version does.\n * @param packageName\n */\nexport async function getLatestVersion(packageName: string): Promise<string> {\n  return fetch(`https://unpkg.com/${packageName}/package.json`)\n    .then(res => res.json())\n    .then(pkg => pkg.version);\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/utils/helpers.ts",
    "content": "export function isURL(str: string): boolean {\n  try {\n    const url = new URL(str);\n    return !!url;\n  } catch {\n    return false;\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/utils/logger.ts",
    "content": "import { dummyLogger, Logger } from 'ts-log';\n\nlet logger: Logger;\n\nexport function getLogger(): Logger {\n  return logger || dummyLogger;\n}\n\nuseWinstonLogger();\n\nexport function setLogger(newLogger: Logger) {\n  logger = newLogger;\n}\n\nexport function setSilentLogger() {\n  logger = dummyLogger;\n}\n\nexport function useWinstonLogger() {\n  if (logger?.levels) {\n    return;\n  }\n\n  logger = console;\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/utils/patterns.ts",
    "content": "import { isAbsolute, relative } from 'path';\nimport { isValidPath } from '@graphql-tools/utils';\nimport { normalizeInstanceOrArray, Types } from '@graphql-codegen/plugin-helpers';\nimport isGlob from 'is-glob';\nimport mm from 'micromatch';\nimport { CodegenContext } from '../config.js';\nimport { isURL } from './helpers.js';\n\ntype NegatedPattern = `!${string}`;\n\n/**\n * Flatten a list of pattern sets to be a list of only the affirmative patterns\n * are contained in all of them.\n *\n * This can be used, for example, to find the \"longest common prefix directory\"\n * by examining `mm.scan(pattern).base` for each `pattern`.\n */\nexport const allAffirmativePatternsFromPatternSets = (patternSets: PatternSet[]) => {\n  return patternSets.flatMap(patternSet => [\n    ...patternSet.watch.affirmative,\n    ...patternSet.documents.affirmative,\n    ...patternSet.schemas.affirmative,\n  ]);\n};\n\n/**\n * Create a rebuild trigger that follows the algorithm described here:\n * https://github.com/dotansimha/graphql-code-generator/issues/9270#issuecomment-1496765045\n *\n * There is a flow chart diagram in that comment.\n *\n * Basically:\n *\n *  * \"Global\" patterns are defined at top level of config file, and \"local\"\n *    patterns are defined for each output target\n *  * Each pattern can have \"watch\", \"documents\", and \"schemas\"\n *  * Watch patterns (global and local) always take precedence over documents and\n *    schemas patterns, i.e. a watch negation always negates, and a watch match is\n *    a match even if it would be negated by some pattern in documents or schemas\n *  * The trigger returns true if any output target's local patterns result in\n *    a match, after considering the precedence of any global and local negations\n */\nexport const makeShouldRebuild = ({\n  globalPatternSet,\n  localPatternSets,\n}: {\n  globalPatternSet: PatternSet;\n  localPatternSets: PatternSet[];\n}) => {\n  const localMatchers = localPatternSets.map(localPatternSet => {\n    return (path: string) => {\n      // Is path negated by any negating watch pattern?\n      if (matchesAnyNegatedPattern(path, [...globalPatternSet.watch.negated, ...localPatternSet.watch.negated])) {\n        // Short circut: negations in watch patterns take priority\n        return false;\n      }\n\n      // Does path match any affirmative watch pattern?\n      if (\n        matchesAnyAffirmativePattern(path, [\n          ...globalPatternSet.watch.affirmative,\n          ...localPatternSet.watch.affirmative,\n        ])\n      ) {\n        // Immediately return true: Watch pattern takes priority, even if documents or schema would negate it\n        return true;\n      }\n\n      // Does path match documents patterns (without being negated)?\n      if (\n        matchesAnyAffirmativePattern(path, [\n          ...globalPatternSet.documents.affirmative,\n          ...localPatternSet.documents.affirmative,\n        ]) &&\n        !matchesAnyNegatedPattern(path, [...globalPatternSet.documents.negated, ...localPatternSet.documents.negated])\n      ) {\n        return true;\n      }\n\n      // Does path match schemas patterns (without being negated)?\n      if (\n        matchesAnyAffirmativePattern(path, [\n          ...globalPatternSet.schemas.affirmative,\n          ...localPatternSet.schemas.affirmative,\n        ]) &&\n        !matchesAnyNegatedPattern(path, [...globalPatternSet.schemas.negated, ...localPatternSet.schemas.negated])\n      ) {\n        return true;\n      }\n\n      // Otherwise, there is no match\n      return false;\n    };\n  });\n\n  /**\n   * Return `true` if `path` should trigger a rebuild\n   */\n  return ({ path: absolutePath }: { path: string }) => {\n    if (!isAbsolute(absolutePath)) {\n      throw new Error('shouldRebuild trigger should be called with absolute path');\n    }\n\n    const path = relative(process.cwd(), absolutePath);\n    const shouldRebuild = localMatchers.some(matcher => matcher(path));\n    return shouldRebuild;\n  };\n};\n\n/**\n * Create the pattern set for the \"global\" (top level) config.\n *\n * In the `shouldRebuild` algorithm, any of these watch patterns will take\n * precedence over local configs, and any schemas and documents patterns will be\n * mixed into the pattern set of each local config.\n */\nexport const makeGlobalPatternSet = (initialContext: CodegenContext) => {\n  const config: Types.Config & { configFilePath?: string } = initialContext.getConfig();\n\n  return {\n    watch: sortPatterns([\n      ...(typeof config.watch === 'boolean' ? [] : normalizeInstanceOrArray<string>(config.watch ?? [])),\n      relative(process.cwd(), initialContext.filepath),\n    ]),\n    schemas: sortPatterns(makePatternsFromSchemas(normalizeInstanceOrArray<Types.Schema>(config.schema))),\n    documents: sortPatterns(\n      makePatternsFromDocuments(normalizeInstanceOrArray<Types.OperationDocument>(config.documents))\n    ),\n  };\n};\n\n/**\n * Create the pattern set for a \"local\" (output target) config\n *\n * In the `shouldRebuild` algorithm, any of these watch patterns will take\n * precedence over documents or schemas patterns, and the documents and schemas\n * patterns will be mixed into the pattern set of their respective gobal pattern\n * set equivalents.\n */\nexport const makeLocalPatternSet = (conf: Types.ConfiguredOutput) => {\n  return {\n    watch: sortPatterns(normalizeInstanceOrArray(conf.watchPattern)),\n    documents: sortPatterns(\n      makePatternsFromDocuments(normalizeInstanceOrArray<Types.OperationDocument>(conf.documents))\n    ),\n    schemas: sortPatterns(makePatternsFromSchemas(normalizeInstanceOrArray<Types.Schema>(conf.schema))),\n  };\n};\n\n/**\n * Parse a list of micromatch patterns from a list of documents, which should\n * already have been normalized from their raw config values.\n */\nconst makePatternsFromDocuments = (documents: Types.OperationDocument[]): string[] => {\n  const patterns: string[] = [];\n\n  if (documents) {\n    for (const doc of documents) {\n      if (typeof doc === 'string') {\n        patterns.push(doc);\n      } else {\n        patterns.push(...Object.keys(doc));\n      }\n    }\n  }\n\n  return patterns;\n};\n\n/**\n * Parse a list of micromatch patterns from a list of schemas, which should\n * already have been normalized from their raw config values.\n */\nconst makePatternsFromSchemas = (schemas: Types.Schema[]): string[] => {\n  const patterns: string[] = [];\n\n  for (const s of schemas) {\n    const schema = s as string;\n    if (!isURL(schema) && (isGlob(schema) || isValidPath(schema))) {\n      patterns.push(schema);\n    }\n  }\n\n  return patterns;\n};\n\n/**\n * Given a list of micromatch patterns, sort them into `patterns` (all of them),\n * `affirmative` (only the affirmative patterns), and `negated` (only the negated patterns)\n *\n * @param patterns List of micromatch patterns\n */\nexport const sortPatterns = <P extends string | NegatedPattern>(patterns: P[]): SortedPatterns<P> => ({\n  patterns,\n  affirmative: onlyAffirmativePatterns(patterns) as P[],\n  negated: onlyNegatedPatterns(patterns) as Extract<P, NegatedPattern>[],\n});\n\n/**\n * A type that \"sorts\" (or \"groups\") patterns. For a given list of `patterns`,\n * this type will include the original list in `patterns`, all of its\n * \"affirmative\" (non-negated) patterns in `affirmative`, and all of its\n * \"negated\" patterns in `negated`\n */\ntype SortedPatterns<PP extends string | NegatedPattern = string | NegatedPattern> = {\n  /** List of patterns, which could include both negated and affirmative patterns */\n  patterns: PP[];\n  /** List of only the affirmative (non-negated) patterns in `patterns` */\n  affirmative: PP[];\n  /** List of only the negated patterns in `patterns` */\n  negated: Extract<PP, NegatedPattern>[];\n};\n\n/**\n * The global (top-level) config and each local (output target) config can have\n * patterns which are separable into \"watch\" (always takes precedence), \"documents\",\n * and \"schemas\". This type can hold sorted versions of these patterns.\n */\ntype PatternSet = {\n  watch: SortedPatterns;\n  documents: SortedPatterns;\n  schemas: SortedPatterns;\n};\n\n/**\n * Filter the provided list of patterns to include only \"affirmative\" (non-negated) patterns.\n *\n * @param patterns List of micromatch patterns (or paths) to filter\n */\nconst onlyAffirmativePatterns = (patterns: string[]) => {\n  return patterns.filter(pattern => !mm.scan(pattern).negated);\n};\n\n/**\n * Filter the provided list of patterns to include only negated patterns.\n *\n * @param patterns List of micromatch patterns (or paths) to filter\n */\nconst onlyNegatedPatterns = (patterns: string[]) => {\n  return patterns.filter(pattern => mm.scan(pattern).negated);\n};\n\n/**\n * Given a list of negated patterns, invert them by removing their negation prefix\n *\n * If there is a non-negated pattern in the list, throw an error, because this\n * function should only be called after filtering the list to be only negated patterns\n *\n * @param patterns List of negated micromatch patterns\n */\nconst invertNegatedPatterns = (patterns: string[]) => {\n  return patterns.map(pattern => {\n    const scanned = mm.scan(pattern);\n    if (!scanned.negated) {\n      throw new Error(`onlyNegatedPatterns got a non-negated pattern: ${pattern}`);\n    }\n\n    // Remove the leading prefix (NOTE: this is not always \"!\")\n    // e.g. mm.scan(\"!./foo/bar/never-watch.graphql\").prefix === '!./'\n    return pattern.slice(scanned.prefix.length);\n  });\n};\n\n/**\n * Return true if relativeCandidatePath matches any of the affirmativePatterns\n *\n * @param relativeCandidatePath A relative path to evaluate against the supplied affirmativePatterns\n * @param affirmativePatterns A list of patterns, containing no negated patterns, to evaluate\n */\nconst matchesAnyAffirmativePattern = (relativeCandidatePath: string, affirmativePatterns: string[]) => {\n  if (isAbsolute(relativeCandidatePath)) {\n    throw new Error('matchesAny should only be called with relative candidate path');\n  }\n\n  // Developer error: This function is not intended to work with pattern sets including negations\n  if (affirmativePatterns.some(pattern => mm.scan(pattern).negated)) {\n    throw new Error('matchesAnyAffirmativePattern should only include affirmative patterns');\n  }\n\n  // micromatch.isMatch does not omit matches that are negated by negation patterns,\n  // which is why we require this function only examine affirmative patterns\n  return mm.isMatch(relativeCandidatePath, affirmativePatterns);\n};\n\n/**\n * Return true if relativeCandidatePath matches any of the negatedPatterns\n *\n * This function will invert the negated patterns and then call matchesAnyAffirmativePattern\n *\n * @param relativeCandidatePath A relative path to evaluate against the suppliednegatedPatterns\n * @param negatedPatterns A list of patterns, containing no negated patterns, to evaluate\n */\nconst matchesAnyNegatedPattern = (relativeCandidatePath: string, negatedPatterns: string[]) => {\n  // NOTE: No safety check that negatedPatterns contains only negated, because that will happen in invertedNegatedPatterns\n  return matchesAnyAffirmativePattern(relativeCandidatePath, invertNegatedPatterns(negatedPatterns));\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/src/utils/watcher.ts",
    "content": "import { join, isAbsolute, relative, resolve, sep } from 'path';\nimport { normalizeOutputParam, Types } from '@graphql-codegen/plugin-helpers';\nimport type { subscribe } from '@parcel/watcher';\nimport debounce from 'debounce';\nimport mm from 'micromatch';\nimport logSymbols from 'log-symbols';\nimport { executeCodegen } from '../codegen.js';\nimport { CodegenContext, loadContext } from '../config.js';\nimport { lifecycleHooks } from '../hooks.js';\nimport { access } from './file-system.js';\nimport { debugLog } from './debugging.js';\nimport { getLogger } from './logger.js';\nimport {\n  allAffirmativePatternsFromPatternSets,\n  makeGlobalPatternSet,\n  makeLocalPatternSet,\n  makeShouldRebuild,\n} from './patterns.js';\nimport { AbortController } from './abort-controller-polyfill.js';\n\nfunction log(msg: string) {\n  // double spaces to inline the message with Listr\n  getLogger().info(`  ${msg}`);\n}\n\nfunction emitWatching(watchDir: string) {\n  log(`${logSymbols.info} Watching for changes in ${watchDir}...`);\n}\n\nexport const createWatcher = (\n  initialContext: CodegenContext,\n  onNext: (result: Types.FileOutput[]) => Promise<Types.FileOutput[]>\n): {\n  /**\n   * Call this function to stop the running watch server\n   *\n   * @returns Promise that resolves when watcher has terminated ({@link runningWatcher} promise settled)\n   * */\n  stopWatching: () => Promise<void>;\n  /**\n   * Promise that will never resolve as long as the watcher is running. To stop\n   * the watcher, call {@link stopWatching}, which will send a stop signal and\n   * then return a promise that doesn't resolve until `runningWatcher` has resolved.\n   * */\n  runningWatcher: Promise<void>;\n} => {\n  debugLog(`[Watcher] Starting watcher...`);\n  let config: Types.Config & { configFilePath?: string } = initialContext.getConfig();\n\n  const globalPatternSet = makeGlobalPatternSet(initialContext);\n  const localPatternSets = Object.keys(config.generates)\n    .map(filename => normalizeOutputParam(config.generates[filename]))\n    .map(conf => makeLocalPatternSet(conf));\n  const allAffirmativePatterns = allAffirmativePatternsFromPatternSets([globalPatternSet, ...localPatternSets]);\n\n  const shouldRebuild = makeShouldRebuild({ globalPatternSet, localPatternSets });\n\n  let watcherSubscription: Awaited<ReturnType<typeof subscribe>>;\n\n  const runWatcher = async (abortSignal: AbortSignal) => {\n    const watchDirectory = await findHighestCommonDirectory(allAffirmativePatterns);\n\n    // Try to load the parcel watcher, but don't fail if it's not available.\n    let parcelWatcher: typeof import('@parcel/watcher');\n    try {\n      parcelWatcher = await import('@parcel/watcher');\n    } catch {\n      log(\n        'Failed to import @parcel/watcher.\\n  To use watch mode, install https://www.npmjs.com/package/@parcel/watcher.'\n      );\n      return;\n    }\n\n    debugLog(`[Watcher] Parcel watcher loaded...`);\n\n    let isShutdown = false;\n\n    const debouncedExec = debounce(() => {\n      if (!isShutdown) {\n        executeCodegen(initialContext)\n          .then(\n            ({ result, error }) => {\n              // FIXME: this is a quick fix to stop `onNext` (writeOutput) from\n              // removing all files when there is an error.\n              //\n              // This is because `removeStaleFiles()` will remove files if the\n              // generated files are different between runs. And on error, it\n              // returns an empty array i.e. will remove all generated files from\n              // the previous run\n              //\n              // This also means we don't have config.allowPartialOutputs in watch mode\n              if (error) {\n                return;\n              }\n              onNext(result);\n            },\n            () => Promise.resolve()\n          )\n          .then(() => emitWatching(watchDirectory));\n      }\n    }, 100);\n    emitWatching(watchDirectory);\n\n    const ignored: string[] = ['**/.git/**'];\n    for (const entry of Object.keys(config.generates).map(filename => ({\n      filename,\n      config: normalizeOutputParam(config.generates[filename]),\n    }))) {\n      // ParcelWatcher expects relative ignore patterns to be relative from watchDirectory,\n      // but we expect filename from config to be relative from cwd, so we need to convert\n      const filenameRelativeFromWatchDirectory = relative(watchDirectory, resolve(process.cwd(), entry.filename));\n\n      if (entry.config.preset) {\n        const extension = entry.config.presetConfig?.extension;\n        if (extension) {\n          ignored.push(join(filenameRelativeFromWatchDirectory, '**', '*' + extension));\n        }\n      } else {\n        ignored.push(filenameRelativeFromWatchDirectory);\n      }\n    }\n\n    watcherSubscription = await parcelWatcher.subscribe(\n      watchDirectory,\n      async (_, events) => {\n        // it doesn't matter what has changed, need to run whole process anyway\n        await Promise.all(\n          // NOTE: @parcel/watcher always provides path as an absolute path\n          events.map(async ({ type: eventName, path }) => {\n            if (!shouldRebuild({ path })) {\n              return;\n            }\n\n            lifecycleHooks(config.hooks).onWatchTriggered(eventName, path);\n            debugLog(`[Watcher] triggered due to a file ${eventName} event: ${path}`);\n            // In ESM require is not defined\n            try {\n              delete require.cache[path];\n            } catch {}\n\n            if (eventName === 'update' && config.configFilePath && path === config.configFilePath) {\n              log(`${logSymbols.info} Config file has changed, reloading...`);\n              const context = await loadContext(config.configFilePath);\n\n              const newParsedConfig: Types.Config & { configFilePath?: string } = context.getConfig();\n              newParsedConfig.watch = config.watch;\n              newParsedConfig.silent = config.silent;\n              newParsedConfig.overwrite = config.overwrite;\n              newParsedConfig.configFilePath = config.configFilePath;\n              config = newParsedConfig;\n              initialContext.updateConfig(config);\n            }\n\n            debouncedExec();\n          })\n        );\n      },\n      { ignore: ignored }\n    );\n\n    debugLog(`[Watcher] Started`);\n\n    const shutdown = (\n      /** Optional callback to execute after shutdown has completed its async tasks */\n      afterShutdown?: () => void\n    ) => {\n      isShutdown = true;\n      debugLog(`[Watcher] Shutting down`);\n      log(`Shutting down watch...`);\n\n      const pendingUnsubscribe = watcherSubscription.unsubscribe();\n      const pendingBeforeDoneHook = lifecycleHooks(config.hooks).beforeDone();\n\n      if (afterShutdown && typeof afterShutdown === 'function') {\n        Promise.allSettled([pendingUnsubscribe, pendingBeforeDoneHook]).then(afterShutdown);\n      }\n    };\n\n    abortSignal.addEventListener('abort', () => shutdown(abortSignal.reason));\n\n    process.once('SIGINT', () => shutdown());\n    process.once('SIGTERM', () => shutdown());\n  };\n\n  // Use an AbortController for shutdown signals\n  // NOTE: This will be polyfilled on Node 14 (or any environment without it defined)\n  const abortController = new AbortController();\n\n  /**\n   * Send shutdown signal and return a promise that only resolves after the\n   * runningWatcher has resolved, which only resolved after the shutdown signal has been handled\n   */\n  const stopWatching = async function () {\n    // stopWatching.afterShutdown is lazily set to resolve pendingShutdown promise\n    abortController.abort(stopWatching.afterShutdown);\n\n    // SUBTLE: runningWatcher waits for pendingShutdown before it resolves itself, so\n    // by awaiting it here, we are awaiting both the shutdown handler, and runningWatcher itself\n    await stopWatching.runningWatcher;\n  };\n  stopWatching.afterShutdown = () => {\n    debugLog('Shutdown watcher before it started');\n  };\n  stopWatching.runningWatcher = Promise.resolve();\n\n  /** Promise will resolve after the shutdown() handler completes */\n  const pendingShutdown = new Promise<void>(afterShutdown => {\n    // afterShutdown will be passed to shutdown() handler via abortSignal.reason\n    stopWatching.afterShutdown = afterShutdown;\n  });\n\n  /**\n   * Promise that resolves after the watch server has shutdown, either because\n   * stopWatching() was called or there was an error inside it\n   */\n  stopWatching.runningWatcher = new Promise<void>((resolve, reject) => {\n    executeCodegen(initialContext)\n      .then(\n        ({ result, error }) => {\n          // TODO: this is the initial run, the logic here mimics the above watcher logic.\n          // We need to check whether it's ok to deviate between these two.\n          if (error) {\n            return;\n          }\n          onNext(result);\n        },\n        () => Promise.resolve()\n      )\n      .then(() => runWatcher(abortController.signal))\n      .catch(err => {\n        watcherSubscription.unsubscribe();\n        reject(err);\n      })\n      .then(() => pendingShutdown)\n      .finally(() => {\n        debugLog('Done watching.');\n        resolve();\n      });\n  });\n\n  return {\n    stopWatching,\n    runningWatcher: stopWatching.runningWatcher,\n  };\n};\n\n/**\n * Given a list of file paths (each of which may be absolute, or relative from\n * `process.cwd()`), find absolute path of the \"highest\" common directory,\n * i.e. the directory that contains all the files in the list.\n *\n * @param files List of relative and/or absolute file paths (or micromatch patterns)\n */\nconst findHighestCommonDirectory = async (files: string[]): Promise<string> => {\n  // Map files to a list of basePaths, where \"base\" is the result of mm.scan(pathOrPattern)\n  // e.g. mm.scan(\"/**/foo/bar\").base -> \"/\" ; mm.scan(\"/foo/bar/**/fizz/*.graphql\") -> /foo/bar\n  const dirPaths = files\n    .map(filePath => (isAbsolute(filePath) ? filePath : resolve(filePath)))\n    // mm.scan doesn't know how to handle Windows \\ path separator\n    .map(patterned => patterned.replace(/\\\\/g, '/'))\n    .map(patterned => mm.scan(patterned).base)\n    // revert the separators to the platform-supported ones\n    .map(base => base.replace(/\\//g, sep));\n\n  // Return longest common prefix if it's accessible, otherwise process.cwd()\n  return (async (maybeValidPath: string) => {\n    debugLog(`[Watcher] Longest common prefix of all files: ${maybeValidPath}...`);\n    try {\n      await access(maybeValidPath);\n      return maybeValidPath;\n    } catch {\n      log(`[Watcher] Longest common prefix (${maybeValidPath}) is not accessible`);\n      log(`[Watcher] Watching current working directory (${process.cwd()}) instead`);\n      return process.cwd();\n    }\n  })(longestCommonPrefix(dirPaths.map(path => path.split(sep))).join(sep));\n};\n\n/**\n * Find the longest common prefix of an array of paths, where each item in\n * the array an array of path segments which comprise an absolute path when\n * joined together by a path separator\n *\n * Adapted from:\n * https://duncan-mcardle.medium.com/leetcode-problem-14-longest-common-prefix-javascript-3bc6a2f777c4\n *\n * @param splitPaths An array of arrays, where each item is a path split by its separator\n * @returns An array of path segments representing the longest common prefix of splitPaths\n */\nconst longestCommonPrefix = (splitPaths: string[][]): string[] => {\n  // Return early on empty input\n  if (!splitPaths.length) {\n    return [];\n  }\n\n  // Loop through the segments of the first path\n  for (let i = 0; i <= splitPaths[0].length; i++) {\n    // Check if this path segment is present in the same position of every path\n    if (!splitPaths.every(string => string[i] === splitPaths[0][i])) {\n      // If not, return the path segments up to and including the previous segment\n      return splitPaths[0].slice(0, i);\n    }\n  }\n\n  return splitPaths[0];\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/__mocks__/fs.cjs",
    "content": "const { fs } = require('memfs');\nmodule.exports = fs;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/__mocks__/some-fetch.cjs",
    "content": "const {\n  promises: { readFile },\n} = require('fs');\nconst { join } = require('path');\nconst { buildSchema, graphql, introspectionQuery } = require('graphql');\n\nmodule.exports = {\n  someFetchFn: async () => {\n    const schemaFile = await readFile(join(__dirname, '../test-documents/schema.graphql'), 'utf8');\n    const schema = buildSchema(schemaFile);\n    global.CUSTOM_FETCH_FN_CALLED = true;\n    return {\n      headers: {\n        'content-type': 'application/json',\n      },\n      async text() {\n        return JSON.stringify(await graphql(schema, introspectionQuery));\n      },\n      async json() {\n        return JSON.parse(await this.text());\n      },\n    };\n  },\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/__snapshots__/init.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`init > custom setup 1`] = `\n\"\nimport type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  overwrite: true,\n  schema: \"http://localhost:4000\",\n  documents: \"graphql/*.ts\",\n  generates: {\n    \"src/gql/\": {\n      preset: \"client\",\n      plugins: []\n    },\n    \"./graphql.schema.json\": {\n      plugins: [\"introspection\"]\n    }\n  }\n};\n\nexport default config;\n\"\n`;\n\nexports[`init > plugins suggestions for client-side setup > should use angular related plugins when @angular/core is found 1`] = `\n\"\nimport type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  overwrite: true,\n  schema: \"http://localhost:4000\",\n  documents: \"src/**/*.ts\",\n  generates: {\n    \"src/generated/graphql.ts\": {\n      plugins: [\"typescript-apollo-angular\"]\n    }\n  }\n};\n\nexport default config;\n\"\n`;\n\nexports[`init > plugins suggestions for client-side setup > should use react related plugins when react is found 1`] = `\n\"\nimport type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  overwrite: true,\n  schema: \"http://localhost:4000\",\n  documents: \"src/**/*.tsx\",\n  generates: {\n    \"src/gql/\": {\n      preset: \"client\",\n      plugins: []\n    }\n  }\n};\n\nexport default config;\n\"\n`;\n\nexports[`init > plugins suggestions for client-side setup > should use stencil related plugins when @stencil/core is found 1`] = `\n\"\nimport type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  overwrite: true,\n  schema: \"http://localhost:4000\",\n  documents: \"src/**/*.graphql\",\n  generates: {\n    \"src/generated/graphql.tsx\": {\n      plugins: [\"typescript\", \"typescript-operations\", \"typescript-stencil-apollo\"]\n    }\n  }\n};\n\nexport default config;\n\"\n`;\n\nexports[`init > plugins suggestions non client-side setup > should use typescript related plugins when typescript is found (node) 1`] = `\n\"\nimport type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  overwrite: true,\n  schema: \"http://localhost:4000\",\n  generates: {\n    \"src/generated/graphql.ts\": {\n      plugins: [\"typescript\", \"typescript-resolvers\"]\n    }\n  }\n};\n\nexport default config;\n\"\n`;\n\nexports[`init > should have few default values for Angular 1`] = `\n\"\nimport type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  overwrite: true,\n  schema: \"http://localhost:4000\",\n  documents: \"src/**/*.tsx\",\n  generates: {\n    \"src/gql/\": {\n      preset: \"client\",\n      plugins: []\n    }\n  }\n};\n\nexport default config;\n\"\n`;\n\nexports[`init > should have few default values for React 1`] = `\n\"overwrite: true\nschema: \"./schema.ts\"\ndocuments: \"graphql/**/*.graphql\"\ngenerates:\n  graphql/index.ts:\n    preset: \"client\"\n    plugins: []\n  ./graphql.schema.json:\n    plugins:\n      - \"introspection\"\n\"\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/cli-error.spec.ts",
    "content": "import { cliError } from '../src/utils/cli-error.js';\n\ndescribe('cliError', () => {\n  let spyProcessExit: ReturnType<typeof vi.spyOn>;\n  let spyConsoleError: ReturnType<typeof vi.spyOn>;\n\n  beforeEach(() => {\n    spyProcessExit = vi.spyOn(process, 'exit');\n    spyProcessExit.mockImplementation(() => {});\n    spyConsoleError = vi.spyOn(console, 'error');\n    spyConsoleError.mockImplementation(() => {});\n  });\n\n  afterEach(() => {\n    spyProcessExit.mockRestore();\n    spyConsoleError.mockRestore();\n  });\n\n  it('should handle an Error', () => {\n    const msg = 'used as error';\n\n    cliError(new Error(msg));\n\n    expect(spyProcessExit).toBeCalledWith(1);\n  });\n\n  it('should handle string', () => {\n    const msg = 'used as string';\n\n    cliError(msg);\n\n    expect(spyProcessExit).toBeCalledWith(1);\n  });\n\n  it('should handle an object', () => {\n    const obj = {\n      foo: 1,\n    };\n\n    cliError(obj);\n\n    expect(spyProcessExit).toBeCalledWith(1);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/cli-flags.spec.ts",
    "content": "import { createContext, parseArgv } from '../src/config.js';\nimport { TempDir } from './utils.js';\n\nconst mockConfig = (str: string, file = './codegen.yml') => temp.createFile(file, str);\nconst createArgv = (str = ''): string[] => {\n  const result = ['node', 'fake.js'];\n  // eslint-disable-next-line no-control-regex\n  const regexp = /([^\\s'\"]+(['\"])([^\\x02]*?)\\x02)|[^\\s'\"]+|(['\"])([^\\x04]*?)\\x04/gi;\n\n  let match;\n  do {\n    match = regexp.exec(str);\n    if (match !== null) {\n      result.push(match[1] || match[5] || match[0]);\n    }\n  } while (match !== null);\n\n  return result;\n};\n\nconst temp = new TempDir();\n\ndescribe('CLI Flags', () => {\n  beforeEach(() => {\n    temp.clean();\n    vi.spyOn(process, 'cwd').mockImplementation(() => temp.dir);\n  });\n\n  afterEach(() => {\n    vi.clearAllMocks();\n    vi.restoreAllMocks();\n  });\n\n  afterAll(() => {\n    temp.deleteTempDir();\n  });\n\n  it('Should create basic config using new yml API', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv();\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.schema).toEqual('schema.graphql');\n    expect(config.generates).toEqual({ 'file.ts': ['plugin'] });\n  });\n\n  it('Should use different config file correctly with --config', async () => {\n    mockConfig(\n      `\n        schema: schema.graphql\n        generates:\n            file.ts:\n                - plugin\n      `,\n      'other.yml'\n    );\n    const args = createArgv('--config other.yml');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.schema).toEqual('schema.graphql');\n    expect(config.generates).toEqual({ 'file.ts': ['plugin'] });\n  });\n\n  it('Should set --watch with new YML api', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--watch');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.watch).toBeTruthy();\n  });\n\n  it('Should set watch and overwrite to default (false) with new YML api', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv();\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.watch).not.toBeTruthy();\n    expect(config.overwrite).not.toBeTruthy();\n  });\n\n  it('Should overwrite watch config using cli flag to true', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        watch: false\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--watch');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.watch).toBeTruthy();\n  });\n\n  it('Should overwrite watch config using cli flags to false', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        watch: true\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--watch=false');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.watch).toBeFalsy();\n  });\n\n  it('Should overwrite ignoreNoDocuments config using cli flags to false', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        ignoreNoDocuments: true\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--ignore-no-documents=false');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.ignoreNoDocuments).toBeFalsy();\n  });\n\n  it('Should overwrite emitLegacyCommonJSImports config using cli flags to true', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        emitLegacyCommonJSImports: false\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--emit-legacy-common-js-imports');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.emitLegacyCommonJSImports).toBeTruthy();\n  });\n\n  it('Should overwrite emitLegacyCommonJSImports config using cli flags to false', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        emitLegacyCommonJSImports: true\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--emit-legacy-common-js-imports=false');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.emitLegacyCommonJSImports).toBeFalsy();\n  });\n\n  it('Should set importExtension config using cli flags to .js', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--import-extension .js');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.importExtension).toBe('.js');\n  });\n\n  it('Should set importExtension config using cli flags to .mjs', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--import-extension .mjs');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.importExtension).toBe('.mjs');\n  });\n\n  it('Should set importExtension config using cli flags to empty string', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--import-extension \"\"');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.importExtension).toBe('');\n  });\n\n  it('Should overwrite importExtension from config using cli flags', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        importExtension: .js\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--import-extension .mjs');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.importExtension).toBe('.mjs');\n  });\n\n  it('Should overwrite importExtension config using cli flags to empty string', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        importExtension: .js\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--import-extension \"\"');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.importExtension).toBe('');\n  });\n\n  it('Should overwrite ignoreNoDocuments config using cli flags to true', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        ignoreNoDocuments: false\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--ignore-no-documents');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.ignoreNoDocuments).toBeTruthy();\n  });\n\n  it('Should set --overwrite with new YML api', async () => {\n    mockConfig(`\n        schema: schema.graphql\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--overwrite');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.overwrite).toBeTruthy();\n  });\n\n  it('Should interpolate environmental variables in YML', async () => {\n    process.env.SCHEMA_PATH = 'schema-env.graphql';\n    mockConfig(`\n        schema: \\${SCHEMA_PATH}\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--overwrite');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.schema).toBe('schema-env.graphql');\n  });\n\n  it('Should interpolate multiple environmental variables in YML', async () => {\n    process.env.SCHEMA_SCHEME = 'https';\n    process.env.SCHEMA_HOST = 'localhost';\n    mockConfig(`\n        schema: \\${SCHEMA_SCHEME}://\\${SCHEMA_HOST}/graphql\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--overwrite');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.schema).toBe('https://localhost/graphql');\n  });\n\n  it('Should interpolate environmental variables in YML and support default value', async () => {\n    process.env.SCHEMA_PATH = '';\n\n    mockConfig(`\n        schema: \\${SCHEMA_PATH:schema.graphql}\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--overwrite');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.schema).toBe('schema.graphql');\n  });\n\n  it('Should interpolate environmental variables in YML and support default value containing \":\"', async () => {\n    process.env.SCHEMA_PATH = '';\n\n    mockConfig(`\n        schema: \\${SCHEMA_PATH:http://url-to-graphql-api}\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--overwrite');\n    const context = await createContext(parseArgv(args));\n    const config = context.getConfig();\n    expect(config.schema).toBe('http://url-to-graphql-api');\n  });\n\n  it('Should load require extensions provided by cli flags', async () => {\n    process.env.SCHEMA_PATH = 'schema-env.graphql';\n    mockConfig(`\n        schema: \\${SCHEMA_PATH}\n        generates:\n            file.ts:\n                - plugin\n    `);\n    const args = createArgv('--require my-extension');\n\n    try {\n      await createContext(parseArgv(args));\n      expect(true).toBeFalsy();\n    } catch (e) {\n      expect(e.code).toEqual('MODULE_NOT_FOUND');\n    }\n  });\n});\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/codegen.spec.ts",
    "content": "import { join } from 'path';\nimport '@graphql-codegen/testing';\nimport { mergeTypeDefs } from '@graphql-tools/merge';\nimport { buildASTSchema, buildSchema, GraphQLObjectType, parse, print, OperationDefinitionNode, Kind } from 'graphql';\nimport { createContext, executeCodegen } from '../src/index.js';\nimport type { Types } from '@graphql-codegen/plugin-helpers';\n\nconst SHOULD_NOT_THROW_STRING = 'SHOULD_NOT_THROW';\nconst SIMPLE_TEST_SCHEMA = `type MyType { f: String } type Query { f: String }`;\n\ndescribe('Codegen Executor', () => {\n  describe('Generator General Options', () => {\n    it('Should output the correct filenames', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        generates: {\n          'out1.ts': { plugins: ['typescript'] },\n          'out2.ts': { plugins: ['typescript'] },\n        },\n      });\n\n      expect(result.length).toBe(2);\n      expect(result.map(f => f.filename)).toEqual(expect.arrayContaining(['out1.ts', 'out2.ts']));\n    });\n\n    it('Should load require extensions', async () => {\n      expect((global as any).dummyWasLoaded).toBeFalsy();\n      const { result } = await executeCodegen({\n        schema: join(__dirname, './test-files/schema-dir/schema-object.cjs'),\n        require: join(__dirname, './dummy-require.js'),\n        generates: {\n          'out1.ts': { plugins: ['typescript'] },\n        },\n        cwd: __dirname,\n      });\n\n      expect(result.length).toBe(1);\n      expect((global as any).dummyWasLoaded).toBeTruthy();\n    });\n\n    it('Should throw when require extension is invalid', async () => {\n      try {\n        await executeCodegen({\n          schema: join(__dirname, './test-files/schema-dir/schema-object.js'),\n          require: join(__dirname, './missing.js'),\n          generates: {\n            'out1.ts': { plugins: ['typescript'] },\n          },\n          cwd: __dirname,\n        });\n\n        throw new Error(SHOULD_NOT_THROW_STRING);\n      } catch (e) {\n        expect(e.message).not.toBe(SHOULD_NOT_THROW_STRING);\n      }\n    });\n\n    it('Should accept plugins as object', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query root { f }`,\n        generates: {\n          'out1.ts': {\n            plugins: [\n              {\n                'typescript-operations': {},\n              },\n            ],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('export type RootQuery');\n    });\n\n    it('Should accept plugins as array of objects', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query root { f }`,\n        generates: {\n          'out1.ts': {\n            plugins: [{ 'typescript-operations': {} }],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('export type RootQuery');\n    });\n\n    it('Should throw when no output files has been specified', async () => {\n      try {\n        await executeCodegen({\n          schema: SIMPLE_TEST_SCHEMA,\n          generates: {},\n        });\n\n        throw new Error(SHOULD_NOT_THROW_STRING);\n      } catch (e) {\n        expect(e.message).not.toBe(SHOULD_NOT_THROW_STRING);\n        expect(e.message).toMatch('Invalid Codegen Configuration!');\n      }\n    });\n\n    it('Should work with just schema', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        generates: {\n          'out.ts': {\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n    });\n\n    it('Should not throw when every output has a schema and there is no root schema', async () => {\n      try {\n        const { result } = await executeCodegen({\n          generates: {\n            'out.ts': {\n              schema: SIMPLE_TEST_SCHEMA,\n              plugins: ['typescript'],\n            },\n          },\n        });\n\n        expect(result.length).toBe(1);\n      } catch (e) {\n        expect(e.message).not.toBe(SHOULD_NOT_THROW_STRING);\n        expect(e.message).not.toMatch('Invalid Codegen Configuration!');\n      }\n    });\n\n    it('Should throw when there is no root schema and some outputs have not defined its own schema', async () => {\n      try {\n        await executeCodegen({\n          generates: {\n            'out.ts': {\n              plugins: ['typescript'],\n            },\n          },\n        });\n\n        throw new Error(SHOULD_NOT_THROW_STRING);\n      } catch (e) {\n        expect(e.message).toMatch('Invalid Codegen Configuration!');\n        expect(e.message).not.toBe(SHOULD_NOT_THROW_STRING);\n      }\n    });\n\n    it('Should throw when one output has no plugins or preset defined', async () => {\n      expect.assertions(1);\n      try {\n        await executeCodegen({\n          schema: SIMPLE_TEST_SCHEMA,\n          generates: {\n            'out.ts': {},\n          },\n        });\n      } catch (e) {\n        expect(e.message).toMatch('Invalid Codegen Configuration!');\n      }\n    });\n\n    it('Should throw when one output has no plugins defined', async () => {\n      expect.assertions(1);\n      try {\n        await executeCodegen({\n          schema: SIMPLE_TEST_SCHEMA,\n          generates: {\n            'out.ts': {\n              plugins: [],\n            },\n          },\n        });\n      } catch (e) {\n        expect(e.message).toMatch('Invalid Codegen Configuration!');\n      }\n    });\n\n    it('Should succeed when one output has no plugins but preset defined', async () => {\n      await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        generates: {\n          './src/gql/': {\n            preset: 'client-preset',\n          },\n        },\n      });\n    });\n\n    it('should handle extend keyword when GraphQLSchema is used', async () => {\n      const { result } = await executeCodegen({\n        schema: './tests/test-files/schema-dir/with-extend.js',\n        generates: {\n          'out.ts': {\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].filename).toBe('out.ts');\n      expect(result[0].content).toContain(`hello?: Maybe<Scalars['String']['output']>`);\n    });\n  });\n\n  describe('Per-output options', () => {\n    it('Should allow to specify schema extension for specific output', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        generates: {\n          'out1.ts': {\n            schema: `\n              type OtherType { a: String }\n            `,\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('export type Query');\n      expect(result[0].content).toContain('export type MyType');\n      expect(result[0].content).toContain('export type OtherType');\n    });\n\n    it('Should allow to specify documents extension for specific output', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        generates: {\n          'out1.ts': {\n            documents: `query q { f }`,\n            plugins: ['typescript', 'typescript-operations'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('export type QQuery');\n    });\n\n    it('Should extend existing documents', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query root { f }`,\n        generates: {\n          'out1.ts': {\n            documents: `query q { f }`,\n            plugins: ['typescript', 'typescript-operations'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('export type QQuery');\n    });\n\n    it('Should inherit root importExtension and emitLegacyCommonJSImports for preset outputs and allow per-output overrides', async () => {\n      const recordingPreset = {\n        buildGeneratesSection: ({ baseOutputDir, config }) => [\n          {\n            filename: `${baseOutputDir}recorded-config.ts`,\n            pluginMap: {\n              recorder: {\n                plugin: (_schema, _documents, pluginConfig) =>\n                  JSON.stringify({\n                    importExtension: pluginConfig.importExtension,\n                    emitLegacyCommonJSImports: pluginConfig.emitLegacyCommonJSImports,\n                  }),\n              },\n            },\n            plugins: [{ recorder: {} }],\n            schema: parse(SIMPLE_TEST_SCHEMA),\n            documents: [],\n            config,\n          },\n        ],\n      };\n\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query root { f }`,\n        emitLegacyCommonJSImports: false,\n        importExtension: '.mjs',\n        generates: {\n          './src/gql/': {\n            preset: recordingPreset,\n          },\n          './src/gql-with-override/': {\n            preset: recordingPreset,\n            config: {\n              importExtension: '.js',\n            },\n          },\n        },\n      });\n\n      expect(result).toHaveLength(2);\n\n      const inheritedOutput = result.find(file => file.filename === './src/gql/recorded-config.ts');\n      expect(inheritedOutput?.content).toBe(`{\"importExtension\":\".mjs\",\"emitLegacyCommonJSImports\":false}`);\n\n      const overriddenOutput = result.find(file => file.filename === './src/gql-with-override/recorded-config.ts');\n      expect(overriddenOutput?.content).toBe(`{\"importExtension\":\".js\",\"emitLegacyCommonJSImports\":false}`);\n    });\n\n    it('Should return error on duplicated names', async () => {\n      const { error } = await executeCodegen({\n        schema: `\n            type RootQuery { f: String }\n            schema { query: RootQuery }\n          `,\n        documents: [`query q { e }`, `query q { f }`],\n        generates: {\n          'out1.ts': { plugins: ['typescript'] },\n        },\n      });\n      expect(error.message).toContain('Not all operations have an unique name: q');\n    });\n\n    it('should handle gql tag in ts with with nested fragment', async () => {\n      const { result } = await executeCodegen({\n        schema: ['./tests/test-documents/schema.graphql'],\n        documents: ['./tests/test-documents/my-fragment.ts', './tests/test-documents/query-with-my-fragment.ts'],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript', 'typescript-operations'],\n          },\n        },\n      });\n      expect(result[0].content).toContain('MyQuery');\n      expect(result[0].filename).toEqual('out1.ts');\n    });\n\n    it('should handle gql tag in ts with with multiple nested fragment', async () => {\n      const { result } = await executeCodegen({\n        schema: ['./tests/test-documents/schema.graphql'],\n        documents: ['./tests/test-documents/my-fragment.ts', './tests/test-documents/query-with-my-fragment.ts'],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript', 'typescript-operations'],\n          },\n        },\n      });\n\n      expect(result[0].content).toContain('MyQuery');\n      expect(result[0].filename).toEqual('out1.ts');\n    });\n\n    it('should handle gql tag in js with with nested fragment', async () => {\n      const { result } = await executeCodegen({\n        schema: ['./tests/test-documents/schema.graphql'],\n        documents: ['./tests/test-documents/js-query-with-my-fragment.js', './tests/test-documents/js-my-fragment.js'],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript', 'typescript-operations'],\n          },\n        },\n      });\n\n      expect(result[0].content).toContain('MyQuery');\n      expect(result[0].filename).toEqual('out1.ts');\n    });\n\n    it('should handle TypeScript features', async () => {\n      const { result } = await executeCodegen({\n        schema: ['./tests/test-documents/schema.graphql'],\n        documents: ['./tests/test-documents/ts-features-with-query.ts'],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript', 'typescript-operations'],\n          },\n        },\n      });\n\n      expect(result[0].content).toContain('MyQuery');\n      expect(result[0].content).toContain('MyQueryInNamespace');\n      expect(result[0].filename).toEqual('out1.ts');\n    });\n\n    it('should handle multiple fragments with the same name, but one is commented out', async () => {\n      const { result } = await executeCodegen({\n        schema: ['./tests/test-documents/schema.graphql'],\n        documents: ['./tests/test-documents/query-with-commented-fragment.ts'],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript', 'typescript-operations'],\n          },\n        },\n      });\n      expect(result[0].content).toContain('MyQuery');\n      expect(result[0].filename).toEqual('out1.ts');\n    });\n\n    it('should handle graphql-tag and gatsby by default (documents)', async () => {\n      const { result } = await executeCodegen({\n        schema: ['./tests/test-documents/schema.graphql'],\n        documents: ['./tests/test-documents/gatsby-and-custom-parsers.ts'],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript', 'typescript-operations'],\n          },\n        },\n      });\n\n      expect(result[0].content).toContain('FragmentA'); // import gql from 'graphql-tag'\n      expect(result[0].content).toContain('FragmentB'); // import { graphql } from 'gatsby'\n    });\n\n    it('should handle custom graphql string parsers (documents)', async () => {\n      const { result } = await executeCodegen({\n        schema: ['./tests/test-documents/schema.graphql'],\n        documents: ['./tests/test-documents/gatsby-and-custom-parsers.ts'],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript', 'typescript-operations'],\n          },\n        },\n        pluckConfig: {\n          modules: [\n            {\n              name: 'custom-graphql-parser',\n              identifier: 'parser',\n            },\n          ],\n        },\n      });\n\n      expect(result[0].content).toContain('FragmentC'); // import { parser } from 'custom-graphql-parser';\n    });\n\n    // Dotan: @kamil please check\n    it.skip('should handle graphql-tag and gatsby by default (schema)', async () => {\n      const result = await executeCodegen({\n        schema: './tests/test-files/schema-dir/gatsby-and-custom-parsers/*.ts',\n        generates: {\n          'out1.ts': { plugins: ['typescript'] },\n        },\n      });\n\n      const { content } = result[0];\n\n      expect(content).toContain('Used graphql-tag'); // import gql from 'graphql-tag'\n      expect(content).toContain('Used gatsby'); // import { graphql } from 'gatsby'\n      expect(content).not.toContain('Used custom parser');\n    });\n\n    // Dotan: @kamil please check\n    it.skip('should handle custom graphql string parsers (schema)', async () => {\n      const result = await executeCodegen({\n        schema: './tests/test-files/schema-dir/gatsby-and-custom-parsers/*.ts',\n        generates: {\n          'out1.ts': { plugins: ['typescript'] },\n        },\n        pluckConfig: {\n          modules: [\n            {\n              name: 'custom-graphql-parser',\n              identifier: 'parser',\n            },\n          ],\n        },\n      });\n\n      const { content } = result[0];\n\n      expect(content).toContain('Used custom parser'); // import { parser } from 'custom-graphql-parser';\n      expect(content).not.toContain('Used graphql-tag');\n      expect(content).not.toContain('Used gatsby');\n    });\n  });\n\n  describe('Plugin Configuration', () => {\n    it('Should inherit root config', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query root { f }`,\n        config: {\n          namingConvention: 'change-case-all#lowerCase',\n        },\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript', 'typescript-operations'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('export type rootquery');\n      expect(result[0].content).toContain('export type root');\n    });\n\n    it('Should accept config in per-output (override)', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query root { f }`,\n        generates: {\n          'out1.ts': {\n            config: {\n              namingConvention: 'change-case-all#lowerCase',\n            },\n            plugins: ['typescript', 'typescript-operations'],\n          },\n          'out2.ts': {\n            config: {\n              namingConvention: 'change-case-all#upperCase',\n            },\n            plugins: ['typescript', 'typescript-operations'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(2);\n      expect(result[0].content).toContain('export type rootquery');\n      expect(result[1].content).toContain('export type ROOTQUERY');\n    });\n\n    it('Should accept config in per-plugin', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query root { f }`,\n        generates: {\n          'out1.ts': {\n            plugins: [\n              {\n                'typescript-operations': {\n                  namingConvention: 'change-case-all#lowerCase',\n                },\n              },\n            ],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('export type root');\n      expect(result[0].content).toContain('export type rootquery');\n    });\n\n    it('Should allow override of config in', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query root { f }`,\n        config: {\n          namingConvention: 'change-case-all#lowerCase',\n        },\n        generates: {\n          'out1.ts': {\n            plugins: [\n              {\n                'typescript-operations': {\n                  namingConvention: 'change-case-all#upperCase',\n                },\n              },\n            ],\n          },\n          'out2.ts': {\n            plugins: [\n              {\n                'typescript-operations': {\n                  namingConvention: 'change-case-all#pascalCase',\n                },\n              },\n            ],\n          },\n        },\n      });\n\n      expect(result.length).toBe(2);\n      expect(result[0].content).toContain('export type ROOTQUERY');\n      expect(result[1].content).toContain('export type RootQuery');\n    });\n  });\n\n  describe('Plugin loading', () => {\n    it('Should load custom plugin from local file', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        generates: {\n          'out1.ts': {\n            plugins: ['./tests/custom-plugins/basic.js'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('plugin');\n    });\n\n    it('Should return error when custom plugin is not valid', async () => {\n      const { error } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        generates: {\n          'out1.ts': {\n            plugins: ['./tests/custom-plugins/invalid.js'],\n          },\n        },\n      });\n      expect(error.message).toContain('Invalid Custom Plugin');\n    });\n\n    it('Should execute custom plugin validation and return error when it fails', async () => {\n      const { error } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        generates: {\n          'out1.ts': {\n            plugins: ['./tests/custom-plugins/validation.js'],\n          },\n        },\n      });\n      expect(error.message).toContain('validation failed');\n    });\n\n    it('Should allow plugins to extend schema', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        generates: {\n          'out1.ts': {\n            plugins: ['./tests/custom-plugins/extends-schema.js', './tests/custom-plugins/checks-extended-schema.js'],\n          },\n        },\n      });\n\n      expect(result[0].content).toContain('MyType,');\n      expect(result[0].content).toContain('Extension');\n      expect(result[0].content).toContain(`Should have the Extension type: 'Extension'`);\n    });\n\n    it('Should allow plugins to extend schema (using a function)', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        config: {\n          test: 'MyType',\n        },\n        generates: {\n          'out1.ts': {\n            plugins: ['./tests/custom-plugins/extends-schema-fn.js'],\n          },\n        },\n      });\n\n      expect(result[0].content).toContain('MyType');\n    });\n  });\n\n  describe('Schema Merging', () => {\n    it('should keep definitions of all directives', async () => {\n      const merged = buildASTSchema(\n        mergeTypeDefs([\n          buildSchema(SIMPLE_TEST_SCHEMA),\n          buildSchema(/* GraphQL */ `\n            directive @id on FIELD_DEFINITION\n\n            type Post {\n              id: String @id\n            }\n          `),\n        ])\n      );\n\n      expect(merged.getDirectives().map(({ name }) => name)).toContainEqual('id');\n    });\n\n    it('should keep directives in types', async () => {\n      const merged = buildASTSchema(\n        mergeTypeDefs([\n          buildSchema(SIMPLE_TEST_SCHEMA),\n          buildSchema(/* GraphQL */ `\n            directive @id on FIELD_DEFINITION\n            directive @test on OBJECT\n\n            type Post @test {\n              id: String @id\n            }\n\n            type Query {\n              posts: [Post]\n            }\n\n            schema {\n              query: Query\n            }\n          `),\n        ])\n      );\n\n      expect(merged.getType('Post').astNode.directives.map(({ name }) => name.value)).toContainEqual('test');\n      expect(\n        (merged.getType('Post') as GraphQLObjectType).getFields().id.astNode.directives.map(({ name }) => name.value)\n      ).toContainEqual('id');\n    });\n\n    it('should keep scalars', async () => {\n      const schemaA = SIMPLE_TEST_SCHEMA;\n      const schemaB = `\n        scalar UniqueID\n\n        type Post {\n          id: UniqueID\n        }\n      `;\n      const schemaC = parse(`\n        scalar NotUniqueID\n      `);\n\n      const merged = mergeTypeDefs([schemaA, schemaB, schemaC]);\n\n      expect(print(merged)).toContain('scalar UniqueID');\n      expect(print(merged)).toContain('scalar NotUniqueID');\n\n      const schema = buildASTSchema(merged);\n\n      expect(schema.getType('UniqueID')).toBeDefined();\n      expect(schema.getType('NotUniqueID')).toBeDefined();\n    });\n\n    it('should keep scalars when executing codegen', async () => {\n      const schemaA = SIMPLE_TEST_SCHEMA;\n      const schemaB = `\n        scalar UniqueID\n\n        type Post {\n          id: UniqueID\n        }\n      `;\n\n      const { result } = await executeCodegen({\n        schema: [schemaA, schemaB],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toBeSimilarStringTo(`export type Scalars = {\n        ID: { input: string; output: string; }\n        String: { input: string; output: string; }\n        Boolean: { input: boolean; output: boolean; }\n        Int: { input: number; output: number; }\n        Float: { input: number; output: number; }\n        UniqueID: { input: any; output: any; }\n      };`);\n    });\n  });\n\n  describe('Parsed GraphQLSchema input', () => {\n    it('should accept a GraphQLSchema instance as root schema', async () => {\n      const schema = buildSchema(SIMPLE_TEST_SCHEMA);\n      const { result } = await executeCodegen({\n        schema,\n        generates: {\n          'out1.ts': { plugins: ['typescript'] },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('MyType');\n    });\n\n    it('should accept a GraphQLSchema instance in an array', async () => {\n      const schema = buildSchema(SIMPLE_TEST_SCHEMA);\n      const { result } = await executeCodegen({\n        schema: [schema],\n        generates: {\n          'out1.ts': { plugins: ['typescript'] },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('MyType');\n    });\n\n    it('should merge a GraphQLSchema instance with an SDL string', async () => {\n      const schema = buildSchema(SIMPLE_TEST_SCHEMA);\n      const { result } = await executeCodegen({\n        schema: [schema, `type Post { id: ID! }`],\n        generates: {\n          'out1.ts': { plugins: ['typescript'] },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('MyType');\n      expect(result[0].content).toContain('Post');\n    });\n\n    it('should merge two GraphQLSchema instances', async () => {\n      const schemaA = buildSchema(SIMPLE_TEST_SCHEMA);\n      const schemaB = buildSchema(`type Post { id: ID! } type Query { posts: [Post] }`);\n      const { result } = await executeCodegen({\n        schema: [schemaA, schemaB],\n        generates: {\n          'out1.ts': { plugins: ['typescript'] },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('MyType');\n      expect(result[0].content).toContain('Post');\n    });\n\n    it('should accept a GraphQLSchema instance as output-level schema', async () => {\n      const schema = buildSchema(SIMPLE_TEST_SCHEMA);\n      const { result } = await executeCodegen({\n        generates: {\n          'out1.ts': {\n            schema,\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('MyType');\n    });\n\n    it('should merge root SDL string with output-level GraphQLSchema instance', async () => {\n      const outputSchema = buildSchema(`type Post { id: ID! } type Query { posts: [Post] }`);\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        generates: {\n          'out1.ts': {\n            schema: outputSchema,\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('MyType');\n      expect(result[0].content).toContain('Post');\n    });\n\n    it('should work with documents when schema is a GraphQLSchema instance', async () => {\n      const schema = buildSchema(SIMPLE_TEST_SCHEMA);\n      const { result } = await executeCodegen({\n        schema,\n        documents: `query root { f }`,\n        generates: {\n          'out1.ts': { plugins: ['typescript', 'typescript-operations'] },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('RootQuery');\n    });\n\n    it('should preserve custom scalars from a GraphQLSchema instance', async () => {\n      const schema = buildSchema(`\n        scalar DateTime\n        type Query { now: DateTime }\n      `);\n      const { result } = await executeCodegen({\n        schema,\n        generates: {\n          'out1.ts': { plugins: ['typescript'] },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('DateTime');\n    });\n  });\n\n  describe('Custom schema loader', () => {\n    it('Should allow custom loaders to load schema on root level', async () => {\n      await executeCodegen({\n        schema: [\n          {\n            './tests/test-documents/schema.graphql': {\n              loader: './tests/custom-loaders/custom-schema-loader.cjs',\n            },\n          },\n        ],\n        generates: {\n          'out1.ts': { plugins: ['typescript'] },\n        },\n      });\n\n      expect((global as any).CUSTOM_SCHEMA_LOADER_CALLED).toBeTruthy();\n    });\n\n    it('Should allow custom loaders to load schema on output level', async () => {\n      await executeCodegen({\n        generates: {\n          'out1.ts': {\n            schema: [\n              {\n                './tests/test-documents/schema.graphql': {\n                  loader: './tests/custom-loaders/custom-schema-loader.cjs',\n                },\n              },\n            ],\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect((global as any).CUSTOM_SCHEMA_LOADER_CALLED).toBeTruthy();\n    });\n\n    it('Should return error when invalid return value from loader', async () => {\n      const { error } = await executeCodegen({\n        schema: [\n          {\n            './tests/test-documents/schema.graphql': {\n              loader: './tests/custom-loaders/invalid-return-value-schema-loader.cjs',\n            },\n          },\n        ],\n        generates: {\n          'out1.ts': { plugins: ['typescript'] },\n        },\n      });\n\n      expect(error.message).toContain('Failed to load schema');\n    });\n\n    it('Should return error when invalid module specified as loader', async () => {\n      const { error } = await executeCodegen({\n        schema: [\n          {\n            './tests/test-documents/schema.graphql': {\n              loader: './tests/custom-loaders/non-existing.js',\n            },\n          },\n        ],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect(error.message).toContain('Failed to load custom loader');\n    });\n\n    it('Should return error when invalid file declaration', async () => {\n      const { error } = await executeCodegen({\n        schema: [\n          {\n            './tests/test-documents/schema.graphql': {\n              loader: './tests/custom-loaders/invalid-export.cjs',\n            },\n          },\n        ],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect(error.message).toContain('Failed to load schema');\n      expect(error.message).toContain('Failed to load custom loader');\n    });\n  });\n\n  describe('Custom documents loader', () => {\n    it('Should allow to use custom documents loader on root level', async () => {\n      await executeCodegen({\n        schema: ['./tests/test-documents/schema.graphql'],\n        documents: [\n          {\n            './tests/test-documents/valid.graphql': {\n              loader: './tests/custom-loaders/custom-documents-loader.cjs',\n            },\n          },\n        ],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect((global as any).CUSTOM_DOCUMENT_LOADER_CALLED).toBeTruthy();\n    });\n\n    it('Should allow custom loaders to load documents on output level', async () => {\n      await executeCodegen({\n        schema: ['./tests/test-documents/schema.graphql'],\n        generates: {\n          'out1.ts': {\n            documents: [\n              {\n                './tests/test-documents/valid.graphql': {\n                  loader: join(__dirname, './custom-loaders/custom-documents-loader.js'),\n                },\n              },\n            ],\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect((global as any).CUSTOM_DOCUMENT_LOADER_CALLED).toBeTruthy();\n    });\n\n    it('Should return error when invalid return value from custom documents loader', async () => {\n      const { error } = await executeCodegen({\n        schema: ['./tests/test-documents/schema.graphql'],\n        documents: [\n          {\n            './tests/test-documents/valid.graphql': {\n              loader: './tests/custom-loaders/invalid-return-value-documents-loader.cjs',\n            },\n          },\n        ],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect(error.message).toContain('Unable to find any GraphQL type definitions for the following pointers');\n    });\n\n    it('Should return error when invalid module specified as loader', async () => {\n      const { error } = await executeCodegen({\n        schema: ['./tests/test-documents/schema.graphql'],\n        documents: [\n          {\n            './tests/test-documents/valid.graphql': {\n              loader: './tests/custom-loaders/non-existing.js',\n            },\n          },\n        ],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect(error.message).toContain('Failed to load custom loader');\n    });\n\n    it('Should return error when invalid file declaration', async () => {\n      const { error } = await executeCodegen({\n        schema: ['./tests/test-documents/schema.graphql'],\n        documents: [\n          {\n            './tests/test-documents/valid.graphql': {\n              loader: './tests/custom-loaders/invalid-export.cjs',\n            },\n          },\n        ],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript'],\n          },\n        },\n      });\n\n      expect(error.message).toContain('Failed to load custom loader');\n    });\n  });\n\n  it('should load schema with custom fetch', async () => {\n    try {\n      await executeCodegen({\n        schema: ['http://www.dummyschema.com/graphql'],\n        customFetch: 'some-fetch#someFetchFn',\n        documents: ['./tests/test-documents/valid.graphql'],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript'],\n          },\n        },\n      });\n    } catch (error) {\n      expect(error.message).toContain('Failed to load schema from http://www.dummyschema.com/graphql');\n    }\n    expect((global as any).CUSTOM_FETCH_FN_CALLED).toBeTruthy();\n  });\n\n  it('should load schema with custom fetch function', async () => {\n    let fetchCalledFor = null;\n\n    async function myCustomFetch(url: string, _options?: RequestInit): Promise<Response> {\n      fetchCalledFor = url;\n      return Promise.resolve(new Response());\n    }\n\n    try {\n      await executeCodegen({\n        schema: ['http://www.dummyschema.com/graphql'],\n        customFetch: myCustomFetch,\n        documents: ['./tests/test-documents/valid.graphql'],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript'],\n          },\n        },\n      });\n    } catch (error) {\n      expect(error.message).toContain('Failed to load schema from http://www.dummyschema.com/graphql');\n    }\n    expect(fetchCalledFor).toBe('http://www.dummyschema.com/graphql');\n  });\n\n  it('should evaluate glob expressions correctly', async () => {\n    try {\n      await executeCodegen({\n        schema: ['./tests/test-documents/*schema.graphql', '!./tests/test-documents/invalid-schema.graphql'],\n        documents: [\n          './tests/test-documents/*.graphql',\n          '!./tests/test-documents/invalid-*.graphql',\n          '!./tests/test-documents/unused-*.graphql',\n        ],\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript'],\n          },\n        },\n      });\n    } catch (e) {\n      // eslint-disable-next-line no-console\n      console.error(e);\n      throw new Error('This should not throw as the invalid file is excluded via glob.');\n    }\n  });\n\n  it('Should allow plugins to extend schema with custom root', async () => {\n    try {\n      const { result } = await executeCodegen({\n        schema: `schema { query: RootQuery } type MyType { f: String } type RootQuery { f: String }`,\n        documents: `query root { f }`,\n        generates: {\n          'out1.ts': {\n            plugins: ['./tests/custom-plugins/extends-schema.js', './tests/custom-plugins/checks-extended-schema.js'],\n          },\n        },\n      });\n      expect(result.length).toBe(1);\n    } catch (e) {\n      expect(e.message).not.toBe('Query root type must be provided.');\n    }\n  });\n\n  it('Should allow plugin context to be accessed and modified', async () => {\n    const { result } = await executeCodegen({\n      schema: [\n        {\n          './tests/test-documents/schema.graphql': {\n            loader: './tests/custom-loaders/custom-schema-loader-with-context.cjs',\n          },\n        },\n      ],\n      generates: {\n        'out1.ts': {\n          plugins: ['./tests/custom-plugins/context.js'],\n        },\n      },\n    });\n\n    expect(result.length).toBe(1);\n    expect(result[0].content).toContain('Hello world!');\n  });\n\n  it('Should sort the input schema', async () => {\n    const nonSortedSchema = /* GraphQL */ `\n      type Query {\n        d: String\n        z: String\n        a: String\n      }\n\n      type User {\n        aa: String\n        a: String\n      }\n\n      type A {\n        s: String\n        b: String\n      }\n    `;\n    const { result } = await executeCodegen({\n      schema: [nonSortedSchema],\n      generates: {\n        'out1.graphql': {\n          plugins: ['schema-ast'],\n        },\n      },\n      config: {\n        sort: true,\n      },\n    });\n\n    expect(result.length).toBe(1);\n    expect(result[0].content).toBeSimilarStringTo(/* GraphQL */ `\n      type A {\n        b: String\n        s: String\n      }\n\n      type Query {\n        a: String\n        d: String\n        z: String\n      }\n\n      type User {\n        a: String\n        aa: String\n      }\n    `);\n  });\n\n  it('Handles weird errors due to invalid schema', async () => {\n    const schema = /* GraphQL */ `\n      type Query {\n        brrrt:1\n      }\n    `;\n    try {\n      await executeCodegen({\n        schema: [schema],\n        generates: {\n          'out1.graphql': {\n            plugins: ['schema-ast'],\n          },\n        },\n      });\n    } catch (error) {\n      expect(error.message).toContain('Failed to load schema from');\n    }\n  });\n\n  it('Should generate documents output even if prj1/documents and prj1/extensions/codegen/generate/xxx/documents are both definded with the same glob files', async () => {\n    const prj1 = await createContext({\n      config: './tests/test-files/graphql.config.js',\n      project: 'prj1',\n      errorsOnly: true,\n      overwrite: true,\n      profile: true,\n      require: [],\n      silent: false,\n      watch: false,\n    });\n    const config = prj1.getConfig();\n    const { result } = await executeCodegen(config);\n    expect(result[0].content).toContain('DocumentNode<MyQueryQuery, MyQueryQueryVariables>');\n  });\n\n  describe('Document Transform', () => {\n    it('Should transform documents', async () => {\n      const transform: Types.DocumentTransformFunction = ({ documents }) => {\n        const newDocuments = [\n          {\n            document: {\n              ...documents[0].document,\n              definitions: [\n                {\n                  ...documents[0].document.definitions[0],\n                  name: { kind: Kind.NAME, value: 'bar' },\n                } as OperationDefinitionNode,\n              ],\n            },\n          },\n        ];\n        return newDocuments;\n      };\n\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query foo { f }`,\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript', 'typescript-operations'],\n            documentTransforms: [{ transform }],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('export type BarQuery');\n    });\n\n    it('Should allow users to set config', async () => {\n      const generateDocumentTransform: (config: { queryName: string }) => Types.DocumentTransformObject = ({\n        queryName,\n      }) => {\n        return {\n          transform: ({ documents }) => {\n            const newDocuments = [\n              {\n                document: {\n                  ...documents[0].document,\n                  definitions: [\n                    {\n                      ...documents[0].document.definitions[0],\n                      name: { kind: Kind.NAME, value: queryName },\n                    } as OperationDefinitionNode,\n                  ],\n                },\n              },\n            ];\n            return newDocuments;\n          },\n        };\n      };\n\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query foo { f }`,\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript', 'typescript-operations'],\n            documentTransforms: [generateDocumentTransform({ queryName: 'test' })],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('export type TestQuery');\n    });\n\n    it('Should transform documents when specifying files', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query root { f }`,\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript', 'typescript-operations'],\n            documentTransforms: ['./tests/custom-document-transforms/document-transform.js'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('export type BarQuery');\n    });\n\n    it('Should allow users to set config when specifying files', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query root { f }`,\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript', 'typescript-operations'],\n            documentTransforms: [\n              {\n                './tests/custom-document-transforms/test-config.js': {\n                  queryName: 'test',\n                },\n              },\n            ],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('export type TestQuery');\n    });\n\n    it('Should allow plugin context to be accessed and modified', async () => {\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query root { f }`,\n        generates: {\n          'out1.ts': {\n            documentTransforms: [\n              {\n                transform: ({ pluginContext, documents }) => {\n                  pluginContext.myPluginInfo = 'world';\n                  return documents;\n                },\n              },\n            ],\n            plugins: ['./tests/custom-plugins/document-transform-context.js'],\n          },\n        },\n      });\n\n      expect(result.length).toBe(1);\n      expect(result[0].content).toContain('Hello world!');\n    });\n\n    it('should return error an understandable error if it fails.', async () => {\n      const { error } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query foo { f }`,\n        generates: {\n          'out1.ts': {\n            plugins: ['typescript'],\n            documentTransforms: [\n              {\n                transform: () => {\n                  throw new Error('Something Wrong!');\n                },\n              },\n            ],\n          },\n        },\n      });\n\n      expect(error.message).toContain('DocumentTransform \"the element at index 0 of the documentTransforms\" failed');\n      expect(error.message).toContain('Something Wrong!');\n    });\n\n    it('Should transform documents with client-preset', async () => {\n      const transform: Types.DocumentTransformFunction = ({ documents }) => {\n        const newDocuments = [\n          {\n            document: {\n              ...documents[0].document,\n              definitions: [\n                {\n                  ...documents[0].document.definitions[0],\n                  name: { kind: Kind.NAME, value: 'bar' },\n                } as OperationDefinitionNode,\n              ],\n            },\n          },\n        ];\n        return newDocuments;\n      };\n\n      const { result } = await executeCodegen({\n        schema: SIMPLE_TEST_SCHEMA,\n        documents: `query foo { f }`,\n        generates: {\n          './src/gql/': {\n            preset: 'client',\n            documentTransforms: [{ transform }],\n          },\n        },\n      });\n\n      const fileOutput = result.find(file => file.filename === './src/gql/graphql.ts');\n      expect(fileOutput.content).toContain('export type BarQuery');\n    });\n  });\n\n  it('should not run out of memory when generating very complex types (issue #7720)', async () => {\n    const { result } = await executeCodegen({\n      schema: ['../../dev-test/gatsby/schema.graphql'],\n      documents: ['../../dev-test/gatsby/fragments.ts'],\n      config: {\n        extractAllFieldsToTypes: true,\n        dedupeOperationSuffix: true,\n      },\n      generates: {\n        'out1.ts': {\n          plugins: ['typescript', 'typescript-operations'],\n        },\n      },\n    });\n    expect(result.length).toBe(1);\n    expect(result[0].content).toContain('export type WpCoreImageBlockForGalleryFragment = ');\n  });\n});\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/config.spec.ts",
    "content": "import { buildSchema } from 'graphql';\nimport { createContext, ensureContext, CodegenContext } from '../src/index.js';\n\ndescribe('Codegen config - Context', () => {\n  it('loads and merge multiple schemas when using GraphQL config', async () => {\n    const context = await createContext({\n      config: './tests/test-files/graphql.config.js',\n      project: 'prj1',\n      errorsOnly: true,\n      overwrite: true,\n      profile: true,\n      require: [],\n      silent: false,\n      watch: false,\n    });\n\n    const schema1 = /* GraphQL */ `\n      type Query\n      scalar Date\n    `;\n\n    const schema2 = /* GraphQL */ `\n      extend type Query {\n        me: User\n      }\n      type User {\n        id: ID!\n        name: String!\n        createdAt: Date!\n      }\n    `;\n\n    const schema3 = /* GraphQL */ `\n      extend type Query {\n        media: Media\n      }\n      interface Media {\n        id: ID!\n      }\n      type Image implements Media {\n        id: ID!\n        url: String!\n      }\n      type Book implements Media {\n        id: ID!\n        title: String!\n      }\n    `;\n\n    const mergedSchema = await context.loadSchema([schema1, schema2, schema3]);\n\n    const typeMap = mergedSchema.getTypeMap();\n\n    expect(typeMap['Query']).toBeDefined();\n    expect(typeMap['Date']).toBeDefined();\n    expect(typeMap['User']).toBeDefined();\n    expect(typeMap['Media']).toBeDefined();\n    expect(typeMap['Image']).toBeDefined();\n    expect(typeMap['Book']).toBeDefined();\n  });\n\n  it('loads and merge multiple schemas when using input config', async () => {\n    const context = ensureContext({\n      generates: {},\n    });\n\n    const schema1 = /* GraphQL */ `\n      type Mutation\n      scalar DateTime\n    `;\n\n    const schema2 = /* GraphQL */ `\n      extend type Mutation {\n        createUser: User\n      }\n      type User {\n        id: ID!\n        createdAt: DateTime!\n      }\n    `;\n\n    const mergedSchema = await context.loadSchema([schema1, schema2]);\n\n    const typeMap = mergedSchema.getTypeMap();\n\n    expect(typeMap['Mutation']).toBeDefined();\n    expect(typeMap['DateTime']).toBeDefined();\n    expect(typeMap['User']).toBeDefined();\n  });\n\n  it('passes nested config values to graphql-config schema loader', async () => {\n    const loadSchemaSpy = vi.fn().mockResolvedValue(buildSchema('type Query { _: Boolean }'));\n    const project = {\n      extension: vi.fn().mockReturnValue({\n        generates: {},\n        config: {\n          inputValueDeprecation: true,\n        },\n      }),\n      schema: ['http://example.com/graphql'],\n      documents: [],\n      loadSchema: loadSchemaSpy,\n      loadDocuments: vi.fn(),\n    };\n    const graphqlConfig = {\n      filepath: '/tmp/graphql.config.ts',\n      dirpath: '/tmp',\n      getProject: vi.fn().mockReturnValue(project),\n    } as any;\n\n    const context = new CodegenContext({ graphqlConfig });\n    await context.loadSchema(['http://example.com/graphql']);\n\n    expect(loadSchemaSpy).toHaveBeenCalledWith(\n      ['http://example.com/graphql'],\n      'GraphQLSchema',\n      expect.objectContaining({\n        inputValueDeprecation: true,\n      })\n    );\n  });\n});\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-document-transforms/document-transform.js",
    "content": "module.exports = {\n  transform: ({ documents }) => {\n    const newDocuments = [\n      {\n        document: {\n          ...documents[0].document,\n          definitions: [\n            {\n              ...documents[0].document.definitions[0],\n              name: { kind: 'Name', value: 'bar' },\n            },\n          ],\n        },\n      },\n    ];\n    return newDocuments;\n  },\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-document-transforms/test-config.js",
    "content": "module.exports = {\n  transform: ({ documents, config }) => {\n    const newDocuments = [\n      {\n        document: {\n          ...documents[0].document,\n          definitions: [\n            {\n              ...documents[0].document.definitions[0],\n              name: { kind: 'Name', value: config.queryName },\n            },\n          ],\n        },\n      },\n    ];\n    return newDocuments;\n  },\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-loaders/custom-documents-loader.cjs",
    "content": "const { parse } = require('graphql');\nconst { readFileSync } = require('fs');\nconst { join } = require('path');\n\nmodule.exports = function (docString, _config) {\n  global.CUSTOM_DOCUMENT_LOADER_CALLED = true;\n\n  return parse(readFileSync(join(process.cwd(), docString), 'utf8'));\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-loaders/custom-schema-loader-with-context.cjs",
    "content": "const { buildSchema } = require('graphql');\nconst { readFileSync } = require('fs');\nconst { join } = require('path');\n\nmodule.exports = function (schemaString, config) {\n  config.pluginContext.hello = 'world';\n  return buildSchema(readFileSync(join(process.cwd(), schemaString), 'utf8'));\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-loaders/custom-schema-loader.cjs",
    "content": "const { buildSchema } = require('graphql');\nconst { readFileSync } = require('fs');\nconst { join } = require('path');\n\nmodule.exports = function (schemaString, _config) {\n  global.CUSTOM_SCHEMA_LOADER_CALLED = true;\n\n  return buildSchema(readFileSync(join(process.cwd(), schemaString), 'utf8'));\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-loaders/invalid-export.cjs",
    "content": "module.exports = 'oops';\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-loaders/invalid-return-value-documents-loader.cjs",
    "content": "module.exports = function (schemaString, _config) {\n  return schemaString;\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-loaders/invalid-return-value-schema-loader.cjs",
    "content": "module.exports = function (schemaString, _config) {\n  return schemaString;\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-plugins/basic.js",
    "content": "module.exports = {\n  plugin(_schema, _documents, _config) {\n    return 'plugin';\n  },\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-plugins/checks-extended-schema.js",
    "content": "module.exports = {\n  plugin(schema, _documents, _config) {\n    return `\n      Should have the Extension type: '${schema.getType('Extension')}'\n    `;\n  },\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-plugins/context.js",
    "content": "module.exports = {\n  plugin: (_schema, _documents, _config, { pluginContext }) => {\n    return `Hello ${pluginContext.hello}!`;\n  },\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-plugins/document-transform-context.js",
    "content": "module.exports = {\n  plugin: (_schema, _documents, _config, { pluginContext }) => {\n    return `Hello ${pluginContext.myPluginInfo}!`;\n  },\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-plugins/extends-schema-fn.js",
    "content": "module.exports = {\n  plugin(schema, _documents, _config) {\n    return Object.keys(schema.getTypeMap()).join(', ');\n  },\n  addToSchema: c => `type ${c.test} { f: String }`,\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-plugins/extends-schema.js",
    "content": "module.exports = {\n  plugin(schema, _documents, _config) {\n    return Object.keys(schema.getTypeMap()).join(',');\n  },\n  addToSchema: `type Extension { f: String }`,\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-plugins/invalid.js",
    "content": "module.exports = {};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/custom-plugins/validation.js",
    "content": "module.exports = {\n  plugin(_schema, _documents, _config) {\n    return 'plugin';\n  },\n  validate() {\n    throw new Error('Invalid!');\n  },\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/dummy-require.js",
    "content": "// Just set something in global so the test can verify that it got set and thereby know that this module was loaded\nglobal.dummyWasLoaded = true;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/generate-and-save.spec.ts",
    "content": "import { dirname, join } from 'path';\nimport logSymbols from 'log-symbols';\nimport { Types } from '@graphql-codegen/plugin-helpers';\nimport '@graphql-codegen/testing';\nimport makeDir from 'make-dir';\nimport { createContext } from '../src/config.js';\nimport { generate } from '../src/generate-and-save.js';\nimport * as fs from '../src/utils/file-system.js';\nimport { setLogger } from '../src/utils/logger.js';\n\nconst SIMPLE_TEST_SCHEMA = `type MyType { f: String } type Query { f: String }`;\n\nconst inputFile = join(__dirname, '../temp/input-graphql.tsx');\nconst outputFile = join(__dirname, '../temp/output-graphql.tsx');\n\nconst writeSpy = vi.spyOn(fs, 'writeFile');\nconst readSpy = vi.spyOn(fs, 'readFile');\nconst outputErrorSpy = vi.spyOn(process.stderr, 'write');\n\ndescribe('generate-and-save', () => {\n  beforeEach(() => {\n    // We must call .spyOn and .mockReset these individually instead of vi.resetAllMocks\n    // because there's a `vi.spyOn(process, 'cwd').mockImplementation(() => __dirname);` in vitest.setup.ts\n    //\n    // If we called vi.resetAllMocks, the cwd spy is reset too!\n    // That would cause all `schema` and `documents`paths to be from the root of the workspace\n    writeSpy.mockReset();\n    readSpy.mockReset();\n    outputErrorSpy.mockReset();\n  });\n\n  test('allow to specify overwrite for specific output (should write file)', async () => {\n    const filename = 'overwrite.ts';\n    writeSpy.mockImplementation(() => Promise.resolve());\n\n    const output = await generate(\n      {\n        schema: SIMPLE_TEST_SCHEMA,\n        overwrite: false,\n        generates: {\n          [filename]: {\n            overwrite: true,\n            schema: `\n            type OtherType { a: String }\n          `,\n            plugins: ['typescript'],\n          },\n        },\n      },\n      true\n    );\n\n    expect(output.length).toBe(1);\n    // makes sure it writes a new file\n    expect(writeSpy).toHaveBeenCalled();\n  });\n\n  test('allow to specify overwrite for specific output (should not write file)', async () => {\n    const filename = 'overwrite.ts';\n    writeSpy.mockImplementation(() => Promise.resolve());\n    readSpy.mockImplementation(async () => ''); // forces file to exist\n\n    const output = await generate(\n      {\n        schema: SIMPLE_TEST_SCHEMA,\n        overwrite: true,\n        generates: {\n          [filename]: {\n            overwrite: false,\n            schema: `\n            type OtherType { a: String }\n          `,\n            plugins: ['typescript'],\n          },\n        },\n      },\n      true\n    );\n\n    expect(output.length).toBe(1);\n    // makes sure it checks if file is there\n    expect(readSpy).toHaveBeenCalledWith(filename);\n    // makes sure it doesn't write a new file\n    expect(writeSpy).not.toHaveBeenCalled();\n  });\n\n  test('should use global overwrite option and write a file', async () => {\n    const filename = 'overwrite.ts';\n    writeSpy.mockImplementation(() => Promise.resolve());\n\n    const output = await generate(\n      {\n        schema: SIMPLE_TEST_SCHEMA,\n        overwrite: true,\n        generates: {\n          [filename]: {\n            schema: `\n            type OtherType { a: String }\n          `,\n            plugins: ['typescript'],\n          },\n        },\n      },\n      true\n    );\n\n    expect(output.length).toBe(1);\n    // makes sure it writes a new file\n    expect(writeSpy).toHaveBeenCalled();\n  });\n\n  test('should use global overwrite option and not write a file', async () => {\n    const filename = 'overwrite.ts';\n    writeSpy.mockImplementation(() => Promise.resolve());\n    readSpy.mockImplementation(async () => ''); // forces file to exist\n\n    const output = await generate(\n      {\n        schema: SIMPLE_TEST_SCHEMA,\n        overwrite: false,\n        generates: {\n          [filename]: {\n            schema: `\n            type OtherType { a: String }\n          `,\n            plugins: ['typescript'],\n          },\n        },\n      },\n      true\n    );\n\n    expect(output.length).toBe(1);\n    // makes sure it checks if file is there\n    expect(readSpy).toHaveBeenCalledWith(filename);\n    // makes sure it doesn't write a new file\n    expect(writeSpy).not.toHaveBeenCalled();\n  });\n\n  test('should overwrite a file by default', async () => {\n    const filename = 'overwrite.ts';\n    writeSpy.mockImplementation(() => Promise.resolve());\n    readSpy.mockImplementation(() => Promise.resolve(''));\n    readSpy.mockImplementation(async _f => '');\n\n    const output = await generate(\n      {\n        schema: SIMPLE_TEST_SCHEMA,\n        generates: {\n          [filename]: {\n            schema: /* GraphQL */ `\n              type OtherType {\n                a: String\n              }\n            `,\n            plugins: ['typescript'],\n          },\n        },\n      },\n      true\n    );\n\n    expect(output.length).toBe(1);\n    // makes sure it doesn't write a new file\n    expect(writeSpy).toHaveBeenCalled();\n  });\n\n  test('should override generated files', async () => {\n    vi.unmock('fs');\n    const fs = await import('fs');\n\n    makeDir.sync(dirname(outputFile));\n    if (fs.existsSync(outputFile)) {\n      fs.unlinkSync(outputFile);\n    }\n    fs.writeFileSync(\n      inputFile,\n      `\n    import gql from 'graphql-tag';\n    const MyQuery = gql\\`query MyQuery { f }\\`;\n  `,\n      'utf8'\n    );\n    const generateOnce: () => Promise<Types.FileOutput[]> = () =>\n      generate(\n        {\n          schema: SIMPLE_TEST_SCHEMA,\n          documents: inputFile,\n          generates: {\n            [outputFile]: {\n              plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],\n            },\n          },\n        },\n        true\n      );\n    const [firstOutput] = await generateOnce();\n    fs.writeFileSync(firstOutput.filename, firstOutput.content);\n    await generateOnce();\n  });\n  test('should extract a document from the gql tag (imported from apollo-server)', async () => {\n    const filename = 'overwrite.ts';\n    writeSpy.mockImplementation(() => Promise.resolve());\n\n    const output = await generate(\n      {\n        schema: './tests/test-files/schema-dir/gatsby-and-custom-parsers/apollo-server.ts',\n        generates: {\n          [filename]: {\n            plugins: ['typescript'],\n          },\n        },\n      },\n      true\n    );\n\n    expect(output.length).toBe(1);\n    expect(output[0].content).toMatch('Used apollo-server');\n    // makes sure it doesn't write a new file\n    expect(writeSpy).toHaveBeenCalled();\n  });\n  test('should allow to alter the content with the beforeOneFileWrite hook', async () => {\n    const filename = 'modify.ts';\n    writeSpy.mockImplementation(() => Promise.resolve());\n\n    const output = await generate(\n      {\n        schema: SIMPLE_TEST_SCHEMA,\n        generates: {\n          [filename]: {\n            plugins: ['typescript'],\n            hooks: {\n              beforeOneFileWrite: [() => 'new content'],\n            },\n          },\n        },\n      },\n      true\n    );\n\n    expect(output.length).toBe(1);\n    expect(output[0].content).toMatch('new content');\n    // makes sure it doesn't write a new file\n    expect(writeSpy).toHaveBeenCalled();\n  });\n\n  describe('Errors when loading pointers', () => {\n    const originalNodeEnv = process.env.NODE_ENV;\n\n    beforeEach(() => {\n      // By default, the NODE_ENV is set to 'test', and this is used to silent console errors.\n      // For these tests below, we want to see what's being logged out to console errors.\n      process.env.NODE_ENV = 'not_test_so_error';\n      vi.spyOn(process.stdout, 'write').mockImplementation(() => true);\n    });\n\n    afterEach(() => {\n      process.env.NODE_ENV = originalNodeEnv;\n    });\n\n    test('Schema syntax error - should print native GraphQLError', async () => {\n      expect.assertions(1);\n      outputErrorSpy.mockImplementation(() => true);\n      try {\n        await generate(\n          {\n            verbose: true,\n            schema: './tests/test-files/schema-dir/error-schema.graphql',\n            generates: {\n              'src/test.ts': {\n                plugins: ['typescript'],\n              },\n            },\n          },\n          false\n        );\n      } catch {\n        const cwd = process.cwd(); // cwd is different for every machine, remember to replace local path with this after updating snapshot\n        expect(outputErrorSpy.mock.calls[0][0]).toMatchInlineSnapshot(`\n          \"[FAILED] Failed to load schema from ./tests/test-files/schema-dir/error-schema.graphql:\n          [FAILED] Syntax Error: Expected Name, found \"!\".\n\n          [FAILED] ${cwd}/tests/test-files/schema-dir/error-schema.graphql:2:15\n          [FAILED] 1 | type Query {\n          [FAILED] 2 |   foo: String!!\n          [FAILED]   |               ^\n          [FAILED] 3 | }\n\n          [FAILED] GraphQL Code Generator supports:\n\n          [FAILED] - ES Modules and CommonJS exports (export as default or named export \"schema\")\n          [FAILED] - Introspection JSON File\n          [FAILED] - URL of GraphQL endpoint\n          [FAILED] - Multiple files with type definitions (glob expression)\n          [FAILED] - String in config file\n\n          [FAILED] Try to use one of above options and run codegen again.\n\n          \"\n        `);\n      }\n    });\n\n    test('Document syntax error - should print native GraphQLError', async () => {\n      expect.assertions(1);\n      outputErrorSpy.mockImplementation(() => true);\n      try {\n        await generate(\n          {\n            verbose: true,\n            schema: './tests/test-files/schema-dir/schema.ts',\n            documents: './tests/test-files/error-document.graphql',\n            generates: {\n              'src/test.ts': {\n                plugins: ['typescript'],\n              },\n            },\n          },\n          false\n        );\n      } catch {\n        const cwd = process.cwd(); // cwd is different for every machine, remember to replace local path with this after updating snapshot\n        expect(outputErrorSpy.mock.calls[0][0]).toMatchInlineSnapshot(`\n          \"[FAILED] Failed to load documents from ./tests/test-files/error-document.graphql:\n          [FAILED] Syntax Error: Expected \"{\", found <EOF>.\n\n          [FAILED] ${cwd}/tests/test-files/error-document.graphql:2:1\n          [FAILED] 1 | query\n          [FAILED] 2 |\n          [FAILED]   | ^\n          \"\n        `);\n      }\n    });\n\n    test('No documents found - should throw error by default', async () => {\n      expect.assertions(1);\n      outputErrorSpy.mockImplementation(() => true);\n      try {\n        await generate(\n          {\n            verbose: true,\n            schema: './tests/test-files/schema-dir/schema.ts',\n            documents: './tests/test-files/document-file-does-not-exist.graphql',\n            generates: {\n              'src/test.ts': {\n                plugins: ['typescript'],\n              },\n            },\n          },\n          false\n        );\n      } catch {\n        expect(outputErrorSpy.mock.calls[0][0]).toMatchInlineSnapshot(`\n          \"\n          [FAILED]       Unable to find any GraphQL type definitions for the following pointers:\n          [FAILED]         - ./tests/test-files/document-file-does-not-exist.graphql\n          \"\n        `);\n      }\n    });\n\n    test('No documents found - should not fail if ignoreNoDocuments=true', async () => {\n      outputErrorSpy.mockImplementation(() => true);\n      await generate(\n        {\n          verbose: true,\n          ignoreNoDocuments: true,\n          schema: './tests/test-files/schema-dir/schema.ts',\n          documents: './tests/test-files/document-file-does-not-exist.graphql',\n          generates: {\n            'src/test.ts': {\n              plugins: ['typescript'],\n            },\n          },\n        },\n        false\n      );\n      expect(outputErrorSpy).not.toHaveBeenCalled();\n    });\n\n    test('No documents found - GraphQL Config - should throw error by default', async () => {\n      outputErrorSpy.mockImplementation(() => true);\n      expect.assertions(1);\n      try {\n        const config = await createContext({\n          config: './tests/test-files/graphql.config.no-doc.js',\n          project: undefined,\n          errorsOnly: true,\n          overwrite: true,\n          profile: true,\n          require: [],\n          silent: false,\n          watch: false,\n        });\n\n        await generate(config, false);\n      } catch {\n        expect(outputErrorSpy.mock.calls[0][0]).toMatchInlineSnapshot(`\n          \"\n          [FAILED]       Unable to find any GraphQL type definitions for the following pointers:\n          [FAILED]         - ../test-documents/empty.graphql\n          \"\n        `);\n      }\n    });\n\n    test('No documents found - GraphQL Config - should not fail if ignoreNoDocuments=true', async () => {\n      outputErrorSpy.mockImplementation(() => true);\n      vi.spyOn(fs, 'writeFile').mockImplementation(() => Promise.resolve());\n      const config = await createContext({\n        config: './tests/test-files/graphql.config.no-doc-ignored.js',\n        project: undefined,\n        errorsOnly: true,\n        overwrite: true,\n        profile: true,\n        require: [],\n        silent: false,\n        watch: false,\n      });\n\n      await generate(config, false);\n\n      expect(outputErrorSpy).not.toHaveBeenCalled();\n    });\n  });\n\n  describe('config.allowPartialOutputs', () => {\n    const mockLogger: any = {\n      warn: vi.fn(),\n      error: vi.fn(),\n    };\n\n    beforeEach(() => {\n      setLogger(mockLogger);\n      vi.resetAllMocks();\n    });\n\n    test('when allowPartialOutputs=true - writes partial success and does not throw', async () => {\n      const invalidSchema = /* GraphQL */ `\n        type A {\n          id: WRONG_TYPE!\n        }\n      `;\n      const validSchema = /* GraphQL */ `\n        type B {\n          id: ID!\n        }\n      `;\n      const output = await generate(\n        {\n          allowPartialOutputs: true,\n          generates: {\n            'src/a.ts': {\n              schema: invalidSchema,\n              plugins: ['typescript'],\n            },\n            'src/b.ts': {\n              schema: validSchema,\n              plugins: ['typescript'],\n            },\n          },\n        },\n        false\n      );\n\n      expect(output.length).toBe(1);\n      expect(output[0].filename).toBe('src/b.ts');\n      expect(mockLogger.warn.mock.calls[0][0]).toBeSimilarStringTo(\n        `${logSymbols.warning} One or more errors occurred, some files were generated. To prevent any output on errors, set config.allowPartialOutputs=false`\n      );\n    });\n\n    test('when allowPartialOutputs=true - complete failure throws', async () => {\n      expect.assertions(2);\n\n      try {\n        const invalidSchema = /* GraphQL */ `\n          type A {\n            id: WRONG_TYPE!\n          }\n        `;\n        await generate(\n          {\n            allowPartialOutputs: true,\n            generates: {\n              'src/a.ts': {\n                schema: invalidSchema,\n                plugins: ['typescript'],\n              },\n              'src/b.ts': {\n                schema: invalidSchema,\n                plugins: ['typescript'],\n              },\n            },\n          },\n          false\n        );\n      } catch {\n        expect(mockLogger.warn).not.toHaveBeenCalled();\n        expect(mockLogger.error).not.toHaveBeenCalled();\n      }\n    });\n\n    test('when allowPartialOutputs=false - does not write partial success and throws', async () => {\n      expect.assertions(1);\n\n      const invalidSchema = /* GraphQL */ `\n        type A {\n          id: WRONG_TYPE!\n        }\n      `;\n      const validSchema = /* GraphQL */ `\n        type B {\n          id: ID!\n        }\n      `;\n\n      try {\n        await generate(\n          {\n            allowPartialOutputs: false,\n            generates: {\n              'src/a.ts': {\n                schema: invalidSchema,\n                plugins: ['typescript'],\n              },\n              'src/b.ts': {\n                schema: validSchema,\n                plugins: ['typescript'],\n              },\n            },\n          },\n          false\n        );\n      } catch {\n        expect(mockLogger.error.mock.calls[0][0]).toBeSimilarStringTo(\n          `${logSymbols.error} One or more errors occurred, no files were generated. To allow output on errors, set config.allowPartialOutputs=true`\n        );\n      }\n    });\n\n    test('when allowPartialOutputs=false - complete failure throws', async () => {\n      expect.assertions(2);\n\n      try {\n        const invalidSchema = /* GraphQL */ `\n          type A {\n            id: WRONG_TYPE!\n          }\n        `;\n        await generate(\n          {\n            allowPartialOutputs: false,\n            generates: {\n              'src/a.ts': {\n                schema: invalidSchema,\n                plugins: ['typescript'],\n              },\n              'src/b.ts': {\n                schema: invalidSchema,\n                plugins: ['typescript'],\n              },\n            },\n          },\n          false\n        );\n      } catch {\n        expect(mockLogger.warn).not.toHaveBeenCalled();\n        expect(mockLogger.error).not.toHaveBeenCalled();\n      }\n    });\n  });\n});\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/init.spec.ts",
    "content": "import { resolve } from 'path';\nimport bddStdin from 'bdd-stdin';\nimport { fs, vol } from 'memfs';\nimport { bold } from '../src/init/helpers.js';\nimport { init } from '../src/init/index.js';\nimport { getApplicationTypeChoices, getPluginChoices } from '../src/init/questions.js';\nimport { guessTargets } from '../src/init/targets.js';\nimport { Tags } from '../src/init/types.js';\n\nvi.mock('../src/utils/get-latest-version.ts', () => {\n  return { getLatestVersion: () => Promise.resolve('1.0.0') };\n});\n\nvi.mock('fs', () => require('./__mocks__/fs.cjs'));\nconst { version } = require('../package.json');\n\nconst SELECT = ' '; // checkbox\nconst ENTER = '\\n';\n// const DOWN = bddStdin.keys.down;\n\nconst packageJson = {\n  withAngular: JSON.stringify({\n    version,\n    dependencies: {\n      '@angular/core': 'x.x.x',\n    },\n  }),\n  withTypescript: JSON.stringify({\n    version,\n    devDependencies: {\n      typescript: 'x.x.x',\n    },\n  }),\n  withReact: JSON.stringify({\n    version,\n    dependencies: {\n      react: 'x.x.x',\n    },\n  }),\n  withFlow: JSON.stringify({\n    version,\n    devDependencies: {\n      flow: 'x.x.x',\n    },\n  }),\n  withStencil: JSON.stringify({\n    version,\n    dependencies: {\n      '@stencil/core': 'x.x.x',\n    },\n  }),\n  withVue: JSON.stringify({\n    version,\n    dependencies: {\n      vue: 'x.x.x',\n    },\n  }),\n  withReactQuery: JSON.stringify({\n    version,\n    dependencies: {\n      '@tanstack/react-query': 'x.x.x',\n    },\n  }),\n  withSWR: JSON.stringify({\n    version,\n    dependencies: {\n      swr: 'x.x.x',\n    },\n  }),\n  withGraphqlRequest: JSON.stringify({\n    version,\n    dependencies: {\n      'graphql-request': 'x.x.x',\n    },\n  }),\n};\n\ndescribe('init', () => {\n  beforeEach(() => {\n    // make sure terminal don't get noisy\n    vi.spyOn(process.stdout, 'write').mockImplementation(() => true);\n    vol.reset();\n  });\n\n  afterEach(() => {\n    vi.clearAllMocks();\n  });\n\n  describe('guessTargets()', () => {\n    it('should guess angular projects', async () => {\n      vol.fromJSON({ ['package.json']: packageJson.withAngular }, process.cwd());\n      const targets = await guessTargets();\n      expect(targets.Angular).toEqual(true);\n    });\n\n    it('should guess typescript projects', async () => {\n      vol.fromJSON({ ['package.json']: packageJson.withTypescript }, process.cwd());\n      const targets = await guessTargets();\n      expect(targets.TypeScript).toEqual(true);\n    });\n\n    it('should guess react projects', async () => {\n      vol.fromJSON({ ['package.json']: packageJson.withReact }, process.cwd());\n      const targets = await guessTargets();\n      expect(targets.React).toEqual(true);\n    });\n\n    it('should guess stencil projects', async () => {\n      vol.fromJSON({ ['package.json']: packageJson.withStencil }, process.cwd());\n      const targets = await guessTargets();\n      expect(targets.Stencil).toEqual(true);\n    });\n\n    it('should guess flow projects', async () => {\n      vol.fromJSON({ ['package.json']: packageJson.withFlow }, process.cwd());\n      const targets = await guessTargets();\n      expect(targets.Flow).toEqual(true);\n    });\n\n    it('should guess vue projects', async () => {\n      vol.fromJSON({ ['package.json']: packageJson.withVue }, process.cwd());\n      const targets = await guessTargets();\n      expect(targets.Vue).toEqual(true);\n    });\n\n    it('should guess graphql-request projects', async () => {\n      vol.fromJSON({ ['package.json']: packageJson.withGraphqlRequest }, process.cwd());\n      const targets = await guessTargets();\n      expect(targets.graphqlRequest).toEqual(true);\n    });\n  });\n\n  describe('plugins suggestions for client-side setup', () => {\n    it('should use angular related plugins when @angular/core is found', async () => {\n      vol.fromJSON({ ['package.json']: packageJson.withAngular }, process.cwd());\n      const writeFileSpy = vi.spyOn(fs, 'writeFileSync');\n      // silent\n      vi.spyOn(console, 'log').mockImplementation(() => {});\n\n      useInputs({\n        onTarget: [ENTER], // confirm target\n        onSchema: [ENTER], // use default\n        onDocuments: [ENTER],\n        onPlugins: [ENTER], // use selected packages\n        onOutput: [ENTER], // use default output path\n        onIntrospection: ['n', ENTER], // no introspection,\n        onConfig: [ENTER], // use default config path\n        onScript: ['graphql', ENTER], // use custom npm script\n      });\n\n      await init();\n\n      expect(writeFileSpy).toHaveBeenCalledTimes(2);\n\n      const pkg = JSON.parse(writeFileSpy.mock.calls[1][1] as string);\n      const config = writeFileSpy.mock.calls[0][1] as string;\n\n      expect(config).toMatchSnapshot();\n\n      // expected plugins\n      expect(pkg.devDependencies).toEqual({\n        '@graphql-codegen/cli': '1.0.0',\n        '@graphql-codegen/typescript-apollo-angular': '1.0.0',\n      });\n    });\n\n    it('should use react related plugins when react is found', async () => {\n      vol.fromJSON({ ['package.json']: packageJson.withReact }, process.cwd());\n      const writeFileSpy = vi.spyOn(fs, 'writeFileSync');\n      // silent\n      vi.spyOn(console, 'log').mockImplementation(() => {});\n\n      useInputs({\n        onTarget: [ENTER], // confirm react target\n        onSchema: [ENTER], // use default\n        onDocuments: [ENTER],\n        onOutput: [ENTER], // use default output path\n        onIntrospection: ['n', ENTER], // no introspection,\n        onConfig: [ENTER], // use default config path\n        onScript: ['graphql', ENTER], // use custom npm script\n      });\n\n      await init();\n\n      expect(writeFileSpy).toHaveBeenCalledTimes(2);\n\n      const pkg = JSON.parse(writeFileSpy.mock.calls[1][1] as string);\n      const config = writeFileSpy.mock.calls[0][1] as string;\n\n      expect(config).toMatchSnapshot();\n\n      // expected plugins\n      expect(pkg.devDependencies).toHaveProperty('@graphql-codegen/cli');\n      expect(pkg.devDependencies).toHaveProperty('@graphql-codegen/client-preset');\n      // should not have other plugins\n      expect(Object.keys(pkg.devDependencies)).toHaveLength(2);\n    });\n\n    it('should use stencil related plugins when @stencil/core is found', async () => {\n      vol.fromJSON({ ['package.json']: packageJson.withStencil }, process.cwd());\n      const writeFileSpy = vi.spyOn(fs, 'writeFileSync');\n      // silent\n      vi.spyOn(console, 'log').mockImplementation(() => {});\n\n      useInputs({\n        onTarget: [ENTER], // confirm stencil target\n        onSchema: [ENTER], // use default\n        onDocuments: [ENTER],\n        onPlugins: [ENTER], // use selected packages\n        onOutput: [ENTER], // use default output path\n        onIntrospection: ['n', ENTER], // no introspection,\n        onConfig: [ENTER], // use default config path\n        onScript: ['graphql', ENTER], // use custom npm script\n      });\n\n      await init();\n\n      expect(writeFileSpy).toHaveBeenCalledTimes(2);\n\n      const pkg = JSON.parse(writeFileSpy.mock.calls[1][1] as string);\n      const config = writeFileSpy.mock.calls[0][1] as string;\n\n      expect(config).toMatchSnapshot();\n\n      // expected plugins\n      expect(pkg.devDependencies).toHaveProperty('@graphql-codegen/typescript');\n      expect(pkg.devDependencies).toHaveProperty('@graphql-codegen/typescript-operations');\n      expect(pkg.devDependencies).toHaveProperty('@graphql-codegen/typescript-stencil-apollo');\n      // should not have other plugins\n      expect(Object.keys(pkg.devDependencies)).toHaveLength(4);\n    });\n  });\n\n  describe('plugins suggestions non client-side setup', () => {\n    it('should use typescript related plugins when typescript is found (node)', async () => {\n      vol.fromJSON({ ['package.json']: packageJson.withTypescript }, process.cwd());\n      const writeFileSpy = vi.spyOn(fs, 'writeFileSync');\n      // silent\n      vi.spyOn(console, 'log').mockImplementation(() => {});\n\n      useInputs({\n        onTarget: [SELECT, ENTER], // confirm api target\n        onSchema: [ENTER], // use default\n        onPlugins: [ENTER], // use selected packages\n        onOutput: [ENTER], // use default output path\n        onIntrospection: ['n', ENTER], // no introspection,\n        onConfig: [ENTER], // use default config path\n        onScript: ['graphql', ENTER], // use custom npm script\n      });\n\n      await init();\n\n      expect(writeFileSpy).toHaveBeenCalledTimes(2);\n\n      const pkg = JSON.parse(writeFileSpy.mock.calls[1][1] as string);\n      const config = writeFileSpy.mock.calls[0][1] as string;\n\n      expect(config).toMatchSnapshot();\n\n      // expected plugins\n      expect(pkg.devDependencies).toHaveProperty('@graphql-codegen/typescript');\n      expect(pkg.devDependencies).toHaveProperty('@graphql-codegen/typescript-resolvers');\n      // should not have other plugins\n      expect(Object.keys(pkg.devDependencies)).toHaveLength(4); // 3 - because we have typescript package in devDeps\n    });\n  });\n\n  it('should have few default values for Angular', async () => {\n    vol.fromJSON({ ['package.json']: packageJson.withReact }, process.cwd());\n    const writeFileSpy = vi.spyOn(fs, 'writeFileSync');\n    const logSpy = vi.spyOn(console, 'log').mockImplementation(() => {});\n    const defaults = {\n      config: 'codegen.ts',\n    };\n\n    useInputs({\n      onTarget: [ENTER], // confirm angular target\n      onSchema: [ENTER], // use default\n      onDocuments: [ENTER],\n      onOutput: [ENTER], // use default output path\n      onIntrospection: [ENTER], // no introspection,\n      onConfig: [ENTER], // use default config path\n      onScript: ['graphql', ENTER], // use custom npm script\n    });\n\n    await init();\n\n    const configFile = writeFileSpy.mock.calls[0][0] as string;\n    const config = writeFileSpy.mock.calls[0][1] as string;\n    const pkg = JSON.parse(writeFileSpy.mock.calls[1][1] as string);\n\n    expect(pkg.scripts.graphql).toEqual(`graphql-codegen --config codegen.ts`);\n    expect(configFile).toEqual(resolve(process.cwd(), defaults.config));\n    expect(config).toMatchSnapshot();\n    expect(logSpy.mock.calls[2][0]).toContain(`Config file generated at ${bold(defaults.config)}`);\n  });\n\n  it('should have few default values for React', async () => {\n    vol.fromJSON({ ['package.json']: packageJson.withReact }, process.cwd());\n    const writeFileSpy = vi.spyOn(fs, 'writeFileSync');\n    const logSpy = vi.spyOn(console, 'log').mockImplementation(() => {});\n    const options = {\n      script: 'graphql',\n      schema: './schema.ts',\n      documents: 'graphql/**/*.graphql',\n      output: 'graphql/index.ts',\n      config: 'app-codegen.yml',\n    };\n\n    useInputs({\n      onTarget: [ENTER], // confirm target\n      onSchema: [options.schema, ENTER], // use default\n      onDocuments: [options.documents, ENTER],\n      onOutput: [options.output, ENTER], // use default output path\n      onIntrospection: ['y', ENTER], // with introspection,\n      onConfig: [options.config, ENTER], // use default config path\n      onScript: [options.script, ENTER], // use custom npm script\n    });\n\n    await init();\n\n    const configFile = writeFileSpy.mock.calls[0][0] as string;\n    const config = writeFileSpy.mock.calls[0][1] as string;\n    const pkg = JSON.parse(writeFileSpy.mock.calls[1][1] as string);\n\n    expect(pkg.scripts[options.script]).toEqual(`graphql-codegen --config ${options.config}`);\n    expect(configFile).toEqual(resolve(process.cwd(), options.config));\n    expect(config).toMatchSnapshot();\n    expect(logSpy.mock.calls[2][0]).toContain(`Config file generated at ${bold(options.config)}`);\n  });\n\n  it('custom setup', async () => {\n    vol.fromJSON({ ['package.json']: packageJson.withReact }, process.cwd());\n\n    const { init } = await import('../src/init/index.js');\n    const writeFileSpy = vi.spyOn(fs, 'writeFileSync');\n    const logSpy = vi.spyOn(console, 'log').mockImplementation(() => {});\n    const documents = 'graphql/*.ts';\n    const script = 'generate:types';\n\n    useInputs({\n      onTarget: [ENTER], // confirm target\n      onSchema: [ENTER], // use default\n      onDocuments: [documents, ENTER],\n      onOutput: [ENTER], // use default output path\n      onIntrospection: ['y', ENTER], // no introspection,\n      onConfig: [ENTER], // use default config path\n      onScript: [script, ENTER], // use custom npm script\n    });\n\n    await init();\n\n    expect(writeFileSpy).toHaveBeenCalledTimes(2);\n\n    const pkg = JSON.parse(writeFileSpy.mock.calls[1][1] as string);\n    const config = writeFileSpy.mock.calls[0][1] as string;\n\n    // config\n    expect(config).toMatchSnapshot();\n\n    // script name should match what we provided\n    expect(pkg.scripts[script]).toEqual('graphql-codegen --config codegen.ts');\n    // expected plugins\n    expect(pkg.devDependencies).toHaveProperty('@graphql-codegen/introspection');\n    // should not have these plugins\n    expect(pkg.devDependencies).not.toHaveProperty('@graphql-codegen/typescript-resolvers');\n\n    // logs\n    const welcomeMsg = logSpy.mock.calls[0][0];\n    const doneMsg = logSpy.mock.calls[2][0];\n\n    expect(welcomeMsg).toContain(`Welcome to ${bold('GraphQL Code Generator')}`);\n    expect(doneMsg).toContain(`Config file generated at ${bold('codegen.ts')}`);\n    expect(doneMsg).toContain(bold('$ npm install'));\n    expect(doneMsg).toContain(bold(`$ npm run ${script}`));\n  });\n\n  describe('plugin choices', () => {\n    function getAvailable(tags: Tags[]): string[] {\n      return getPluginChoices(tags).map((c: any) => c.value.value);\n    }\n\n    function getSelected(tags: Tags[]): string[] {\n      return getPluginChoices(tags)\n        .filter((c: any) => c.checked)\n        .map((c: any) => c.value.value);\n    }\n\n    function getPlugins(targets: Tags[]) {\n      const tags: Tags[] = getApplicationTypeChoices({\n        [Tags.angular]: targets.includes(Tags.angular),\n        [Tags.react]: targets.includes(Tags.react),\n        [Tags.stencil]: targets.includes(Tags.stencil),\n        [Tags.client]: targets.includes(Tags.client),\n        [Tags.node]: targets.includes(Tags.node),\n        [Tags.typescript]: targets.includes(Tags.typescript),\n        [Tags.flow]: targets.includes(Tags.flow),\n        [Tags.vue]: targets.includes(Tags.vue),\n        [Tags.graphqlRequest]: targets.includes(Tags.graphqlRequest),\n      })\n        .filter(c => c.checked)\n        .reduce((all, choice) => all.concat(choice.value), []);\n\n      return {\n        available: getAvailable(tags),\n        selected: getSelected(tags),\n      };\n    }\n\n    it('node', () => {\n      const { available, selected } = getPlugins([Tags.node]);\n\n      // available\n      expect(available).toHaveLength(6);\n      expect(available).toContainEqual('typescript');\n      expect(available).toContainEqual('typescript-resolvers');\n      expect(available).toContainEqual('typescript-mongodb');\n      expect(available).toContainEqual('typescript-document-nodes');\n      expect(available).toContainEqual('flow');\n      expect(available).toContainEqual('flow-resolvers');\n      // selected\n      expect(selected).toHaveLength(0);\n    });\n\n    it('node + typescript', () => {\n      const { selected, available } = getPlugins([Tags.node, Tags.typescript]);\n\n      // available\n      expect(available).toHaveLength(4);\n      expect(available).toContainEqual('typescript');\n      expect(available).toContainEqual('typescript-resolvers');\n      expect(available).toContainEqual('typescript-mongodb');\n      expect(available).toContainEqual('typescript-document-nodes');\n      // selected\n      expect(selected).toHaveLength(2);\n      expect(selected).toContainEqual('typescript');\n      expect(selected).toContainEqual('typescript-resolvers');\n    });\n\n    it('node + flow', () => {\n      const { selected, available } = getPlugins([Tags.node, Tags.flow]);\n\n      // available\n      expect(available).toHaveLength(2);\n      expect(available).toContainEqual('flow');\n      expect(available).toContainEqual('flow-resolvers');\n      // selected\n      expect(selected).toHaveLength(2);\n      expect(selected).toContainEqual('flow');\n      expect(selected).toContainEqual('flow-resolvers');\n    });\n\n    it('angular', () => {\n      const { selected, available } = getPlugins([Tags.angular]);\n\n      // available\n      expect(available).toHaveLength(2);\n      expect(available).toEqual(['fragment-matcher', 'typescript-apollo-angular']);\n      // selected\n      expect(selected).toHaveLength(1);\n      expect(selected).toEqual(['typescript-apollo-angular']);\n    });\n\n    it('react', () => {\n      const { selected, available } = getPlugins([Tags.react]);\n\n      // available\n      expect(available).toHaveLength(2);\n      expect(available).toContainEqual('fragment-matcher');\n      expect(available).toContainEqual('urql-introspection');\n      // selected\n      expect(selected).toHaveLength(0);\n    });\n\n    it('react + flow', () => {\n      const { selected, available } = getPlugins([Tags.react, Tags.flow]);\n\n      // available\n      expect(available).toHaveLength(4);\n      expect(available).toContainEqual('flow');\n      expect(available).toContainEqual('flow-operations');\n      expect(available).toContainEqual('fragment-matcher');\n      // selected\n      expect(selected).toHaveLength(2);\n      expect(selected).toContainEqual('flow');\n      expect(selected).toContainEqual('flow-operations');\n    });\n\n    it('stencil', () => {\n      const { selected, available } = getPlugins([Tags.stencil]);\n\n      // available\n      expect(available).toHaveLength(7);\n      expect(available).toContainEqual('typescript');\n      expect(available).toContainEqual('typescript-operations');\n      expect(available).toContainEqual('typescript-stencil-apollo');\n      expect(available).toContainEqual('typescript-graphql-files-modules');\n      expect(available).toContainEqual('typescript-document-nodes');\n      expect(available).toContainEqual('fragment-matcher');\n      // selected\n      expect(selected).toHaveLength(3);\n      expect(selected).toContainEqual('typescript');\n      expect(selected).toContainEqual('typescript-operations');\n      expect(selected).toContainEqual('typescript-stencil-apollo');\n    });\n  });\n});\n\nfunction useInputs(inputs: {\n  onTarget: string[];\n  onSchema: string[];\n  onDocuments?: string[];\n  onPlugins?: string[];\n  onOutput: string[];\n  onIntrospection: string[];\n  onConfig: string[];\n  onScript: string[];\n}) {\n  bddStdin(\n    [].concat(\n      inputs.onTarget,\n      inputs.onSchema,\n      inputs.onDocuments || [],\n      inputs.onPlugins || [],\n      inputs.onOutput,\n      inputs.onIntrospection,\n      inputs.onConfig,\n      inputs.onScript\n    )\n  );\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/additional-schema.graphql",
    "content": "type AdditionalType {\n  f: Int!\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/gatsby-and-custom-parsers.ts",
    "content": "import { parser } from 'custom-graphql-parser';\nimport { graphql } from 'gatsby';\nimport gql from 'graphql-tag';\n\nexport const fragmentA = gql`\n  fragment FragmentA on MyType {\n    fieldC\n  }\n`;\n\nexport const fragmentB = graphql`\n  fragment FragmentB on MyType {\n    fieldC\n  }\n`;\n\nexport const fragmentC = parser`\n  fragment FragmentC on MyType {\n    fieldC\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/invalid-directive.graphql",
    "content": "query myQuery {\n  fieldA\n  fieldB @client {\n    fieldC\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/invalid-fields.graphql",
    "content": "query myQuery {\n  fieldD\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/invalid-schema.graphql",
    "content": "INVALID_SCHEMA"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/js-my-fragment.js",
    "content": "import gql from 'graphql-tag';\n\nexport const myFragment = gql`\n  fragment MyFragment on MyType {\n    fieldC\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/js-query-with-my-fragment.js",
    "content": "import gql from 'graphql-tag';\nimport { myFragment } from './js-my-fragment';\n\nexport const query = gql`\n  query myQuery($a: String) {\n    fieldA(a: $a)\n    fieldB {\n      ...MyFragment\n    }\n  }\n  ${myFragment}\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/my-fragment.ts",
    "content": "import gql from 'graphql-tag';\n\nexport const myFragment = gql`\n  fragment MyFragment on MyType {\n    fieldC\n  }\n`;\n\nexport const myFragment2 = gql`\n  fragment MyFragment2 on DType {\n    field1\n  }\n`;\n\nexport const myFragment3 = gql`\n  fragment MyFragment3 on DType {\n    field2\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/query-with-commented-fragment.ts",
    "content": "import gql from 'graphql-tag';\n\nexport const myFragment = gql`\n  fragment MyFragment on MyType {\n    fieldC\n  }\n`;\n\n// export const myFragment = gql`\n//   fragment MyFragment on MyType {\n//     fieldC\n//   }\n// `;\n\nexport const query = gql`\n  query myQuery {\n    fieldB {\n      ...MyFragment\n    }\n  }\n  ${myFragment}\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/query-with-my-fragment.ts",
    "content": "import gql from 'graphql-tag';\nimport { myFragment, myFragment2, myFragment3 } from './my-fragment.js';\n\nexport const query = gql`\n  query myQuery($a: String) {\n    fieldA(a: $a)\n    fieldB {\n      ...MyFragment\n    }\n  }\n  ${myFragment}\n`;\n\nexport const query2 = gql`\n  query myQuery2 {\n    fieldC {\n      item {\n        ...MyFragment2\n        ...MyFragment3\n      }\n    }\n  }\n  ${myFragment2}\n  ${myFragment3}\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/schema.graphql",
    "content": "type Query {\n  fieldA(a: String): String\n  fieldB: MyType\n  fieldC: CType\n}\n\ntype MyType {\n  fieldC: Int\n}\n\ntype CType {\n  item: DType\n}\n\ntype DType {\n  field1: String\n  field2: Int\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/test-schema.graphql",
    "content": "type Query {\n  f(a: Filter): String\n  b: MyType\n}\n\ninput Filter {\n  id: String!\n}\n\ntype MyType {\n  t: MyEnum!\n}\n\nenum MyEnum {\n  A\n  B\n  C\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/ts-features-with-query.ts",
    "content": "import gql from 'graphql-tag';\n\nnamespace Foo {\n  export const foo = 12;\n\n  export const query = gql`\n    query myQueryInNamespace {\n      fieldA\n    }\n  `;\n}\n\ninterface ModuleWithProviders {\n  ngModule: string;\n}\n\nexport class FooModule {\n  static forRoot() {\n    return {\n      ngModule: 'foo',\n      value: Foo.foo,\n    } as ModuleWithProviders;\n  }\n}\n\nexport const query = gql`\n  query myQuery {\n    fieldA\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/unused-variable.graphql",
    "content": "query myQuery($v: String!) {\n  fieldA\n  fieldB {\n    fieldC\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-documents/valid.graphql",
    "content": "query myQuery {\n  fieldA\n  fieldB {\n    fieldC\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/1.ts",
    "content": "import gql from 'graphql-tag';\n\nexport const myQuery = gql`\n  query myQuery {\n    data {\n      field1\n      field2\n    }\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/10.tsx",
    "content": "import { buildQuery } from 'graph/buildQuery';\nimport { GPlayerList } from 'graph/types';\nimport graphql from 'graphql-tag';\n\nexport const playerListQuery = buildQuery<GPlayerList.Query, GPlayerList.Variables>(graphql`\n  query GPlayerList {\n    allPlayers {\n      id\n      tier\n      name\n    }\n  }\n`);\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/11.ts",
    "content": "import graphql from 'graphql-tag';\n\nexport const articleDetailQuery = graphql`\n  query ArticleDetail {\n    Article(id: \"thisisnotarealID\") {\n      title\n    }\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/12.tsx",
    "content": "import * as React from 'react';\nimport gql from 'graphql-tag';\n\nexport default class extends React.Component<{}, {}> {\n  public render() {\n    return <div />;\n  }\n}\n\nexport const pageQuery = gql`\n  query IndexQuery {\n    site {\n      siteMetadata {\n        title\n      }\n    }\n  }\n`;\n\n// export const pageQuery = gql`\n//   query IndexQuery {\n//     site {\n//       siteMetadata {\n//         title\n//       }\n//     }\n//   }\n// `;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/13.tsx",
    "content": "import * as React from 'react';\nimport graphql from 'graphql-tag';\n\nexport default class extends React.Component<{}, {}> {\n  public render() {\n    return <div />;\n  }\n}\n\nexport const pageQuery = graphql`\n  query IndexQuery {\n    site {\n      siteMetadata {\n        title\n      }\n    }\n  }\n`;\n\n// export const pageQuery = graphql`\n//   query IndexQuery {\n//     site {\n//       siteMetadata {\n//         title\n//       }\n//     }\n//   }\n// `;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/14.js",
    "content": "import gql from 'graphql-tag';\n\nexport const booksQuery = gql`\n  {\n    books {\n      isbn\n      title\n      description\n      rating\n      thumbnails {\n        url\n      }\n    }\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/15.js",
    "content": "import graphql from 'graphql-tag';\n\nexport const booksQuery = graphql`\n  {\n    books {\n      isbn\n      title\n      description\n      rating\n      thumbnails {\n        url\n      }\n    }\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/16.ts",
    "content": "const other = 'asd';\nexport const endpoint = `${other}/graphql`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/2.ts",
    "content": "import gql from 'graphql-tag';\n\nexport const myQuery = gql(`\n  query myQuery {\n    data {\n      field1\n      field2\n    }\n  }\n  `);\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/3.graphql",
    "content": "query myQuery {\n  data {\n    field1\n    field2\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/4.ts",
    "content": "import gql from 'graphql-tag';\n\n// export const myQuery = gql(`\n//   query myQuery1 {\n//     data {\n//       field1\n//       field2\n//     }\n//   }\n//   `);\n\nexport const myQuery = gql(`\n  query myQuery2 {\n    data {\n      field1\n      field2\n    }\n  }\n  `);\n\n/*\nexport const myQuery = gql(`\n  query myQuery3 {\n    data {\n      field1\n      field2\n    }\n  }\n  `);\n*/\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/5.tsx",
    "content": "import { buildQuery } from 'graph/buildQuery';\nimport { GPlayerList } from 'graph/types';\nimport gql from 'graphql-tag';\n\nexport const playerListQuery = buildQuery<GPlayerList.Query, GPlayerList.Variables>(gql`\n  query GPlayerList {\n    allPlayers {\n      id\n      tier\n      name\n    }\n  }\n`);\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/6.ts",
    "content": "import gql from 'graphql-tag';\n\nexport const articleDetailQuery = gql`\n  query ArticleDetail {\n    Article(id: \"thisisnotarealID\") {\n      title\n    }\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/7.ts",
    "content": "import graphql from 'graphql-tag';\n\nexport const myQuery = graphql`\n  query myQuery {\n    data {\n      field1\n      field2\n    }\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/8.ts",
    "content": "import graphql from 'graphql-tag';\n\nexport const myQuery = graphql(`\n  query myQuery {\n    data {\n      field1\n      field2\n    }\n  }\n`);\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/9.ts",
    "content": "import graphql from 'graphql-tag';\n\n// export const myQuery = graphql(`\n//   query myQuery1 {\n//     data {\n//       field1\n//       field2\n//     }\n//   }\n//   `);\n\nexport const myQuery = graphql(`\n  query myQuery2 {\n    data {\n      field1\n      field2\n    }\n  }\n`);\n\n/*\nexport const myQuery = graphql(`\n  query myQuery3 {\n    data {\n      field1\n      field2\n    }\n  }\n  `);\n*/\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/ByteOrderMask.json",
    "content": "{\n  \"data\": {\n    \"__schema\": {\n      \"queryType\": {\n        \"name\": \"Query\"\n      },\n      \"mutationType\": {\n        \"name\": \"Mutation\"\n      },\n      \"subscriptionType\": {\n        \"name\": \"Subscription\"\n      },\n      \"types\": [\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Query\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"getUser\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"SCALAR\",\n                      \"name\": \"ID\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"User\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"lastUser\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"User\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"listUsers\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"first\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Int\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"after\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"UserConnection\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"getProduct\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"SCALAR\",\n                      \"name\": \"ID\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Product\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"listProducts\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"first\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Int\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"after\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"ProductConnection\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"getRecycleEvent\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"SCALAR\",\n                      \"name\": \"ID\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"RecycleEvent\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"listRecycleEvents\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"first\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Int\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"after\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"RecycleEventConnection\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"User\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"ID\",\n          \"description\": \"Built-in ID\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"String\",\n          \"description\": \"Built-in String\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"UserConnection\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"items\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"User\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"nextToken\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"Int\",\n          \"description\": \"Built-in Int\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Product\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"title\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"image\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"ProductConnection\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"items\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"Product\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"nextToken\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"RecycleEvent\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"userid\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"User\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"product\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"Product\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"RecycleEventConnection\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"items\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"RecycleEvent\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"nextToken\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Mutation\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"createUser\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"input\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"CreateUserInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"User\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"updateUser\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"input\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"UpdateUserInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"User\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"deleteUser\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"input\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"DeleteUserInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"User\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"createProduct\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"input\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"CreateProductInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Product\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"updateProduct\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"input\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"UpdateProductInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Product\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"deleteProduct\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"input\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"DeleteProductInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Product\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"createRecycleEvent\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"input\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"CreateRecycleEventInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"RecycleEvent\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"updateRecycleEvent\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"input\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"UpdateRecycleEventInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"RecycleEvent\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"deleteRecycleEvent\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"input\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"INPUT_OBJECT\",\n                      \"name\": \"DeleteRecycleEventInput\",\n                      \"ofType\": null\n                    }\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"RecycleEvent\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"CreateUserInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"UpdateUserInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"DeleteUserInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"CreateProductInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"title\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"image\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"UpdateProductInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"title\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            },\n            {\n              \"name\": \"image\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"DeleteProductInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"CreateRecycleEventInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"UpdateRecycleEventInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"INPUT_OBJECT\",\n          \"name\": \"DeleteRecycleEventInput\",\n          \"description\": null,\n          \"fields\": null,\n          \"inputFields\": [\n            {\n              \"name\": \"id\",\n              \"description\": null,\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"ID\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"Subscription\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"onCreateUser\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"ID\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"name\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"User\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onUpdateUser\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"ID\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"name\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"User\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onDeleteUser\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"ID\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"name\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"User\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onCreateProduct\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"ID\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"title\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"image\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Product\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onUpdateProduct\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"ID\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"title\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"image\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Product\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onDeleteProduct\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"ID\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"title\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                },\n                {\n                  \"name\": \"image\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"String\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"Product\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onCreateRecycleEvent\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"ID\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"RecycleEvent\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onUpdateRecycleEvent\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"ID\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"RecycleEvent\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onDeleteRecycleEvent\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"id\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"ID\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": null\n                }\n              ],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"RecycleEvent\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Schema\",\n          \"description\": \"A GraphQL Introspection defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, the entry points for query, mutation, and subscription operations.\",\n          \"fields\": [\n            {\n              \"name\": \"types\",\n              \"description\": \"A list of all types supported by this server.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__Type\"\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"queryType\",\n              \"description\": \"The type that query operations will be rooted at.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"mutationType\",\n              \"description\": \"If this server supports mutation, the type that mutation operations will be rooted at.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"directives\",\n              \"description\": \"'A list of all directives supported by this server.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__Directive\"\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"subscriptionType\",\n              \"description\": \"'If this server support subscription, the type that subscription operations will be rooted at.\",\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Type\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"kind\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"ENUM\",\n                  \"name\": \"__TypeKind\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"fields\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"includeDeprecated\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Boolean\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": \"false\"\n                }\n              ],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Field\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"interfaces\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Type\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"possibleTypes\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__Type\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"enumValues\",\n              \"description\": null,\n              \"args\": [\n                {\n                  \"name\": \"includeDeprecated\",\n                  \"description\": null,\n                  \"type\": {\n                    \"kind\": \"SCALAR\",\n                    \"name\": \"Boolean\",\n                    \"ofType\": null\n                  },\n                  \"defaultValue\": \"false\"\n                }\n              ],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__EnumValue\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"inputFields\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"OBJECT\",\n                    \"name\": \"__InputValue\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ofType\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"OBJECT\",\n                \"name\": \"__Type\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"ENUM\",\n          \"name\": \"__TypeKind\",\n          \"description\": \"An enum describing what kind of type a given __Type is\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": [\n            {\n              \"name\": \"SCALAR\",\n              \"description\": \"Indicates this type is a scalar.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"OBJECT\",\n              \"description\": \"Indicates this type is an object. `fields` and `interfaces` are valid fields.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INTERFACE\",\n              \"description\": \"Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"UNION\",\n              \"description\": \"Indicates this type is a union. `possibleTypes` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ENUM\",\n              \"description\": \"Indicates this type is an enum. `enumValues` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INPUT_OBJECT\",\n              \"description\": \"Indicates this type is an input object. `inputFields` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"LIST\",\n              \"description\": \"Indicates this type is a list. `ofType` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"NON_NULL\",\n              \"description\": \"Indicates this type is a non-null. `ofType` is a valid field.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Field\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"args\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__InputValue\"\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"type\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"isDeprecated\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"deprecationReason\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__InputValue\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"type\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"OBJECT\",\n                  \"name\": \"__Type\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"defaultValue\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"SCALAR\",\n          \"name\": \"Boolean\",\n          \"description\": \"Built-in Boolean\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__EnumValue\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"isDeprecated\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"deprecationReason\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"OBJECT\",\n          \"name\": \"__Directive\",\n          \"description\": null,\n          \"fields\": [\n            {\n              \"name\": \"name\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"description\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"String\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"locations\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"NON_NULL\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"ENUM\",\n                    \"name\": \"__DirectiveLocation\",\n                    \"ofType\": null\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"args\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"LIST\",\n                  \"name\": null,\n                  \"ofType\": {\n                    \"kind\": \"NON_NULL\",\n                    \"name\": null,\n                    \"ofType\": {\n                      \"kind\": \"OBJECT\",\n                      \"name\": \"__InputValue\"\n                    }\n                  }\n                }\n              },\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"onOperation\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": true,\n              \"deprecationReason\": \"Use `locations`.\"\n            },\n            {\n              \"name\": \"onFragment\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": true,\n              \"deprecationReason\": \"Use `locations`.\"\n            },\n            {\n              \"name\": \"onField\",\n              \"description\": null,\n              \"args\": [],\n              \"type\": {\n                \"kind\": \"SCALAR\",\n                \"name\": \"Boolean\",\n                \"ofType\": null\n              },\n              \"isDeprecated\": true,\n              \"deprecationReason\": \"Use `locations`.\"\n            }\n          ],\n          \"inputFields\": null,\n          \"interfaces\": [],\n          \"enumValues\": null,\n          \"possibleTypes\": null\n        },\n        {\n          \"kind\": \"ENUM\",\n          \"name\": \"__DirectiveLocation\",\n          \"description\": \"An enum describing valid locations where a directive can be placed\",\n          \"fields\": null,\n          \"inputFields\": null,\n          \"interfaces\": null,\n          \"enumValues\": [\n            {\n              \"name\": \"QUERY\",\n              \"description\": \"Indicates the directive is valid on queries.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"MUTATION\",\n              \"description\": \"Indicates the directive is valid on mutations.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FIELD\",\n              \"description\": \"Indicates the directive is valid on fields.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FRAGMENT_DEFINITION\",\n              \"description\": \"Indicates the directive is valid on fragment definitions.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FRAGMENT_SPREAD\",\n              \"description\": \"Indicates the directive is valid on fragment spreads.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INLINE_FRAGMENT\",\n              \"description\": \"Indicates the directive is valid on inline fragments.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"SCHEMA\",\n              \"description\": \"Indicates the directive is valid on a schema IDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"SCALAR\",\n              \"description\": \"Indicates the directive is valid on a scalar IDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"OBJECT\",\n              \"description\": \"Indicates the directive is valid on an object IDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"FIELD_DEFINITION\",\n              \"description\": \"Indicates the directive is valid on a field IDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ARGUMENT_DEFINITION\",\n              \"description\": \"Indicates the directive is valid on a field argument IDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INTERFACE\",\n              \"description\": \"Indicates the directive is valid on an interface IDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"UNION\",\n              \"description\": \"Indicates the directive is valid on an union IDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"ENUM\",\n              \"description\": \"Indicates the directive is valid on an enum IDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INPUT_OBJECT\",\n              \"description\": \"Indicates the directive is valid on an input object IDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            },\n            {\n              \"name\": \"INPUT_FIELD_DEFINITION\",\n              \"description\": \"Indicates the directive is valid on an input object field IDL definition.\",\n              \"isDeprecated\": false,\n              \"deprecationReason\": null\n            }\n          ],\n          \"possibleTypes\": null\n        }\n      ],\n      \"directives\": [\n        {\n          \"name\": \"include\",\n          \"description\": \"Directs the executor to include this field or fragment only when the `if` argument is true\",\n          \"args\": [\n            {\n              \"name\": \"if\",\n              \"description\": \"Included when true.\",\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"onOperation\": false,\n          \"onFragment\": true,\n          \"onField\": true\n        },\n        {\n          \"name\": \"skip\",\n          \"description\": \"Directs the executor to skip this field or fragment when the `if`'argument is true.\",\n          \"args\": [\n            {\n              \"name\": \"if\",\n              \"description\": \"Skipped when true.\",\n              \"type\": {\n                \"kind\": \"NON_NULL\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"Boolean\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"onOperation\": false,\n          \"onFragment\": true,\n          \"onField\": true\n        },\n        {\n          \"name\": \"aws_auth\",\n          \"description\": \"Directs the schema to enforce authorization on a field\",\n          \"args\": [\n            {\n              \"name\": \"cognito_groups\",\n              \"description\": \"List of cognito user pool groups which have access on this field\",\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"onOperation\": false,\n          \"onFragment\": false,\n          \"onField\": false\n        },\n        {\n          \"name\": \"aws_publish\",\n          \"description\": \"Tells the service which subscriptions will be published to when this mutation is called.\",\n          \"args\": [\n            {\n              \"name\": \"subscriptions\",\n              \"description\": \"List of subscriptions which will be published to when this mutation is called.\",\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"onOperation\": false,\n          \"onFragment\": false,\n          \"onField\": false\n        },\n        {\n          \"name\": \"aws_subscribe\",\n          \"description\": \"Tells the service which mutation triggers this subscription.\",\n          \"args\": [\n            {\n              \"name\": \"mutations\",\n              \"description\": \"List of mutations which will trigger this subscription when they are called.\",\n              \"type\": {\n                \"kind\": \"LIST\",\n                \"name\": null,\n                \"ofType\": {\n                  \"kind\": \"SCALAR\",\n                  \"name\": \"String\",\n                  \"ofType\": null\n                }\n              },\n              \"defaultValue\": null\n            }\n          ],\n          \"onOperation\": false,\n          \"onFragment\": false,\n          \"onField\": false\n        }\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/error-document.graphql",
    "content": "query\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/graphql.config.js",
    "content": "/** @type {import('graphql-config').IGraphQLConfig } */\nmodule.exports = {\n  generates: {},\n  projects: {\n    prj1: {\n      schema: ['**/test-documents/schema.graphql'],\n      documents: ['**/test-documents/valid.graphql'],\n      extensions: {\n        codegen: {\n          generates: {\n            'graphqlTypes.ts': {\n              schema: ['**/test-documents/schema.graphql'],\n              documents: ['**/test-documents/valid.graphql'],\n              plugins: ['typed-document-node'],\n            },\n          },\n        },\n      },\n    },\n  },\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/graphql.config.no-doc-ignored.js",
    "content": "/** @type {import('graphql-config').IGraphQLConfig } */\nmodule.exports = {\n  schema: ['../test-documents/schema.graphql'],\n  documents: ['../test-documents/empty.graphql'],\n  extensions: {\n    codegen: {\n      verbose: true,\n      ignoreNoDocuments: true,\n      generates: {\n        './gql/': {\n          preset: 'client',\n        },\n      },\n    },\n  },\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/graphql.config.no-doc.js",
    "content": "/** @type {import('graphql-config').IGraphQLConfig } */\nmodule.exports = {\n  schema: ['../test-documents/schema.graphql'],\n  documents: ['../test-documents/empty.graphql'],\n  extensions: {\n    codegen: {\n      verbose: true,\n      generates: {\n        './gql/': {\n          preset: 'client',\n        },\n      },\n    },\n  },\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/schema-dir/error-schema.graphql",
    "content": "type Query {\n  foo: String!!\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/schema-dir/gatsby-and-custom-parsers/apollo-server.ts",
    "content": "import { gql } from 'apollo-server';\n\nexport const typeDefs = gql`\n  type Query {\n    user: User\n  }\n\n  type User {\n    \"\"\"\n    Used apollo-server\n    \"\"\"\n    a: String\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/schema-dir/gatsby-and-custom-parsers/custom.ts",
    "content": "import { parser } from 'custom-graphql-parser';\n\nexport const typeDefs = parser`\n  type Query {\n    book: Book\n  }\n\n  type Book {\n    \"\"\"\n    Used custom parser\n    \"\"\"\n    a: String\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/schema-dir/gatsby-and-custom-parsers/gatsby.ts",
    "content": "import { graphql } from 'gatsby';\n\nexport const typeDefs = graphql`\n  extend type User {\n    \"\"\"\n    Used gatsby\n    \"\"\"\n    b: String\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/schema-dir/gatsby-and-custom-parsers/graphql-tag.ts",
    "content": "import gql from 'graphql-tag';\n\nexport const typeDefs = gql`\n  type Query {\n    user: User\n  }\n\n  type User {\n    \"\"\"\n    Used graphql-tag\n    \"\"\"\n    a: String\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/schema-dir/query.graphql",
    "content": "# import User from './user.graphql'\n\ntype Query {\n  user: User\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/schema-dir/schema-object.cjs",
    "content": "const { GraphQLSchema, GraphQLObjectType, GraphQLString } = require('graphql');\n\nmodule.exports = new GraphQLSchema({\n  query: new GraphQLObjectType({\n    name: 'Query',\n    fields: {\n      foo: {\n        type: GraphQLString,\n        resolve: () => `FOO`,\n      },\n    },\n  }),\n});\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/schema-dir/schema.ts",
    "content": "import gql from 'graphql-tag';\n\nexport const typeDefs = gql`\n  type Query {\n    user: User\n  }\n\n  type User {\n    a: String\n  }\n`;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/schema-dir/user.graphql",
    "content": "type User {\n  a: String\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/test-files/schema-dir/with-extend.js",
    "content": "const { buildSchema } = require('graphql');\n\nconst schema = buildSchema(/* GraphQL */ `\n  type User {\n    a: String\n  }\n\n  type Query {\n    user: User\n  }\n\n  extend type Query {\n    hello: String\n  }\n`);\n\nmodule.exports = schema;\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/utils.ts",
    "content": "import os from 'os';\nimport { join, parse, relative, resolve } from 'path';\nimport makeDir from 'make-dir';\nimport * as rimraf from 'rimraf';\n\nconst fs = await vi.importActual<typeof import('fs')>('fs');\n\nexport class TempDir {\n  dir: string;\n\n  constructor() {\n    const tempDir = fs.realpathSync(os.tmpdir());\n    const relativeParent = relative(process.cwd(), 'codegen');\n\n    // Each temp directory will be unique to the test file.\n    // This ensures that temp files/dirs won't cause side effects for other tests.\n    this.dir = resolve(tempDir, 'codegen', `${relativeParent}-dir`);\n\n    makeDir.sync(this.dir);\n  }\n\n  createFile(file: string, contents: string): void {\n    const filePath = join(this.dir, file);\n    const fileDir = parse(filePath).dir;\n\n    makeDir.sync(fileDir);\n\n    fs.writeFileSync(filePath, `${contents}\\n`);\n  }\n\n  clean() {\n    const cleanPattern = join(this.dir, '**/*');\n    rimraf.sync(cleanPattern);\n  }\n\n  deleteTempDir() {\n    rimraf.sync(this.dir);\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/watcher-test-helpers/assert-watcher-build-triggers.ts",
    "content": "import { join, isAbsolute, relative, resolve, sep } from 'path';\nimport type { Options } from '@parcel/watcher';\nimport isGlob from 'is-glob';\nimport type { Mock } from 'vitest';\n\nimport {\n  formatBuildTriggerErrorPrelude,\n  formatErrorGlobNotIgnoredByParcelWatcher,\n  formatErrorPathNotIgnoredByParcelWatcher,\n} from './format-watcher-assertion-errors';\n\ninterface MockWatcher {\n  watchDirectory: string;\n  subscribeOpts?: Options;\n  dispatchChange: (path: string) => Promise<unknown>;\n  stopWatching: () => Promise<void>;\n  subscribeCallbackMock: Mock;\n  subscribeMock: Mock;\n  onWatchTriggeredMock: Mock;\n  unsubscribeMock: Mock;\n}\n\n/**\n * Helper function for asserting that multiple paths did or did not trigger a build,\n * and for asserting the values of paths and globs passed to {@link Options}`[\"ignore\"]`\n */\nexport const assertBuildTriggers = async (\n  mockWatcher: MockWatcher,\n  {\n    shouldTriggerBuild,\n    shouldNotTriggerBuild,\n    globsWouldBeIgnoredByParcelWatcher,\n    pathsWouldBeIgnoredByParcelWatcher,\n    keepWatching,\n  }: {\n    /**\n     * Optional array of relative (from CWD) paths that SHOULD trigger build during watch mode\n     *\n     * Each path will be converted to an absolute path before dispatching it as\n     * a change event, which is consistent with how ParcelWatcher dispatches\n     * events (always containing an absolute path).\n     */\n    shouldTriggerBuild?: string[];\n    /**\n     * Optional array of relative (from CWD) paths that SHOULD NOT trigger build during watch mode\n     *\n     * Each path will be converted to an absolute path before dispatching it as\n     * a change event, which is consistent with how ParcelWatcher dispatches\n     * events (always containing an absolute path).\n     *\n     * NOTE: If a path would match one of the ignore patterns passed to Parcel,\n     * because we do not implement the C++ code that evaluates those paths, it\n     * will still be evaluated by the subscribe trigger. That's probably fine,\n     * if you expect that our JS level matchers should also ignore the path,\n     * but keep in mind that in production, the real Parcel watcher would (hopefully)\n     * never dispatch an event with an ignored path to the subscribe callback.\n     */\n    shouldNotTriggerBuild?: string[];\n    /**\n     * Optional array specifying paths (_not_ globs) that should be included\n     * in the `options.ignore` value passed to {@link ParcelWatcher.subscribe}.\n     *\n     * Any paths expected to be ignored should be specified _relative from cwd_,\n     * as they would be in the config file. Note that ParcelWatcher expects\n     * these paths to be relative from the `watchDirectory`, and the assertion\n     * helper will do the conversion, by converting each item in the `options.ignore`\n     * array to be relative from the cwd, and _then_ searching for a match to the\n     * specified path.\n     *\n     * This is different from {@link globsWouldBeIgnoredByParcelWatcher} which\n     * does no conversion and only looks for exact matches.\n     *\n     * For each path in this array:\n     *\n     *  * It will be checked for equality with an item in `options.ignore`, but\n     *    only after all paths in options.ignore have been converted to also be relative from cwd\n     *\n     * See: {@link https://github.com/parcel-bundler/watcher#options}\n     *\n     * NOTE: Because our mock does not implement Parcel Watcher's C++ code that\n     * checks whether a path should be ignored, that means that every dispatched\n     * event, regardless of path, will always call the subscribe callback on our mock,\n     * even if Parcel would have otherwise ignored it.\n     */\n    pathsWouldBeIgnoredByParcelWatcher?: string[];\n    /**\n     * Optional array specifying glob patterns (_not_ paths) that should be included\n     * in the `options.ignore` value passed to {@link ParcelWatcher.subscribe}.\n     *\n     * This assertion helper will look for an **exact match** of each string\n     * in this array. Any relative globs should be specified relative from the\n     * `watchDirectory`, because this asertion helper will not attempt to convert\n     * them (unlike with {@link pathsWouldBeIgnoredByParcelWatcher}).\n     *\n     * For each string in this array:\n     *\n     *  * It will be checked for exact equality with an item in options.ignore\n     *\n     * See: {@link https://github.com/parcel-bundler/watcher#options}\n     *\n     * NOTE: Because our mock does not implement Parcel Watcher's C++ code that\n     * checks whether a path should be ignored, that means that every dispatched\n     * event, regardless of path, will always call the subscribe callback on our mock,\n     * even if Parcel would have otherwise ignored it.\n     */\n    globsWouldBeIgnoredByParcelWatcher?: string[];\n    /**\n     * Set this to `true` if the helper function should not call `stopWatching()`\n     * (for example, if you want to continue making assertions within the test).\n     *\n     * By default, the helper will stop the watcher when it's done, even if it\n     * encounters an error.\n     */\n    keepWatching?: true;\n  }\n) => {\n  const {\n    onWatchTriggeredMock,\n    dispatchChange,\n    stopWatching,\n    subscribeCallbackMock,\n    subscribeMock,\n    unsubscribeMock,\n    watchDirectory,\n    subscribeOpts,\n  } = mockWatcher;\n\n  // These are optional, but to avoid if/else nesting, set them to empty list if not specified\n  shouldTriggerBuild ??= [];\n  shouldNotTriggerBuild ??= [];\n\n  // Wrap in a try/finally block so even if there's an error, we can stop the watcher\n  // This way, we avoid misleading \"cannot log after tests are done\" error\n  try {\n    expect(subscribeMock).toHaveBeenCalledTimes(1);\n    expect(subscribeMock.mock.calls[0][0]).toBe(watchDirectory);\n    expect(subscribeMock.mock.calls[0][2]).toStrictEqual(subscribeOpts);\n\n    for (const relPath of shouldTriggerBuild) {\n      const path = join(process.cwd(), relPath);\n      await assertTriggeredBuild(path, { dispatchChange, subscribeCallbackMock, onWatchTriggeredMock });\n    }\n\n    expect(subscribeCallbackMock).toHaveBeenCalledTimes(shouldTriggerBuild.length);\n    expect(onWatchTriggeredMock).toHaveBeenCalledTimes(shouldTriggerBuild.length);\n\n    for (const relPath of shouldNotTriggerBuild) {\n      const path = join(process.cwd(), relPath);\n      await assertDidNotTriggerBuild(path, { dispatchChange, subscribeCallbackMock, onWatchTriggeredMock });\n    }\n\n    expect(subscribeCallbackMock).toHaveBeenCalledTimes(shouldTriggerBuild.length + shouldNotTriggerBuild.length);\n    expect(onWatchTriggeredMock).toHaveBeenCalledTimes(shouldTriggerBuild.length);\n\n    const ignore = subscribeOpts.ignore ?? [];\n    if (pathsWouldBeIgnoredByParcelWatcher) {\n      for (const relPathFromCwd of pathsWouldBeIgnoredByParcelWatcher) {\n        if (isGlob(relPathFromCwd)) {\n          throw new Error(\n            [\n              `expected path, got glob: ${relPathFromCwd}`,\n              'pass globs to globsWouldBeIgnoredByParcelWatcher, not pathsWouldBeIgnoredByParcelWatcher',\n            ].join('\\n')\n          );\n        }\n\n        if (isAbsolute(relPathFromCwd)) {\n          throw new Error('pathsWouldBeIgnoredByParcelWatcher should only include relative paths from cwd');\n        }\n        assertParcelWouldIgnorePath(relPathFromCwd, { watchDirectory, ignore });\n      }\n    }\n\n    if (globsWouldBeIgnoredByParcelWatcher) {\n      for (const expectedIgnoredGlob of globsWouldBeIgnoredByParcelWatcher) {\n        if (!isGlob(expectedIgnoredGlob)) {\n          throw new Error(\n            [\n              `expected glob, got path (or something that is not a glob): ${expectedIgnoredGlob}`,\n              'pass paths to pathsWouldBeIgnoredByParcelWatcher, not globsWouldBeIgnoredByParcelWatcher',\n            ].join('\\n')\n          );\n        }\n\n        assertParcelWouldIgnoreGlob(expectedIgnoredGlob, { watchDirectory, ignore });\n      }\n    }\n  } finally {\n    if (keepWatching !== true) {\n      await stopWatching();\n      expect(unsubscribeMock).toHaveBeenCalledTimes(1);\n    }\n  }\n};\n\n/**\n * Given a glob pattern, assert that {@link Options}`[\"ignore\"]`\n * contains that glob pattern (exact match).\n *\n * We don't implement actual globbing logic, because Parcel Watcher does that\n * from C++ and it would be a leaky mock.\n */\nconst assertParcelWouldIgnoreGlob = (\n  /** Glob pattern expected to exist in {@link Options}`[\"ignore\"]` */\n  expectToIgnoreGlob: string,\n  { ignore, watchDirectory }: { watchDirectory: string; ignore: Required<Options>['ignore'] }\n) => {\n  const parcelIgnoredGlobs = ignore.filter(pathOrGlob => isGlob(pathOrGlob));\n\n  const hasMatch = parcelIgnoredGlobs.includes(expectToIgnoreGlob);\n\n  try {\n    expect(hasMatch).toBe(true);\n  } catch (error) {\n    error.message = formatErrorGlobNotIgnoredByParcelWatcher({\n      expectedGlob: expectToIgnoreGlob,\n      parcelIgnoredGlobs,\n      jestErrorMessage: error.message,\n      watchDirectory,\n    });\n    Error.captureStackTrace(error, assertParcelWouldIgnoreGlob);\n    throw error;\n  }\n};\n\n/**\n * Given a path, and the `ignore` option passed to the mocked {@link Options},\n * assert that ParcelWatcher \"would\" ignore the path if given it as part of the ignore option.\n *\n * Note that ParcelWatcher expects paths relative from the watchDirectory, but\n * our assertion helper expects paths relative from cwd.\n */\nconst assertParcelWouldIgnorePath = (\n  /**\n   * Relative path from cwd, as given to {@link assertBuildTriggers}\n   * `pathsWouldBeIgnoredByParcelWatcher` option\n   */\n  expectToIgnoreRelPathFromCwd: string,\n  {\n    watchDirectory,\n    ignore,\n  }: {\n    watchDirectory: string;\n    ignore: Required<Options>['ignore'];\n  }\n) => {\n  const parcelIgnoredPaths = ignore.filter(pathOrGlob => !isGlob(pathOrGlob));\n\n  const parcelIgnoredPathsRelativeFromCwd = parcelIgnoredPaths.map(relOrAbsolutePath => {\n    // NOTE: ParcelWatcher considers relative ignore paths relative from the given watchDirectory\n    const relPathFromWatchDir = isAbsolute(relOrAbsolutePath)\n      ? relative(watchDirectory, relOrAbsolutePath)\n      : relOrAbsolutePath;\n\n    // ...but we want to assert relative from cwd\n    const absPath = resolve(process.cwd(), relative(process.cwd(), watchDirectory), relPathFromWatchDir);\n    const relPathFromCwd = relative(process.cwd(), absPath);\n\n    // NOTE: This will not include \"./\"\n    return relPathFromCwd;\n  });\n\n  // Match on exact match, or exact match with ./ prefix (or .\\ on windows)\n  const hasMatch = parcelIgnoredPathsRelativeFromCwd.some(\n    ignorePathRelFromCwd =>\n      expectToIgnoreRelPathFromCwd === ignorePathRelFromCwd ||\n      expectToIgnoreRelPathFromCwd === `.${sep}${ignorePathRelFromCwd}`\n  );\n\n  try {\n    expect(hasMatch).toBe(true);\n  } catch (error) {\n    error.message = formatErrorPathNotIgnoredByParcelWatcher({\n      expectedPath: expectToIgnoreRelPathFromCwd,\n      parcelIgnoredPaths,\n      parcelIgnoredPathsRelativeFromCwd,\n      jestErrorMessage: error.message,\n      watchDirectory,\n    });\n    Error.captureStackTrace(error, assertParcelWouldIgnorePath);\n    throw error;\n  }\n};\n\ntype MockWatcherAssertionHelpers = Pick<\n  MockWatcher,\n  'dispatchChange' | 'subscribeCallbackMock' | 'onWatchTriggeredMock'\n>;\n\n/**\n * Assertion helper to assert that the given (absolute) path triggered a build\n */\nconst assertTriggeredBuild = async (\n  /** Absolute path */ path: string,\n  { dispatchChange, subscribeCallbackMock, onWatchTriggeredMock }: MockWatcherAssertionHelpers\n) => {\n  try {\n    await dispatchChange(path);\n    expect(subscribeCallbackMock).toHaveBeenLastCalledWith(undefined, [{ path, type: 'update' }]);\n    expect(onWatchTriggeredMock).toHaveBeenLastCalledWith('update', path);\n  } catch (error) {\n    error.message = formatBuildTriggerErrorPrelude(path, true, error.message);\n    Error.captureStackTrace(error, assertTriggeredBuild);\n    throw error;\n  }\n};\n\n/**\n * Assertion helper to assert that the given (absolute) path did NOT trigger a build\n */\nconst assertDidNotTriggerBuild = async (\n  /** Absolute path */ path: string,\n  { dispatchChange, subscribeCallbackMock, onWatchTriggeredMock }: MockWatcherAssertionHelpers\n) => {\n  try {\n    await dispatchChange(path);\n    expect(subscribeCallbackMock).toHaveBeenLastCalledWith(undefined, [{ path, type: 'update' }]);\n    expect(onWatchTriggeredMock).not.toHaveBeenLastCalledWith('update', path);\n  } catch (error) {\n    error.message = formatBuildTriggerErrorPrelude(path, false, error.message);\n    Error.captureStackTrace(error, assertDidNotTriggerBuild);\n    throw error;\n  }\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/watcher-test-helpers/format-watcher-assertion-errors.ts",
    "content": "import { relative } from 'path';\nimport chalk from 'chalk';\n\n/**\n * Format an error message when a glob is not ignored by Parcel Watcher\n */\nexport const formatErrorGlobNotIgnoredByParcelWatcher = ({\n  expectedGlob,\n  parcelIgnoredGlobs,\n  jestErrorMessage,\n  watchDirectory,\n}: {\n  expectedGlob: string;\n  parcelIgnoredGlobs: string[];\n  jestErrorMessage: string;\n  watchDirectory: string;\n}) => {\n  const rawGlobTableLines = [\n    'Expected glob not found:',\n    expectedGlob,\n    'globs received by ParcelWatcher.Options.ignore',\n    '----------------------------------------------------',\n    ...parcelIgnoredGlobs,\n  ];\n\n  const maxGlobLength = Math.max(...rawGlobTableLines.map(s => s.length));\n\n  const globTableLineFormatters: ((s: string) => string)[] = [s => s, s => chalk.red(s), s => chalk.bold(s)];\n\n  const tableLines = rawGlobTableLines.map((line, rowNum) => {\n    const formatLine = globTableLineFormatters[rowNum] ?? (s => s);\n\n    return `| ${chalk.reset(formatLine(line.padStart(maxGlobLength)))} |`;\n  });\n\n  return `${[\n    chalk.gray(\n      '-----------------------------------------',\n      'Watch Mode Parcel Ignore Assertion Failure:',\n      '-----------------------------------------'\n    ),\n    '',\n    chalk.gray(\n      chalk.bold('Note:'),\n      'Assertion should specify relative glob paths relative from watchDirectory (_not_ cwd),'\n    ),\n    chalk.gray(\n      '      i.e. exactly as given to ParcelWatcher (unlike path assertions which should be relative from cwd),'\n    ),\n    chalk.gray('      because glob assertion looks for an exact match and does not try to convert them.'),\n    '',\n    chalk.gray(chalk.bold('watchDirectory:'), watchDirectory),\n    ' ',\n    ' ',\n    ...tableLines,\n    ' ',\n    chalk.gray(\n      '----------------------------------------------------',\n      'Raw Error (from Jest):',\n      '---------------------------------------------------'\n    ),\n  ].join('\\n')}\\n${jestErrorMessage}`;\n};\n\n/**\n * Format an error message when a path is not ignored by Parcel Watcher\n */\nexport const formatErrorPathNotIgnoredByParcelWatcher = ({\n  expectedPath,\n  parcelIgnoredPaths,\n  parcelIgnoredPathsRelativeFromCwd,\n  jestErrorMessage,\n  watchDirectory,\n}: {\n  expectedPath: string;\n  watchDirectory: string;\n  parcelIgnoredPaths: string[];\n  parcelIgnoredPathsRelativeFromCwd: string[];\n  jestErrorMessage: string;\n}) => {\n  const leftCol = [\n    '',\n    '',\n    'ParcelWatcher.Options[ignore]',\n    'These raw values were received in the options.ignore argument',\n    'of ParcelWatcher.subscribe, which ParcelWatcher expects to be',\n    'either an absolute path, or relative from watchDirectory',\n    '--------------------------------------------------------------+',\n    ...parcelIgnoredPaths,\n  ];\n\n  const rightCol = [\n    'Match not found:',\n    expectedPath,\n    'Converted to be relative from CWD',\n    'Each value was converted to be relative from CWD, (assuming',\n    'that the inputs were correctly relative from watchDirectory),',\n    'and then we scanned this column looking for a match.',\n    '+--------------------------------------------------------------',\n    ...parcelIgnoredPathsRelativeFromCwd,\n  ];\n\n  const headerFormatters: [(s: string) => string, (s: string) => string][] = [\n    [s => chalk.gray(s), s => chalk.gray(s)],\n    [s => s, s => chalk.red(s)],\n    [s => chalk.bold(s), s => chalk.bold(s)],\n    [s => chalk.gray(s), s => chalk.gray(s)],\n    [s => chalk.gray(s), s => chalk.gray(s)],\n    [s => chalk.gray(s), s => chalk.gray(s)],\n  ];\n\n  const maxLeftCol = Math.max(...leftCol.map(c => c.length));\n  const maxRightCol = Math.max(...rightCol.map(c => c.length));\n\n  if (leftCol.length !== rightCol.length) {\n    throw new Error('Formatting error: columns different height');\n  }\n\n  const tableLines = leftCol.map((leftCell, rowNum) => {\n    const [formatLeft, formatRight] = headerFormatters[rowNum] ?? [(s: string) => s, (s: string) => s];\n\n    return `${formatLeft(leftCell.padStart(maxLeftCol))} | ${formatRight(rightCol[rowNum].padEnd(maxRightCol))}`;\n  });\n\n  return `${[\n    chalk.gray(\n      '-----------------------------------------',\n      'Watch Mode Parcel Ignore Assertion Failure:',\n      '-----------------------------------------'\n    ),\n    chalk.red(`<${expectedPath}> ` + chalk.bold('would not have been ignored by Parcel Watcher')),\n    chalk.gray(chalk.bold('Note:'), 'Assertion should specify path relative from current working directory,'),\n    chalk.gray('      but code should give path to ParcelWatcher relative from', chalk.bold('watchDirectory')),\n    '',\n    chalk.gray(chalk.bold('watchDirectory:'), watchDirectory),\n    '',\n    '',\n    ...tableLines,\n    '',\n    chalk.gray(\n      '----------------------------------------------------',\n      'Raw Error (from Jest):',\n      '---------------------------------------------------'\n    ),\n  ].join('\\n')}\\n${jestErrorMessage}`;\n};\n\n/**\n * Format a readable error message to print when the assertion fails, so that\n * the developer can immediately see which path was expected to trigger (or not trigger)\n * the rebuild.\n *\n * Since we're using auto-assertions, this makes for much more readable errors\n * than the raw Jest message (which can be misleading because, e.g. if the assertion\n * is that `onWatchTriggered` was last called with the right path, but it wasn't,\n * then the Jest error message will misleadingly print the previous path).\n */\nexport const formatBuildTriggerErrorPrelude = (\n  /** Absolute path */ path: string,\n  expectedToBuild: boolean,\n  jestErrorMessage: string\n) => {\n  const relPath = relative(process.cwd(), path);\n  const should = `${expectedToBuild ? 'have' : 'not have'} triggered build`;\n  const but = expectedToBuild ? 'it did not' : 'it did';\n  return `${[\n    chalk.gray('---------------------- Watch Mode Build Trigger Assertion Failure: ----------------------'),\n    chalk.red(`<${relPath}>` + chalk.bold(` should ${should}, but ${but}.`)),\n    `     Expected: ${chalk.green(expectedToBuild ? 'to trigger build' : 'not to trigger build')}`,\n    `     Received: ${chalk.red(expectedToBuild ? 'did not trigger build' : 'triggered build')}`,\n    chalk.gray(`Absolute Path: ${path}`),\n    '',\n    chalk.gray('-------------------------------- Raw Error (from Jest): --------------------------------'),\n  ].join('\\n')}\\n${jestErrorMessage}`;\n};\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/watcher.patterns.spec.ts",
    "content": "import * as fs from '../src/utils/file-system.js';\nimport type { SubscribeCallback } from '@parcel/watcher';\nimport { assertBuildTriggers } from './watcher-test-helpers/assert-watcher-build-triggers.js';\nimport { join } from 'path';\nimport { createWatcher } from '../src/utils/watcher.js';\nimport { CodegenContext } from '../src/config.js';\nimport type { Mock } from 'vitest';\n\nconst unsubscribeMock = vi.fn();\nconst subscribeMock = vi.fn();\nlet subscribeCallbackMock: Mock<SubscribeCallback>;\n\nvi.mock('@parcel/watcher', () => ({\n  subscribe: subscribeMock.mockImplementation((watchDirectory: string, subscribeCallback: SubscribeCallback) => {\n    subscribeCallbackMock = vi.fn(subscribeCallback);\n    return {\n      unsubscribe: unsubscribeMock,\n    };\n  }),\n}));\n\nconst setupMockWatcher = async (\n  codegenContext: ConstructorParameters<typeof CodegenContext>[0],\n  onNext: Mock = vi.fn().mockResolvedValue([])\n) => {\n  const { stopWatching } = createWatcher(new CodegenContext(codegenContext), onNext);\n\n  const dispatchChange = async (path: string) => subscribeCallbackMock(undefined, [{ type: 'update', path }]);\n\n  // createWatcher doesn't set up subscription immediately, so we wait for a tick before continuing\n  await new Promise(resolve => setTimeout(resolve, 100));\n\n  return { stopWatching, dispatchChange };\n};\n\ndescribe('Watch patterns', () => {\n  beforeEach(() => {\n    vi.clearAllMocks();\n\n    // Silence logs\n    vi.spyOn(console, 'log').mockImplementation(() => {});\n    vi.spyOn(console, 'info').mockImplementation(() => {});\n  });\n\n  test('watches the longest common prefix directory', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n\n    const { stopWatching } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: vi.fn() },\n        schema: './foo/something.ts',\n        generates: {\n          ['./foo/some-output.ts']: {\n            documents: ['./foo/bar/*.graphql'],\n          },\n        },\n      },\n    });\n\n    expect(subscribeMock).toHaveBeenCalledTimes(1);\n    expect(subscribeMock.mock.calls[0][0]).toBe(join(process.cwd(), 'foo'));\n    await stopWatching();\n  });\n\n  test('ignores schema URLs when detecting common prefix directory', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n\n    const { stopWatching } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: vi.fn() },\n        schema: 'http://localhost/graphql',\n        generates: {\n          ['./foo/some-output.ts']: {\n            documents: ['./foo/bar/*.graphql'],\n          },\n        },\n      },\n    });\n\n    expect(subscribeMock).toHaveBeenCalledTimes(1);\n    expect(subscribeMock.mock.calls[0][0]).toBe(join(process.cwd(), 'foo'));\n    await stopWatching();\n  });\n\n  test('watches process.cwd() when longest common prefix directory is not accessible', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(async path => {\n      if (path === join(process.cwd(), 'foo')) {\n        throw new Error();\n      }\n    });\n\n    const { stopWatching } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: vi.fn() },\n        schema: './foo/something.ts',\n        generates: {\n          ['./foo/some-output.ts']: {\n            documents: ['./foo/bar/*.graphql'],\n          },\n        },\n      },\n    });\n\n    expect(subscribeMock).toHaveBeenCalledTimes(1);\n    expect(subscribeMock.mock.calls[0][0]).toBe(process.cwd());\n    await stopWatching();\n  });\n\n  // This test uses manual assertions to make sure they're tested individually,\n  // but note that `assertBuildTriggers` can do most of this work for you\n  test('triggers a rebuild for basic case', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n    const onWatchTriggeredMock = vi.fn();\n\n    const { stopWatching, dispatchChange } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: onWatchTriggeredMock },\n        schema: './foo/something.ts',\n        generates: {\n          ['./foo/some-output.ts']: {\n            documents: ['./foo/bar/*.graphql'],\n          },\n        },\n      },\n    });\n\n    expect(subscribeMock).toHaveBeenCalledTimes(1);\n    expect(subscribeMock.mock.calls[0][0]).toBe(join(process.cwd(), 'foo'));\n\n    const shouldTriggerBuild = join(process.cwd(), './foo/bar/fizzbuzz.graphql');\n    const shouldNotTriggerBuild = join(process.cwd(), './foo/bar/something.ts');\n\n    await dispatchChange(shouldTriggerBuild);\n    expect(subscribeCallbackMock).toHaveBeenLastCalledWith(undefined, [{ path: shouldTriggerBuild, type: 'update' }]);\n    expect(onWatchTriggeredMock).toHaveBeenLastCalledWith('update', shouldTriggerBuild);\n\n    await dispatchChange(shouldNotTriggerBuild);\n    expect(subscribeCallbackMock).toHaveBeenLastCalledWith(undefined, [\n      { path: shouldNotTriggerBuild, type: 'update' },\n    ]);\n    expect(onWatchTriggeredMock).not.toHaveBeenLastCalledWith('update', shouldNotTriggerBuild);\n    expect(onWatchTriggeredMock).toHaveBeenCalledTimes(1);\n\n    expect(subscribeCallbackMock).toHaveBeenCalledTimes(2);\n\n    await stopWatching();\n    expect(unsubscribeMock).toHaveBeenCalled();\n  });\n\n  test('globally included paths should be included even when a local pattern negates them', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n    const onWatchTriggeredMock = vi.fn();\n\n    const { stopWatching, dispatchChange } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: onWatchTriggeredMock },\n        schema: ['./foo/**/match-schema-everywhere.graphql'],\n        watch: [\n          'foo/**/match-watch-everywhere.graphql',\n          'foo/**/match-watch-doc-everywhere.graphql',\n          'foo/**/match-watch-schema-everywhere.graphql',\n        ],\n        documents: ['foo/**/match-doc-everywhere.graphql'],\n        generates: {\n          // globally inclued paths should be included even when a local pattern negates them\n          ['./foo/local-exclusions-dont-precede-global-inclusions.ts']: {\n            watchPattern: ['!foo/global-beats-local/match-watch-everywhere.graphql'],\n            documents: [\n              '!foo/global-beats-local/match-doc-everywhere.graphql',\n              '!foo/global-beats-local/match-watch-doc-everywhere.graphql',\n            ],\n            schema: [\n              '!foo/global-beats-local/match-schema-everywhere.graphql',\n              '!foo/global-beats-local/match-watch-schema-everywhere.graphql',\n            ],\n          },\n        },\n      },\n    });\n\n    await assertBuildTriggers(\n      {\n        onWatchTriggeredMock,\n        dispatchChange,\n        stopWatching,\n        subscribeCallbackMock,\n        subscribeMock,\n        unsubscribeMock,\n        watchDirectory: join(process.cwd(), 'foo'),\n        subscribeOpts: {\n          ignore: ['**/.git/**', 'local-exclusions-dont-precede-global-inclusions.ts'],\n        },\n      },\n      {\n        shouldTriggerBuild: [\n          // watch\n          './foo/match-watch-everywhere.graphql',\n          './foo/fizz/match-watch-everywhere.graphql',\n          './foo/fizz/buzz/match-watch-everywhere.graphql',\n          './foo/fizz/buzz/foobarbaz/match-watch-everywhere.graphql',\n          // watch-doc (matched in global watch, excluded in local doc)\n          './foo/match-watch-doc-everywhere.graphql',\n          './foo/fizz/match-watch-doc-everywhere.graphql',\n          './foo/fizz/buzz/match-watch-doc-everywhere.graphql',\n          './foo/fizz/buzz/foobarbaz/match-watch-doc-everywhere.graphql',\n          // watch-schema (matched in global watch, excluded in local schema)\n          './foo/match-watch-schema-everywhere.graphql',\n          './foo/fizz/match-watch-schema-everywhere.graphql',\n          './foo/fizz/buzz/match-watch-schema-everywhere.graphql',\n          './foo/fizz/buzz/foobarbaz/match-watch-schema-everywhere.graphql',\n          // doc\n          './foo/match-doc-everywhere.graphql',\n          './foo/fizz/match-doc-everywhere.graphql',\n          './foo/fizz/buzz/match-doc-everywhere.graphql',\n          './foo/fizz/buzz/foobarbaz/match-doc-everywhere.graphql',\n          // schema\n          './foo/match-schema-everywhere.graphql',\n          './foo/fizz/match-schema-everywhere.graphql',\n          './foo/fizz/buzz/match-schema-everywhere.graphql',\n          './foo/fizz/buzz/foobarbaz/match-schema-everywhere.graphql',\n        ],\n      }\n    );\n  });\n\n  test('globally negated paths should be excluded even when a local pattern matches them', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n    const onWatchTriggeredMock = vi.fn();\n\n    const { stopWatching, dispatchChange } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: onWatchTriggeredMock },\n        schema: ['!**/exclude-schema-everywhere.graphql'],\n        watch: [\n          '!**/exclude-watch-everywhere.graphql',\n          '!**/exclude-watch-doc-everywhere.graphql',\n          '!**/exclude-watch-schema-everywhere.graphql',\n        ],\n        documents: ['!**/exclude-doc-everywhere.graphql'],\n        generates: {\n          ['./foo/local-inclusions-dont-precede-global-exclusions.ts']: {\n            watchPattern: [\n              'foo/global-beats-local/exclude-watch-everywhere.graphql',\n              'foo/global-beats-local/exclude-watch-doc-everywhere.graphql',\n              'foo/global-beats-local/exclude-watch-schema-everywhere.graphql',\n            ],\n            documents: [\n              'foo/global-beats-local/exclude-doc-everywhere.graphql',\n              'foo/global-beats-local/exclude-watch-doc-everywhere.graphql',\n            ],\n            schema: [\n              'foo/global-beats-local/exclude-schema-everywhere.graphql',\n              'foo/global-beats-local/exclude-watch-schema-everywhere.graphql',\n            ],\n          },\n        },\n      },\n    });\n\n    await assertBuildTriggers(\n      {\n        onWatchTriggeredMock,\n        dispatchChange,\n        stopWatching,\n        subscribeCallbackMock,\n        subscribeMock,\n        unsubscribeMock,\n        watchDirectory: join(process.cwd(), 'foo'),\n        subscribeOpts: {\n          ignore: ['**/.git/**', 'local-inclusions-dont-precede-global-exclusions.ts'],\n        },\n      },\n      {\n        shouldNotTriggerBuild: [\n          'foo/global-beats-local/exclude-watch-everywhere.graphql',\n          'foo/global-beats-local/exclude-doc-everywhere.graphql',\n          'foo/global-beats-local/exclude-schema-everywhere.graphql',\n          'foo/global-beats-local/exclude-watch-doc-everywhere.graphql',\n          'foo/global-beats-local/exclude-watch-schema-everywhere.graphql',\n        ],\n      }\n    );\n  });\n\n  test('local watchPattern negation should override local documents match', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n    const onWatchTriggeredMock = vi.fn();\n\n    const { stopWatching, dispatchChange } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: onWatchTriggeredMock },\n        schema: './foo/something.ts',\n        generates: {\n          ['./foo/some-output.ts']: {\n            watchPattern: '!./foo/bar/never-watch.graphql',\n            documents: ['./foo/bar/*.graphql'],\n          },\n        },\n      },\n    });\n\n    await assertBuildTriggers(\n      {\n        onWatchTriggeredMock,\n        dispatchChange,\n        stopWatching,\n        subscribeCallbackMock,\n        subscribeMock,\n        unsubscribeMock,\n        watchDirectory: join(process.cwd(), 'foo'),\n        subscribeOpts: {\n          ignore: ['**/.git/**', 'some-output.ts'],\n        },\n      },\n      {\n        shouldTriggerBuild: ['./foo/bar/okay-doc.graphql'],\n        shouldNotTriggerBuild: ['./foo/bar/never-watch.graphql'],\n      }\n    );\n  });\n\n  test('local negations in documents set should override match in same documents set', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n    const onWatchTriggeredMock = vi.fn();\n\n    const { stopWatching, dispatchChange } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: onWatchTriggeredMock },\n        schema: './foo/something.ts',\n        generates: {\n          ['./foo/some-output.ts']: {\n            documents: ['./foo/bar/*.graphql', '!./foo/bar/never.graphql'],\n          },\n        },\n      },\n    });\n\n    await assertBuildTriggers(\n      {\n        onWatchTriggeredMock,\n        dispatchChange,\n        stopWatching,\n        subscribeCallbackMock,\n        subscribeMock,\n        unsubscribeMock,\n        watchDirectory: join(process.cwd(), 'foo'),\n        subscribeOpts: {\n          ignore: ['**/.git/**', 'some-output.ts'],\n        },\n      },\n      {\n        shouldTriggerBuild: ['./foo/bar/okay.graphql'],\n        shouldNotTriggerBuild: ['./foo/bar/never.graphql'],\n      }\n    );\n  });\n\n  test('local watchPattern negation should override local schema match', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n    const onWatchTriggeredMock = vi.fn();\n\n    const { stopWatching, dispatchChange } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: onWatchTriggeredMock },\n        schema: './foo/something.ts',\n        generates: {\n          ['./foo/some-output.ts']: {\n            watchPattern: '!./foo/bar/never-watch.graphql',\n            schema: ['./foo/bar/*.graphql'],\n          },\n        },\n      },\n    });\n\n    await assertBuildTriggers(\n      {\n        onWatchTriggeredMock,\n        dispatchChange,\n        stopWatching,\n        subscribeCallbackMock,\n        subscribeMock,\n        unsubscribeMock,\n        watchDirectory: join(process.cwd(), 'foo'),\n        subscribeOpts: {\n          ignore: ['**/.git/**', 'some-output.ts'],\n        },\n      },\n      {\n        shouldTriggerBuild: ['./foo/bar/okay-doc.graphql'],\n        shouldNotTriggerBuild: ['./foo/bar/never-watch.graphql'],\n      }\n    );\n  });\n\n  test('local negations in schema set should override match in same schema set', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n    const onWatchTriggeredMock = vi.fn();\n\n    const { stopWatching, dispatchChange } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: onWatchTriggeredMock },\n        schema: './foo/something.ts',\n        generates: {\n          ['./foo/some-output.ts']: {\n            schema: ['./foo/bar/*.graphql', '!./foo/bar/never.graphql'],\n          },\n        },\n      },\n    });\n\n    await assertBuildTriggers(\n      {\n        onWatchTriggeredMock,\n        dispatchChange,\n        stopWatching,\n        subscribeCallbackMock,\n        subscribeMock,\n        unsubscribeMock,\n        watchDirectory: join(process.cwd(), 'foo'),\n        subscribeOpts: {\n          ignore: ['**/.git/**', 'some-output.ts'],\n        },\n      },\n      {\n        shouldTriggerBuild: ['./foo/bar/okay.graphql'],\n        shouldNotTriggerBuild: ['./foo/bar/never.graphql'],\n      }\n    );\n  });\n\n  test('match in one local group, negated in another group, should still match', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n    const onWatchTriggeredMock = vi.fn();\n\n    const { stopWatching, dispatchChange } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: onWatchTriggeredMock },\n        schema: './foo/something.ts',\n        generates: {\n          // match in one local group, negation in another local group, should still match\n          ['./foo/alphabet/types-no-sigma.ts']: {\n            schema: [\n              './foo/alphabet/schema/delta.graphql', // delta explicitly included\n              './foo/alphabet/schema/zeta.graphql', // zeta explicitly included\n              '!foo/alphabet/schema/sigma.graphql', // sigma explicitly excluded\n            ],\n            documents: [\n              './foo/alphabet/docs/*.graphql', // zeta implicitly included\n              '!**/sigma.graphql', // sigma excluded here\n            ],\n          },\n          // match in one local group, negation in another local group, should still match\n          ['./foo/alphabet/types-no-zeta.ts']: {\n            watchPattern: [\n              // local watch pattern doesnt take priority over other groups schema\n              '!./foo/alphabet/schema/delta.graphql', // delta explicitly excluded\n            ],\n            schema: [\n              './foo/alphabet/schema/sigma.graphql', // sigma explicitly included\n              '!foo/alphabet/schema/zeta.graphql', // zeta explicitly excluded\n            ],\n            documents: [\n              './foo/alphabet/docs/sigma.graphql', // sigma explicitly included (should always match)\n              '!./foo/alphabet/docs/zeta.graphql', // zeta excluded here\n            ],\n          },\n        },\n      },\n    });\n\n    await assertBuildTriggers(\n      {\n        onWatchTriggeredMock,\n        dispatchChange,\n        stopWatching,\n        subscribeCallbackMock,\n        subscribeMock,\n        unsubscribeMock,\n        watchDirectory: join(process.cwd(), 'foo'),\n        subscribeOpts: {\n          ignore: ['**/.git/**', 'alphabet/types-no-sigma.ts', 'alphabet/types-no-zeta.ts'],\n        },\n      },\n      {\n        shouldTriggerBuild: [\n          './foo/alphabet/docs/zeta.graphql',\n          './foo/alphabet/docs/sigma.graphql',\n          './foo/alphabet/schema/zeta.graphql',\n          './foo/alphabet/schema/sigma.graphql',\n          './foo/alphabet/schema/delta.graphql',\n        ],\n      }\n    );\n  });\n\n  test('output directories with presetConfig create glob patterns ignored by parcel watcher', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n    const onWatchTriggeredMock = vi.fn();\n\n    const { stopWatching, dispatchChange } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: onWatchTriggeredMock },\n        generates: {\n          ['./foo/some-preset-bar/']: {\n            preset: 'near-operation-file',\n            presetConfig: {\n              extension: '.generated.tsx',\n              baseTypesPath: 'types.ts',\n            },\n            documents: ['./foo/some-preset-bar/*.graphql'],\n          },\n          ['./foo/some-preset-without-trailing-slash']: {\n            // no trailing slash after directory\n            preset: 'near-operation-file',\n            presetConfig: {\n              extension: '.fizzbuzz.tsx',\n              baseTypesPath: 'types.ts',\n            },\n            documents: ['./foo/some-preset-without-trailing-slash/*.graphql'],\n          },\n        },\n      },\n    });\n\n    await assertBuildTriggers(\n      {\n        onWatchTriggeredMock,\n        dispatchChange,\n        stopWatching,\n        subscribeCallbackMock,\n        subscribeMock,\n        unsubscribeMock,\n        watchDirectory: join(process.cwd(), 'foo'),\n        subscribeOpts: {\n          ignore: [\n            '**/.git/**',\n            'some-preset-bar/**/*.generated.tsx',\n            'some-preset-without-trailing-slash/**/*.fizzbuzz.tsx',\n          ],\n        },\n      },\n      {\n        // note: since our mock does not implement ParcelWatcher's shouldIgnore logic,\n        // we can't actually test shouldNotTriggerBuild, because the subscription callback\n        // will still be called. For that reason, we only check that the globs were passed\n        // to ParcelWatcher.Options[\"ignore\"] as expected (hence _would_BeIgnoredByParcelWatcher)\n        shouldNotTriggerBuild: [],\n        globsWouldBeIgnoredByParcelWatcher: [\n          // note: globs are tested for exact match with argument passed to subscribe options,\n          //       so they should be specified relative from watchDirectory, _not_ cwd (see typedoc)\n          'some-preset-bar/**/*.generated.tsx',\n          'some-preset-without-trailing-slash/**/*.fizzbuzz.tsx',\n        ],\n      }\n    );\n  });\n\n  test('output files are ignored by parcel watcher, but would not trigger rebuild anyway', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n    const onWatchTriggeredMock = vi.fn();\n\n    const { stopWatching, dispatchChange } = await setupMockWatcher({\n      filepath: './foo/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: onWatchTriggeredMock },\n        generates: {\n          ['./foo/some-output.ts']: {\n            documents: ['./foo/bar/*.graphql', '!./foo/bar/never.graphql'],\n          },\n        },\n      },\n    });\n\n    await assertBuildTriggers(\n      {\n        onWatchTriggeredMock,\n        dispatchChange,\n        stopWatching,\n        subscribeCallbackMock,\n        subscribeMock,\n        unsubscribeMock,\n        watchDirectory: join(process.cwd(), 'foo'),\n        subscribeOpts: {\n          ignore: ['**/.git/**', 'some-output.ts'],\n        },\n      },\n      {\n        // NOTE: Unlike the test with output _directories_, we can actually assert\n        // that we wouldn't build output files, even if they were _not_ passed\n        // to ParcelWatcher.Options[ignore], because we don't include output files\n        // in our pattern matching (but there is no logic for output directories)\n        shouldNotTriggerBuild: [\n          './foo/some-output.ts', // output file (note: should be ignored by parcel anyway)\n        ],\n        pathsWouldBeIgnoredByParcelWatcher: [\n          // note: expectations should be relative from cwd; assertion helper converts\n          //       the values received by parcelWatcher to match before testing them (see typedoc)\n          './foo/some-output.ts', // output file\n          'foo/some-output.ts', // output file\n        ],\n      }\n    );\n  });\n\n  // NOTE: Each individual aspect of this test should be covered by its own isolated test above,\n  // so if one of those is failing, this should be failing too. This big test was written first,\n  // and then broken into the individual tests, but we may as well keep it here.\n  // However, all instances of \"foo\" have been changed to \"fuzz\", so that if a test fails,\n  // ctrl+f for the failing expectation will be easier to find the right place\n  test('all expectations also work in a big combined config', async () => {\n    vi.spyOn(fs, 'access').mockImplementation(() => Promise.resolve());\n    const onWatchTriggeredMock = vi.fn();\n\n    const { stopWatching, dispatchChange } = await setupMockWatcher({\n      filepath: './fuzz/some-config.ts',\n      config: {\n        hooks: { onWatchTriggered: onWatchTriggeredMock },\n        schema: [\n          './fuzz/something.ts',\n          './fuzz/**/match-schema-everywhere.graphql',\n          '!**/exclude-schema-everywhere.graphql',\n        ],\n        watch: ['!**/exclude-watch-everywhere.graphql', 'fuzz/**/match-watch-everywhere.graphql'],\n        documents: ['fuzz/**/match-doc-everywhere.graphql', '!**/exclude-doc-everywhere.graphql'],\n        generates: {\n          // globally inclued paths should be included even when a local pattern negates them\n          ['./fuzz/local-exclusions-dont-precede-global-inclusions.ts']: {\n            watchPattern: ['!fuzz/global-beats-local/match-watch-everywhere.graphql'],\n            documents: ['!fuzz/global-beats-local/match-doc-everywhere.graphql'],\n            schema: ['!fuzz/global-beats-local/match-schema-everywhere.graphql'],\n          },\n          // globally negated paths should be excluded even when a local pattern matches them\n          ['./fuzz/local-inclusions-dont-precede-global-exclusions.ts']: {\n            watchPattern: ['fuzz/global-beats-local/exclude-watch-everywhere.graphql'],\n            documents: ['fuzz/global-beats-local/exclude-doc-everywhere.graphql'],\n            schema: ['fuzz/global-beats-local/exclude-schema-everywhere.graphql'],\n          },\n          // local watchPattern negation should override local documents match\n          ['./fuzz/some-output.ts']: {\n            watchPattern: '!./fuzz/bar/never-watch.graphql',\n            documents: ['./fuzz/bar/*.graphql', '!./fuzz/bar/never.graphql'],\n          },\n          // local watchPattern negation should override local schema match\n          ['./fuzz/some-other-output.ts']: {\n            documents: './fuzz/some-other-bar/*.graphql',\n            watchPattern: ['!fuzz/some-other-bar/schemas/never-watch-schema.graphql'],\n            schema: ['./fuzz/some-other-bar/schemas/*.graphql', '!fuzz/some-other-bar/schemas/never-schema.graphql'],\n          },\n          // match in one local group, negation in another local group, should still match\n          ['./fuzz/alphabet/types-no-sigma.ts']: {\n            schema: './fuzz/alphabet/schema/no-sigma.graphql',\n            documents: [\n              './fuzz/alphabet/queries/*.graphql', // zeta implicitly included (should always match)\n              '!**/sigma.graphql', // sigma excluded here\n            ],\n          },\n          // match in one local group, negation in another local group, should still match\n          ['./fuzz/alphabet/types-no-zeta.ts']: {\n            schema: './fuzz/alphabet/schema/no-sigma.graphql',\n            documents: [\n              './fuzz/alphabet/queries/sigma.graphql', // sigma explicitly included (should always match)\n              '!./fuzz/alphabet/queries/zeta.graphql', // zeta excluded here\n            ],\n          },\n          ['./fuzz/some-preset-bar/']: {\n            preset: 'near-operation-file',\n            presetConfig: {\n              extension: '.generated.tsx',\n              baseTypesPath: 'types.ts',\n            },\n            documents: ['./fuzz/some-preset-bar/*.graphql'],\n          },\n        },\n      },\n    });\n\n    await assertBuildTriggers(\n      {\n        onWatchTriggeredMock,\n        dispatchChange,\n        stopWatching,\n        subscribeCallbackMock,\n        subscribeMock,\n        unsubscribeMock,\n        watchDirectory: join(process.cwd(), 'fuzz'),\n        subscribeOpts: {\n          ignore: [\n            '**/.git/**',\n            'local-exclusions-dont-precede-global-inclusions.ts',\n            'local-inclusions-dont-precede-global-exclusions.ts',\n            'some-output.ts',\n            'some-other-output.ts',\n            'alphabet/types-no-sigma.ts',\n            'alphabet/types-no-zeta.ts',\n            'some-preset-bar/**/*.generated.tsx',\n          ],\n        },\n      },\n      {\n        shouldTriggerBuild: [\n          './fuzz/some-config.ts', // config file\n          './fuzz/bar/fizzbuzz.graphql',\n          './fuzz/some-other-bar/schemas/fizzbuzz.graphql', // included by wildcard\n          //\n          // match in one local group, negation in another local group, should still match\n          './fuzz/alphabet/queries/zeta.graphql', // excluded in types-no-zeta, but included in types-no-sigma\n          './fuzz/alphabet/queries/sigma.graphql', // excluded in types-no-sigma, but included in types-no-sigma\n          //\n          // globally inclued paths should be included even when a local pattern negates them\n          // watch\n          './fuzz/match-watch-everywhere.graphql',\n          './fuzz/fizz/match-watch-everywhere.graphql',\n          './fuzz/fizz/buzz/match-watch-everywhere.graphql',\n          './fuzz/fizz/buzz/fuzzbarbaz/match-watch-everywhere.graphql',\n          // doc\n          './fuzz/match-doc-everywhere.graphql',\n          './fuzz/fizz/match-doc-everywhere.graphql',\n          './fuzz/fizz/buzz/match-doc-everywhere.graphql',\n          './fuzz/fizz/buzz/fuzzbarbaz/match-doc-everywhere.graphql',\n          // schema\n          './fuzz/match-schema-everywhere.graphql',\n          './fuzz/fizz/match-schema-everywhere.graphql',\n          './fuzz/fizz/buzz/match-schema-everywhere.graphql',\n          './fuzz/fizz/buzz/fuzzbarbaz/match-schema-everywhere.graphql',\n        ],\n        shouldNotTriggerBuild: [\n          //\n          // paths outside of watch directory should be excluded\n          '.git/index.lock', // totally unrelated\n          'match-watch-everywhere.graphql', // would match pattern if under fuzz\n          //\n          // pattern matching should work as expected\n          './fuzz/bar/something.ts', // unrelated file (non-matching extension)\n          './fuzz/some-other-bar/nested/directory/blah.graphql', // no greedy pattern (**/*) to match\n          //\n          // output files should be excluded\n          './fuzz/some-output.ts', // output file (note: should be ignored by parcel anyway)\n          //\n          // locally negated paths should be excluded even when a local pattern matches them\n          './fuzz/bar/never.graphql', // excluded in same document set\n          './fuzz/bar/never-watch.graphql', // excluded by local watchPattern, matched by local docs\n          './fuzz/some-other-bar/schemas/never-schema.graphql', // excluded by local schema group\n          './fuzz/some-other-bar/schemas/never-watch-schema.graphql', // excluded by local watchPattern group\n          //\n          // globally negated paths should be excluded even when a local pattern matches them\n          './fuzz/alphabet/queries/exclude-watch-everywhere.graphql', // included in types-no-sigma.ts, but globaly excluded\n          'fuzz/global-beats-local/exclude-watch-everywhere.graphql',\n          'fuzz/global-beats-local/exclude-doc-everywhere.graphql',\n          'fuzz/global-beats-local/exclude-schema-everywhere.graphql',\n        ],\n        pathsWouldBeIgnoredByParcelWatcher: [\n          // note: expectations should be relative from cwd; assertion helper converts\n          //       the values received by parcelWatcher to match before testing them (see typedoc)\n          './fuzz/some-output.ts', // output file\n          'fuzz/some-output.ts', // output file\n        ],\n        globsWouldBeIgnoredByParcelWatcher: [\n          // note: globs are tested for exact match with argument passed to subscribe options,\n          //       so they should be specified relative from watchDirectory, _not_ cwd (see typedoc)\n          'some-preset-bar/**/*.generated.tsx', // output of preset\n        ],\n      }\n    );\n  });\n});\n"
  },
  {
    "path": "packages/graphql-codegen-cli/tests/watcher.run.spec.ts",
    "content": "import type { Mock } from 'vitest';\nimport * as path from 'path';\nimport { mkdtempSync, mkdirSync, writeFileSync } from 'fs';\nimport { createWatcher } from '../src/utils/watcher.js';\nimport { CodegenContext } from '../src/config.js';\n\n/**\n * waitForNextEvent\n * @description This function waits for a short amount of time to let async things run\n * e.g. watcher subscription setup, watcher to react to change/create events, etc.\n */\nconst waitForNextEvent = async () => {\n  return await new Promise(resolve => setTimeout(resolve, 500));\n};\n\ntype TestFilePaths = { absolute: string; relative: string };\nconst setupTestFiles = (): { testDir: string; schemaFile: TestFilePaths; documentFile: TestFilePaths } => {\n  const tempDir = path.join(__dirname, '..', 'temp');\n  mkdirSync(tempDir, { recursive: true });\n\n  const testDir = mkdtempSync(path.join(tempDir, 'watcher-run-spec-'));\n\n  const schemaFileAbsolute = path.join(testDir, 'schema.graphql');\n  const schemaFile = {\n    absolute: schemaFileAbsolute,\n    relative: path.relative(process.cwd(), schemaFileAbsolute),\n  };\n\n  const documentFileAbsolute = path.join(testDir, 'document.graphql');\n  const documentFile = {\n    absolute: documentFileAbsolute,\n    relative: path.relative(process.cwd(), documentFileAbsolute),\n  };\n\n  return {\n    testDir,\n    schemaFile,\n    documentFile,\n  };\n};\n\nconst onNextMock = vi.fn();\n\nconst setupMockWatcher = async (\n  codegenContext: ConstructorParameters<typeof CodegenContext>[0],\n  onNext: Mock = vi.fn().mockResolvedValue([])\n) => {\n  const { stopWatching } = createWatcher(new CodegenContext(codegenContext), onNext);\n  // After creating watcher, wait for a tick for subscription to be completely set up\n  await waitForNextEvent();\n  return { stopWatching };\n};\n\ndescribe('Watch runs', () => {\n  test('calls onNext correctly on initial runs and subsequent runs', async () => {\n    const { testDir, schemaFile, documentFile } = setupTestFiles();\n    writeFileSync(\n      schemaFile.absolute,\n      /* GraphQL */ `\n        type Query {\n          me: User\n        }\n\n        type User {\n          id: ID!\n          name: String!\n        }\n      `\n    );\n    writeFileSync(\n      documentFile.absolute,\n      /* GraphQL */ `\n        query {\n          me {\n            id\n          }\n        }\n      `\n    );\n    await waitForNextEvent();\n    const { stopWatching } = await setupMockWatcher(\n      {\n        filepath: path.join(testDir, 'codegen.ts'),\n        config: {\n          schema: schemaFile.relative,\n          documents: documentFile.relative,\n          generates: {\n            [path.join(testDir, 'types.ts')]: {\n              plugins: ['typescript'],\n            },\n          },\n        },\n      },\n      onNextMock\n    );\n\n    // 1. Initial setup: onNext in initial run should be called because no errors\n    expect(onNextMock).toHaveBeenCalledTimes(1);\n\n    // 2. Subsequent run 1: correct document file, so `onNext` is called again because no errors\n    writeFileSync(\n      documentFile.absolute,\n      /* GraphQL */ `\n        query {\n          me {\n            id\n            name\n          }\n        }\n      `\n    );\n    await waitForNextEvent();\n    expect(onNextMock).toHaveBeenCalledTimes(2);\n\n    // 3. Subsequent run 2: incorrect document file, so `onNext` is NOT called\n    writeFileSync(\n      documentFile.absolute,\n      /* GraphQL */ `\n        query {\n          me {\n            id\n            name\n            zzzz # should throw error\n          }\n        }\n      `\n    );\n    await waitForNextEvent();\n    expect(onNextMock).toHaveBeenCalledTimes(2);\n\n    await stopWatching();\n\n    await waitForNextEvent();\n  });\n});\n"
  },
  {
    "path": "packages/graphql-codegen-cli/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'cli',\n      setupFiles: './vitest.setup.ts',\n      include: ['**/*.spec.ts'],\n      server: {\n        deps: {\n          inline: [\n            // `@graphql-tools/url-loader` needs to be inlined\n            // because there is a test that triggers dynamically importing `some-fetch` mocked package\n            // Without this, `@graphql-tools/url-loader` acts outside of Vitest mocking\n            // i.e. does not know about the `some-fetch` mocked package\n            '@graphql-tools/url-loader',\n          ],\n        },\n      },\n    },\n  })\n);\n"
  },
  {
    "path": "packages/graphql-codegen-cli/vitest.setup.ts",
    "content": "import { vi } from 'vitest';\n\nprocess.env.NO_COLOR = '1'; // When running listr2 tests in generate-and-save.spec.ts, do not add colors to avoid failure in CI as different OS may treat colours differently\nvi.spyOn(process, 'cwd').mockImplementation(() => __dirname);\nvi.mock('some-fetch', () => require('./tests/__mocks__/some-fetch.cjs'));\n"
  },
  {
    "path": "packages/graphql-codegen-core/CHANGELOG.md",
    "content": "# @graphql-codegen/core\n\n## 5.0.1\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^11.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/11.0.0) (from `^10.0.0`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/plugin-helpers@6.1.1\n\n## 5.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/plugin-helpers@6.0.0\n\n## 4.0.2\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 4.0.1\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n\n## 4.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Patch Changes\n\n- [#9449](https://github.com/dotansimha/graphql-code-generator/pull/9449) [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/schema@^10.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/10.0.0) (from `^9.0.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/utils@^10.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.0.0) (from `^9.1.1`, in `dependencies`)\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n\n## 3.1.0\n\n### Minor Changes\n\n- [#8723](https://github.com/dotansimha/graphql-code-generator/pull/8723) [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15) Thanks [@kazekyo](https://github.com/kazekyo)! - Introduce a new feature called DocumentTransform.\n\n  DocumentTransform is a functionality that allows you to modify `documents` before they are processed by plugins. You can use functions passed to the `documentTransforms` option to make changes to GraphQL documents.\n\n  To use this feature, you can write `documentTransforms` as follows:\n\n  ```ts\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: [\n          {\n            transform: ({ documents }) => {\n              // Make some changes to the documents\n              return documents\n            }\n          }\n        ]\n      }\n    }\n  }\n  export default config\n  ```\n\n  For instance, to remove a `@localOnlyDirective` directive from `documents`, you can write the following code:\n\n  ```js\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n  import { visit } from 'graphql'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: [\n          {\n            transform: ({ documents }) => {\n              return documents.map(documentFile => {\n                documentFile.document = visit(documentFile.document, {\n                  Directive: {\n                    leave(node) {\n                      if (node.name.value === 'localOnlyDirective') return null\n                    }\n                  }\n                })\n                return documentFile\n              })\n            }\n          }\n        ]\n      }\n    }\n  }\n  export default config\n  ```\n\n  DocumentTransform can also be specified by file name. You can create a custom file for a specific transformation and pass it to `documentTransforms`.\n\n  Let's create the document transform as a file:\n\n  ```js\n  module.exports = {\n    transform: ({ documents }) => {\n      // Make some changes to the documents\n      return documents\n    }\n  }\n  ```\n\n  Then, you can specify the file name as follows:\n\n  ```ts\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: ['./my-document-transform.js']\n      }\n    }\n  }\n  export default config\n  ```\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n\n## 3.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- [#8871](https://github.com/dotansimha/graphql-code-generator/pull/8871) [`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5) Thanks [@B2o5T](https://github.com/B2o5T)! - eslint fixes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 2.6.8\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n\n## 2.6.7\n\n### Patch Changes\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n\n## 2.6.6\n\n### Patch Changes\n\n- [#8606](https://github.com/dotansimha/graphql-code-generator/pull/8606) [`45eb2b18a`](https://github.com/dotansimha/graphql-code-generator/commit/45eb2b18adf25366248bf8d67ef696431db5ee0e) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n\n  - Updated dependency [`@graphql-tools/utils@^9.1.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/9.1.1) (from `9.0.0`, in `dependencies`)\n\n- [#8606](https://github.com/dotansimha/graphql-code-generator/pull/8606) [`45eb2b18a`](https://github.com/dotansimha/graphql-code-generator/commit/45eb2b18adf25366248bf8d67ef696431db5ee0e) Thanks [@charlypoly](https://github.com/charlypoly)! - Fix validation issue on fragment/ops naming conflict\n\n## 2.6.5\n\n### Patch Changes\n\n- [#8556](https://github.com/dotansimha/graphql-code-generator/pull/8556) [`64e553c3f`](https://github.com/dotansimha/graphql-code-generator/commit/64e553c3f62618a2aedf122d292e2700fd93d6e1) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/9.0.0) (from `^8.8.0`, in `dependencies`)\n\n## 2.6.4\n\n### Patch Changes\n\n- [#8548](https://github.com/dotansimha/graphql-code-generator/pull/8548) [`516170ef6`](https://github.com/dotansimha/graphql-code-generator/commit/516170ef6cb636c950d560ddf12fa1d2f7ee1c57) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n\n  - Updated dependency [`@graphql-tools/utils@9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/9.0.0) (from `^8.8.0`, in `dependencies`)\n\n- [#8548](https://github.com/dotansimha/graphql-code-generator/pull/8548) [`516170ef6`](https://github.com/dotansimha/graphql-code-generator/commit/516170ef6cb636c950d560ddf12fa1d2f7ee1c57) Thanks [@charlypoly](https://github.com/charlypoly)! - Improve codegen documents and schema validation\n\n## 2.6.3\n\n### Patch Changes\n\n- [#8525](https://github.com/dotansimha/graphql-code-generator/pull/8525) [`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127) Thanks [@charlypoly](https://github.com/charlypoly)! - remove `DetailledError`, not supported by Listr renderer\n\n- Updated dependencies [[`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127)]:\n  - @graphql-codegen/plugin-helpers@2.7.2\n\n## 2.6.2\n\n### Patch Changes\n\n- [#8207](https://github.com/dotansimha/graphql-code-generator/pull/8207) [`6c7d3e54b`](https://github.com/dotansimha/graphql-code-generator/commit/6c7d3e54bb3cb53d8bbbd25e31c45b66f29f4640) Thanks [@renovate](https://github.com/apps/renovate)! - ### Dependencies Updates\n\n  - Updated dependency ([`@graphql-tools/schema@^9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/schema/v/^9.0.0)) (was `^8.5.0`, in `dependencies`)\n\n## 2.6.1\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f)]:\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 2.6.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 2.5.1\n\n### Patch Changes\n\n- cb9adeb96: Cache validation of documents\n- Updated dependencies [cb9adeb96]\n  - @graphql-codegen/plugin-helpers@2.4.1\n\n## 2.5.0\n\n### Minor Changes\n\n- 754a33715: Performance Profiler --profile\n\n### Patch Changes\n\n- Updated dependencies [754a33715]\n  - @graphql-codegen/plugin-helpers@2.4.0\n\n## 2.4.0\n\n### Minor Changes\n\n- b61dc57cf: feat(core): add graphql@16 in peer dependencies\n\n### Patch Changes\n\n- 8643b3bf3: Add GraphQL 16 as a peerDependency\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 2.3.0\n\n### Minor Changes\n\n- 97ddb487a: feat: GraphQL v16 compatibility\n\n### Patch Changes\n\n- Updated dependencies [97ddb487a]\n  - @graphql-codegen/plugin-helpers@2.3.0\n\n## 2.2.0\n\n### Minor Changes\n\n- 7c60e5acc: feat(core): ability to skip some specific validation rules with skipDocumentsValidation option\n\n### Patch Changes\n\n- Updated dependencies [7c60e5acc]\n  - @graphql-codegen/plugin-helpers@2.2.0\n\n## 2.1.0\n\n### Minor Changes\n\n- 39773f59b: enhance(plugins): use getDocumentNodeFromSchema and other utilities from @graphql-tools/utils\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- 24185985a: bump graphql-tools package versions\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 2.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- d80efdec4: Removed `typescript-compatiblity` since it's no longer maintained. Please migrate your codebase to use the latest output of codegen.\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 1.17.10\n\n### Patch Changes\n\n- dfd25caf: chore(deps): bump graphql-tools versions\n- Updated dependencies [dfd25caf]\n  - @graphql-codegen/plugin-helpers@1.18.7\n\n## 1.17.9\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 1.17.8\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- ac067ea0: Filter `prepend` and `append` coming from plugins, make sure not to add empty lines when not needed\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n  - @graphql-codegen/plugin-helpers@1.17.8\n"
  },
  {
    "path": "packages/graphql-codegen-core/README.md",
    "content": "# GraphQL Code Generator\n\n<p align=\"center\">\n    <img src=\"https://github.com/dotansimha/graphql-code-generator/blob/master/logo.png?raw=true\" />\n</p>\n\nLive demo and full documentation: [the-guild.dev/graphql/codegen](https://the-guild.dev/graphql/codegen)\n\nProject repository: [graphql-code-generator](https://github.com/dotansimha/graphql-code-generator)\n"
  },
  {
    "path": "packages/graphql-codegen-core/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/core\",\n  \"version\": \"5.0.1\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/graphql-codegen-core\"\n  },\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"keywords\": [\n    \"gql\",\n    \"generator\",\n    \"code\",\n    \"types\",\n    \"interfaces\",\n    \"graphql\",\n    \"codegen\",\n    \"apollo\",\n    \"node\",\n    \"typescript\",\n    \"ts\",\n    \"flow\",\n    \"types\",\n    \"d.ts\",\n    \"typings\"\n  ],\n  \"author\": \"Dotan Simha <dotansimha@gmail.com>\",\n  \"bugs\": {\n    \"url\": \"https://github.com/dotansimha/graphql-codegen/issues\"\n  },\n  \"homepage\": \"https://github.com/dotansimha/graphql-codegen#readme\",\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"^6.1.1\",\n    \"@graphql-tools/schema\": \"^10.0.0\",\n    \"@graphql-tools/utils\": \"^11.0.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-core/src/codegen.ts",
    "content": "import {\n  AddToSchemaResult,\n  createNoopProfiler,\n  federationSpec,\n  getCachedDocumentNodeFromSchema,\n  isComplexPluginOutput,\n  Types,\n} from '@graphql-codegen/plugin-helpers';\nimport { mergeSchemas } from '@graphql-tools/schema';\nimport { asArray, Source, validateGraphQlDocuments } from '@graphql-tools/utils';\nimport { DefinitionNode, DocumentNode, Kind, NameNode, print, specifiedRules, visit } from 'graphql';\nimport { executePlugin } from './execute-plugin.js';\nimport {\n  extractHashFromSchema,\n  getSkipDocumentsValidationOption,\n  hasFederationSpec,\n  pickFlag,\n  prioritize,\n  shouldValidateDocumentsAgainstSchema,\n  shouldValidateDuplicateDocuments,\n} from './utils.js';\nimport { transformDocuments } from './transform-document.js';\n\nexport async function codegen(options: Types.GenerateOptions): Promise<string> {\n  const documents = options.documents || [];\n  const profiler = options.profiler ?? createNoopProfiler();\n\n  const skipDocumentsValidation = getSkipDocumentsValidationOption(options);\n\n  if (documents.length > 0 && shouldValidateDuplicateDocuments(skipDocumentsValidation)) {\n    await profiler.run(async () => validateDuplicateDocuments(documents), 'validateDuplicateDocuments');\n  }\n\n  const pluginPackages = Object.keys(options.pluginMap).map(key => options.pluginMap[key]);\n\n  // merged schema with parts added by plugins\n  const additionalTypeDefs: AddToSchemaResult[] = [];\n  for (const plugin of pluginPackages) {\n    const addToSchema =\n      typeof plugin.addToSchema === 'function' ? plugin.addToSchema(options.config) : plugin.addToSchema;\n\n    if (addToSchema) {\n      additionalTypeDefs.push(addToSchema);\n    }\n  }\n\n  const federationInConfig: boolean = pickFlag('federation', options.config);\n  const isFederation = prioritize(federationInConfig, false);\n\n  if (isFederation && !hasFederationSpec(options.schemaAst || options.schema)) {\n    additionalTypeDefs.push(federationSpec);\n  }\n\n  // Use mergeSchemas, only if there is no GraphQLSchema provided or the schema should be extended\n  const mergeNeeded = !options.schemaAst || additionalTypeDefs.length > 0;\n\n  const schemaInstance = await profiler.run(async () => {\n    return mergeNeeded\n      ? mergeSchemas({\n          // If GraphQLSchema provided, use it\n          schemas: options.schemaAst ? [options.schemaAst] : [],\n          // If GraphQLSchema isn't provided but DocumentNode is, use it to get the final GraphQLSchema\n          typeDefs: options.schemaAst ? additionalTypeDefs : [options.schema, ...additionalTypeDefs],\n          convertExtensions: true,\n          assumeValid: true,\n          assumeValidSDL: true,\n          ...options.config,\n        } as any)\n      : options.schemaAst;\n  }, 'Create schema instance');\n\n  const schemaDocumentNode =\n    mergeNeeded || !options.schema ? getCachedDocumentNodeFromSchema(schemaInstance) : options.schema;\n\n  const documentTransforms = Array.isArray(options.documentTransforms) ? options.documentTransforms : [];\n  const transformedDocuments = await transformDocuments({\n    ...options,\n    documentTransforms,\n    schema: schemaDocumentNode,\n    schemaAst: schemaInstance,\n    profiler,\n  });\n\n  if (\n    schemaInstance &&\n    transformedDocuments.length > 0 &&\n    shouldValidateDocumentsAgainstSchema(skipDocumentsValidation)\n  ) {\n    const ignored = ['NoUnusedFragments', 'NoUnusedVariables', 'KnownDirectives'];\n    if (typeof skipDocumentsValidation === 'object' && skipDocumentsValidation.ignoreRules) {\n      ignored.push(...asArray(skipDocumentsValidation.ignoreRules));\n    }\n    const extraFragments: { importFrom: string; node: DefinitionNode }[] =\n      pickFlag('externalFragments', options.config) || [];\n\n    const errors = await profiler.run(() => {\n      const fragments = extraFragments.map(f => ({\n        location: f.importFrom,\n        document: { kind: Kind.DOCUMENT, definitions: [f.node] } as DocumentNode,\n      }));\n      const rules = specifiedRules.filter(rule => !ignored.some(ignoredRule => rule.name.startsWith(ignoredRule)));\n      const schemaHash = extractHashFromSchema(schemaInstance);\n\n      if (!schemaHash || !options.cache || transformedDocuments.some(d => typeof d.hash !== 'string')) {\n        return Promise.resolve(\n          validateGraphQlDocuments(\n            schemaInstance,\n            [...transformedDocuments.flatMap(d => d.document), ...fragments.flatMap(f => f.document)],\n            rules\n          )\n        );\n      }\n\n      const cacheKey = [schemaHash]\n        .concat(transformedDocuments.map(doc => doc.hash))\n        .concat(JSON.stringify(fragments))\n        .join(',');\n\n      return options.cache('documents-validation', cacheKey, () =>\n        Promise.resolve(\n          validateGraphQlDocuments(\n            schemaInstance,\n            [...transformedDocuments.flatMap(d => d.document), ...fragments.flatMap(f => f.document)],\n            rules\n          )\n        )\n      );\n    }, 'Validate documents against schema');\n\n    if (errors.length > 0) {\n      throw new Error(\n        `GraphQL Document Validation failed with ${errors.length} errors;\n  ${errors.map((error, index) => `Error ${index}: ${error.stack}`).join('\\n\\n')}`\n      );\n    }\n  }\n\n  const prepend: Set<string> = new Set<string>();\n  const append: Set<string> = new Set<string>();\n\n  const output = await Promise.all(\n    options.plugins.map(async plugin => {\n      const name = Object.keys(plugin)[0];\n      const pluginPackage = options.pluginMap[name];\n      const pluginConfig = plugin[name] || {};\n\n      const execConfig = typeof pluginConfig === 'object' ? { ...options.config, ...pluginConfig } : pluginConfig;\n\n      const result = await profiler.run(\n        () =>\n          executePlugin(\n            {\n              name,\n              config: execConfig,\n              parentConfig: options.config,\n              schema: schemaDocumentNode,\n              schemaAst: schemaInstance,\n              documents: transformedDocuments,\n              outputFilename: options.filename,\n              allPlugins: options.plugins,\n              skipDocumentsValidation: options.skipDocumentsValidation,\n              pluginContext: options.pluginContext,\n              profiler,\n            },\n            pluginPackage\n          ),\n        `Plugin ${name}`\n      );\n\n      if (typeof result === 'string') {\n        return result || '';\n      }\n      if (isComplexPluginOutput(result)) {\n        if (result.append && result.append.length > 0) {\n          for (const item of result.append) {\n            if (item) {\n              append.add(item);\n            }\n          }\n        }\n\n        if (result.prepend && result.prepend.length > 0) {\n          for (const item of result.prepend) {\n            if (item) {\n              prepend.add(item);\n            }\n          }\n        }\n        return result.content || '';\n      }\n\n      return '';\n    })\n  );\n\n  return [...sortPrependValues(Array.from(prepend.values())), ...output, ...Array.from(append.values())]\n    .filter(Boolean)\n    .join('\\n');\n}\n\nfunction resolveCompareValue(a: string) {\n  if (a.startsWith('/*') || a.startsWith('//') || a.startsWith(' *') || a.startsWith(' */') || a.startsWith('*/')) {\n    return 0;\n  }\n  if (a.startsWith('package')) {\n    return 1;\n  }\n  if (a.startsWith('import')) {\n    return 2;\n  }\n  return 3;\n}\n\nexport function sortPrependValues(values: string[]): string[] {\n  return values.sort((a: string, b: string) => {\n    const aV = resolveCompareValue(a);\n    const bV = resolveCompareValue(b);\n\n    if (aV < bV) {\n      return -1;\n    }\n    if (aV > bV) {\n      return 1;\n    }\n\n    return 0;\n  });\n}\n\nfunction validateDuplicateDocuments(files: Types.DocumentFile[]) {\n  // duplicated names\n  const definitionMap: {\n    [kind: string]: {\n      [name: string]: {\n        paths: Set<string>;\n        contents: Set<string>;\n      };\n    };\n  } = {};\n\n  function addDefinition(\n    file: Source,\n    node: DefinitionNode & { name?: NameNode },\n    deduplicatedDefinitions: Set<DefinitionNode>\n  ) {\n    if (typeof node.name !== 'undefined') {\n      definitionMap[node.kind] ||= {};\n      definitionMap[node.kind][node.name.value] ||= {\n        paths: new Set(),\n        contents: new Set(),\n      };\n\n      const definitionKindMap = definitionMap[node.kind];\n\n      const length = definitionKindMap[node.name.value].contents.size;\n      definitionKindMap[node.name.value].paths.add(file.location);\n      definitionKindMap[node.name.value].contents.add(print(node));\n      if (length === definitionKindMap[node.name.value].contents.size) {\n        return null;\n      }\n    }\n    return deduplicatedDefinitions.add(node);\n  }\n\n  for (const file of files) {\n    const deduplicatedDefinitions = new Set<DefinitionNode>();\n    visit(file.document, {\n      OperationDefinition(node) {\n        addDefinition(file, node, deduplicatedDefinitions);\n      },\n      FragmentDefinition(node) {\n        addDefinition(file, node, deduplicatedDefinitions);\n      },\n    });\n    (file.document as any).definitions = Array.from(deduplicatedDefinitions);\n  }\n\n  const kinds = Object.keys(definitionMap);\n\n  for (const kind of kinds) {\n    const definitionKindMap = definitionMap[kind];\n    const names = Object.keys(definitionKindMap);\n    if (names.length) {\n      const duplicated = names.filter(name => definitionKindMap[name].contents.size > 1);\n\n      if (!duplicated.length) {\n        continue;\n      }\n\n      const list = duplicated\n        .map(name =>\n          `\n        * ${name} found in:\n          ${[...definitionKindMap[name].paths]\n            .map(filepath => {\n              return `\n              - ${filepath}\n            `.trimEnd();\n            })\n            .join('')}\n    `.trimEnd()\n        )\n        .join('');\n\n      const definitionKindName = kind.replace('Definition', '').toLowerCase();\n      throw new Error(\n        `Not all ${definitionKindName}s have an unique name: ${duplicated.join(', ')}: \\n\n          ${list}\n        `\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "packages/graphql-codegen-core/src/execute-plugin.ts",
    "content": "import { CodegenPlugin, createNoopProfiler, Profiler, Types } from '@graphql-codegen/plugin-helpers';\nimport { buildASTSchema, DocumentNode, GraphQLSchema } from 'graphql';\n\nexport interface ExecutePluginOptions {\n  name: string;\n  config: Types.PluginConfig;\n  parentConfig: Types.PluginConfig;\n  schema: DocumentNode;\n  schemaAst?: GraphQLSchema;\n  documents: Types.DocumentFile[];\n  outputFilename: string;\n  allPlugins: Types.ConfiguredPlugin[];\n  skipDocumentsValidation?: Types.SkipDocumentsValidationOptions;\n  pluginContext?: { [key: string]: any };\n  profiler?: Profiler;\n}\n\nexport async function executePlugin(options: ExecutePluginOptions, plugin: CodegenPlugin): Promise<Types.PluginOutput> {\n  if (!plugin?.plugin || typeof plugin.plugin !== 'function') {\n    throw new Error(\n      `Invalid Custom Plugin \"${options.name}\" \\n\n        Plugin ${options.name} does not export a valid JS object with \"plugin\" function.\n\n        Make sure your custom plugin is written in the following form:\n\n        module.exports = {\n          plugin: (schema, documents, config) => {\n            return 'my-custom-plugin-content';\n          },\n        };\n        `\n    );\n  }\n\n  const outputSchema: GraphQLSchema = options.schemaAst || buildASTSchema(options.schema, options.config as any);\n  const documents = options.documents || [];\n  const pluginContext = options.pluginContext || {};\n  const profiler = options.profiler ?? createNoopProfiler();\n\n  if (plugin.validate && typeof plugin.validate === 'function') {\n    try {\n      // FIXME: Sync validate signature with plugin signature\n      await profiler.run(\n        async () =>\n          plugin.validate(\n            outputSchema,\n            documents,\n            options.config,\n            options.outputFilename,\n            options.allPlugins,\n            pluginContext\n          ),\n        `Plugin ${options.name} validate`\n      );\n    } catch (e) {\n      throw new Error(\n        `Plugin \"${options.name}\" validation failed: \\n\n            ${e.message}\n          `\n      );\n    }\n  }\n\n  return profiler.run(\n    () =>\n      Promise.resolve(\n        plugin.plugin(\n          outputSchema,\n          documents,\n          typeof options.config === 'object' ? { ...options.config } : options.config,\n          {\n            outputFile: options.outputFilename,\n            allPlugins: options.allPlugins,\n            pluginContext,\n          }\n        )\n      ),\n    `Plugin ${options.name} execution`\n  );\n}\n"
  },
  {
    "path": "packages/graphql-codegen-core/src/index.ts",
    "content": "export { codegen } from './codegen.js';\nexport { executePlugin, ExecutePluginOptions } from './execute-plugin.js';\n"
  },
  {
    "path": "packages/graphql-codegen-core/src/transform-document.ts",
    "content": "import { createNoopProfiler, Types } from '@graphql-codegen/plugin-helpers';\n\nexport async function transformDocuments(options: Types.GenerateOptions): Promise<Types.DocumentFile[]> {\n  const documentTransforms = options.documentTransforms || [];\n  let documents = options.documents;\n  if (documentTransforms.length === 0 || options.documents.length === 0) {\n    return documents;\n  }\n\n  const profiler = options.profiler ?? createNoopProfiler();\n\n  for (const documentTransform of documentTransforms) {\n    const config =\n      typeof documentTransform.config === 'object'\n        ? {\n            ...options.config,\n            ...documentTransform.config,\n          }\n        : {};\n    const { transform } = documentTransform.transformObject;\n    if (transform && typeof transform === 'function') {\n      const name = documentTransform.name;\n      try {\n        await profiler.run(async () => {\n          documents = await transform({\n            documents,\n            schema: options.schema,\n            config,\n            pluginContext: options.pluginContext,\n          });\n        }, `DocumentTransform \"${name}\" execution`);\n      } catch (e) {\n        throw new Error(\n          `DocumentTransform \"${name}\" failed: \\n\n            ${e.message}\n          `\n        );\n      }\n    } else {\n      throw new Error(`Missing 'transform' function in \"${documentTransform.name}\"`);\n    }\n  }\n\n  return documents;\n}\n"
  },
  {
    "path": "packages/graphql-codegen-core/src/utils.ts",
    "content": "import { Types } from '@graphql-codegen/plugin-helpers';\nimport { isDocumentNode } from '@graphql-tools/utils';\nimport { DocumentNode, GraphQLSchema, isSchema, Kind } from 'graphql';\n\nexport function isObjectMap(obj: any): obj is Types.PluginConfig<any> {\n  return obj && typeof obj === 'object' && !Array.isArray(obj);\n}\n\nexport function prioritize<T>(...values: T[]): T {\n  const picked = values.find(val => typeof val === 'boolean');\n\n  if (typeof picked !== 'boolean') {\n    return values[values.length - 1];\n  }\n\n  return picked;\n}\n\nexport function pickFlag<TConfig, TKey extends keyof TConfig>(flag: TKey, config: TConfig): TConfig[TKey] | undefined {\n  return isObjectMap(config) ? config[flag] : undefined;\n}\n\nexport function shouldValidateDuplicateDocuments(\n  skipDocumentsValidationOption: Types.GenerateOptions['skipDocumentsValidation']\n) {\n  // If the value is true, skip all\n  if (skipDocumentsValidationOption === true) {\n    return false;\n  }\n  // If the value is object with the specific flag, only skip this one\n  if (typeof skipDocumentsValidationOption === 'object' && skipDocumentsValidationOption.skipDuplicateValidation) {\n    return false;\n  }\n  // If the value is falsy or the specific flag is not set, validate\n  return true;\n}\n\nexport function shouldValidateDocumentsAgainstSchema(\n  skipDocumentsValidationOption: Types.GenerateOptions['skipDocumentsValidation']\n) {\n  // If the value is true, skip all\n  if (skipDocumentsValidationOption === true) {\n    return false;\n  }\n  // If the value is object with the specific flag, only skip this one\n  if (typeof skipDocumentsValidationOption === 'object' && skipDocumentsValidationOption.skipValidationAgainstSchema) {\n    return false;\n  }\n  // If the value is falsy or the specific flag is not set, validate\n  return true;\n}\n\nexport function getSkipDocumentsValidationOption(options: Types.GenerateOptions): Types.SkipDocumentsValidationOptions {\n  // If the value is set on the root level\n  if (options.skipDocumentsValidation) {\n    return options.skipDocumentsValidation;\n  }\n  // If the value is set under `config` property\n  const flagFromConfig: Types.SkipDocumentsValidationOptions = pickFlag('skipDocumentsValidation', options.config);\n  if (flagFromConfig) {\n    return flagFromConfig;\n  }\n  return false;\n}\n\nconst federationDirectives = ['key', 'requires', 'provides', 'external'];\n\nexport function hasFederationSpec(schemaOrAST: GraphQLSchema | DocumentNode) {\n  if (isSchema(schemaOrAST)) {\n    return federationDirectives.some(directive => schemaOrAST.getDirective(directive));\n  }\n  if (isDocumentNode(schemaOrAST)) {\n    return schemaOrAST.definitions.some(\n      def => def.kind === Kind.DIRECTIVE_DEFINITION && federationDirectives.includes(def.name.value)\n    );\n  }\n  return false;\n}\n\nexport function extractHashFromSchema(schema: GraphQLSchema): string | null {\n  schema.extensions ||= {};\n\n  return (schema.extensions['hash'] as string) ?? null;\n}\n"
  },
  {
    "path": "packages/graphql-codegen-core/tests/prepend.spec.ts",
    "content": "import { sortPrependValues } from '../src/codegen.js';\n\ndescribe('sortPrependValues', () => {\n  it('Should sort and use the correct order', () => {\n    const strings: string[] = [`import `, '/* comment */', `// This is a comment`];\n\n    const sorted = sortPrependValues(strings);\n\n    expect(sorted).toEqual(['/* comment */', `// This is a comment`, `import `]);\n  });\n});\n"
  },
  {
    "path": "packages/graphql-codegen-core/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'core',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/plugins/other/add/CHANGELOG.md",
    "content": "# @graphql-codegen/add\n\n## 6.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/plugin-helpers@6.0.0\n\n## 5.0.3\n\n### Patch Changes\n\n- [#9987](https://github.com/dotansimha/graphql-code-generator/pull/9987) [`5501c62`](https://github.com/dotansimha/graphql-code-generator/commit/5501c621f19eb5ef8e703a21f7367e07e41f199c) Thanks [@taro-28](https://github.com/taro-28)! - Export configuration types (e.g. `AddPluginConfig`) from the entry point.\n\n  ```ts\n  import type { AddPluginConfig } from '@graphql-codegen/add'\n  ```\n\n## 5.0.2\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 5.0.1\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n\n## 5.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Patch Changes\n\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n\n## 4.0.1\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n\n## 4.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 3.2.3\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n\n## 3.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n\n## 3.2.1\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f)]:\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 3.2.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 3.1.1\n\n### Patch Changes\n\n- 8643b3bf3: Add GraphQL 16 as a peerDependency\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 3.1.0\n\n### Minor Changes\n\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 3.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 2.0.2\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 2.0.1\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- ac067ea0: Fix for empty lines added by add plugin\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n  - @graphql-codegen/plugin-helpers@1.17.8\n\n## 2.0.0\n\n### Major Changes\n\n- bc6e5c08: Update plugin configuration API to use object only (`string` is no longer supported)\n\n  ## Migration Notes\n\n  #### Before\n\n  ```yaml\n  plugins:\n    - add: 'some string'\n  ```\n\n  #### After\n\n  ```yaml\n  plugins:\n    - add:\n        content: 'some string'\n  ```\n"
  },
  {
    "path": "packages/plugins/other/add/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/add\",\n  \"version\": \"6.0.0\",\n  \"description\": \"GraphQL Code Generator plugin for adding custom content to your output file\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/plugins/other/add\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"^6.0.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/add/src/config.ts",
    "content": "export interface AddPluginConfig {\n  /**\n   * @default prepend\n   * @description Allow you to choose where to add the content.\n   */\n  placement?: 'prepend' | 'content' | 'append';\n  /**\n   * @description The actual content you wish to add, either a string or array of strings.\n   * You can also specify a path to a local file and the content if it will be loaded by codegen.\n   */\n  content: string | string[];\n}\n\nexport const VALID_PLACEMENTS: AddPluginConfig['placement'][] = ['prepend', 'content', 'append'];\n"
  },
  {
    "path": "packages/plugins/other/add/src/index.ts",
    "content": "import { PluginFunction, Types } from '@graphql-codegen/plugin-helpers';\nimport { GraphQLSchema } from 'graphql';\nimport { AddPluginConfig, VALID_PLACEMENTS } from './config.js';\n\nexport * from './config.js';\n\nexport const plugin: PluginFunction<AddPluginConfig> = async (\n  schema: GraphQLSchema,\n  documents: Types.DocumentFile[],\n  config: AddPluginConfig\n): Promise<Types.PluginOutput> => {\n  const placement: AddPluginConfig['placement'] = config.placement || 'prepend';\n  const { content } = config;\n\n  if (!VALID_PLACEMENTS.includes(placement)) {\n    throw Error(\n      `Configuration provided for 'add' plugin is invalid: value of 'placement' field is not valid (valid values are: ${VALID_PLACEMENTS.join(\n        ', '\n      )})`\n    );\n  }\n\n  if (!content) {\n    throw Error(`Configuration provided for 'add' plugin is invalid: \"content\" is missing!`);\n  }\n\n  return {\n    content: null,\n    [placement]: Array.isArray(content) ? content : [content],\n  };\n};\n\nexport default { plugin };\n"
  },
  {
    "path": "packages/plugins/other/add/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'add',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/plugins/other/fragment-matcher/CHANGELOG.md",
    "content": "# @graphql-codegen/fragment-matcher\n\n## 6.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/plugin-helpers@6.0.0\n\n## 5.1.0\n\n### Minor Changes\n\n- [#10214](https://github.com/dotansimha/graphql-code-generator/pull/10214) [`81b20f5`](https://github.com/dotansimha/graphql-code-generator/commit/81b20f5ab35bf73e7797580ba22c910aecdeddbd) Thanks [@tgandrews](https://github.com/tgandrews)! - Add new flag to make the fragment matcher results deterministic\n\n## 5.0.2\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 5.0.1\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n\n## 5.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Patch Changes\n\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n\n## 4.0.1\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n\n## 4.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 3.3.3\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n\n## 3.3.2\n\n### Patch Changes\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n\n## 3.3.1\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f)]:\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 3.3.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 3.2.1\n\n### Patch Changes\n\n- 8643b3bf3: Add GraphQL 16 as a peerDependency\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 3.2.0\n\n### Minor Changes\n\n- 97ddb487a: feat: GraphQL v16 compatibility\n\n### Patch Changes\n\n- Updated dependencies [97ddb487a]\n  - @graphql-codegen/plugin-helpers@2.3.0\n\n## 3.1.0\n\n### Minor Changes\n\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 3.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 2.0.1\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 2.0.0\n\n### Major Changes\n\n- 5e792ff3: **BREAKING CHANGE:** Change the default Apollo-Client version to be \"3\".\n\n  If you are upgrading from v1 of this plugin, and you are using apollo-client v2, please make sure to add to your config:\n\n  ```yaml\n  apolloClientVersion: 2\n  ```\n\n## 1.17.8\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n  - @graphql-codegen/plugin-helpers@1.17.8\n"
  },
  {
    "path": "packages/plugins/other/fragment-matcher/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/fragment-matcher\",\n  \"version\": \"6.0.0\",\n  \"description\": \"graphql-code-generate plugin for generating fragments matcher introspection file\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/plugins/other/fragment-matcher\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"^6.0.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/fragment-matcher/src/index.ts",
    "content": "import { extname } from 'path';\nimport { PluginFunction, PluginValidateFn, removeFederation, Types } from '@graphql-codegen/plugin-helpers';\nimport { execute, GraphQLSchema, parse } from 'graphql';\n\ninterface IntrospectionResultData {\n  __schema: {\n    types: {\n      kind: string;\n      name: string;\n      possibleTypes:\n        | {\n            name: string;\n          }[]\n        | null;\n    }[];\n  };\n}\n\ninterface PossibleTypesResultData {\n  possibleTypes: {\n    [key: string]: string[];\n  };\n}\n\n/**\n * @description This plugin generates an introspection file but only with Interfaces and Unions, based on your GraphQLSchema.\n *\n * If you are using `apollo-client` and your schema contains `interface` or `union` declaration, it's recommended to use Apollo's Fragment Matcher and the result generated by the plugin.\n *\n * You can read more about it in [`apollo-client` documentation](https://apollographql.com/docs/react/data/fragments/#fragments-on-unions-and-interfaces).\n *\n * Fragment Matcher plugin accepts a TypeScript / JavaScript or a JSON file as an output _(`.ts, .tsx, .js, .jsx, .json`)_.\n *\n * Both in TypeScript and JavaScript a default export is being used.\n *\n * > The output is based on the output you choose for the output file name.\n */\nexport interface FragmentMatcherConfig {\n  /**\n   * @description Compatible only with JSON extension, allow you to choose the export type, either `module.exports` or `export default`. Allowed values are: `commonjs`, `es2015`.\n   * @default es2015\n   *\n   * @exampleMarkdown\n   * ```tsx {10} filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    schema: 'https://localhost:4000/graphql',\n   *    documents: ['src/**\\/*.tsx'],\n   *    generates: {\n   *      'path/to/file.json': {\n   *        plugins: ['fragment-matcher'],\n   *        config: {\n   *          module: 'commonjs',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  module?: 'commonjs' | 'es2015';\n  /**\n   * @description Compatible only with TS/TSX/JS/JSX extensions, allow you to generate output based on your Apollo Client version. Note: `3` also works for version 4.\n   * @default 3\n   *\n   * @exampleMarkdown\n   * ```tsx {10} filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    schema: 'https://localhost:4000/graphql',\n   *    documents: ['src/**\\/*.tsx'],\n   *    generates: {\n   *      'path/to/file.json': {\n   *        plugins: ['fragment-matcher'],\n   *        config: {\n   *          apolloClientVersion: 3,\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  apolloClientVersion?: 2 | 3;\n  /**\n   * @description Create an explicit type based on your schema. This can help IDEs autofill your fragment matcher. This is mostly useful if you do more with your fragment matcher than just pass it to an Apollo-Client.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```tsx {10} filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    schema: 'https://localhost:4000/graphql',\n   *    documents: ['src/**\\/*.tsx'],\n   *    generates: {\n   *      'path/to/file.json': {\n   *        plugins: ['fragment-matcher'],\n   *        config: {\n   *          useExplicitTyping: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  useExplicitTyping?: boolean;\n  federation?: boolean;\n  /**\n   * @description When enabled sorts the fragment types lexicographically. This is useful for deterministic output.\n   * @default false\n   */\n  deterministic?: boolean;\n}\n\nconst extensions = {\n  ts: ['.ts', '.tsx'],\n  js: ['.js', '.jsx'],\n  json: ['.json'],\n};\n\nexport const plugin: PluginFunction = async (\n  schema: GraphQLSchema,\n  _documents,\n  pluginConfig: FragmentMatcherConfig,\n  info\n): Promise<string> => {\n  const config: Required<FragmentMatcherConfig> = {\n    module: 'es2015',\n    federation: false,\n    apolloClientVersion: 3,\n    useExplicitTyping: false,\n    deterministic: false,\n    ...pluginConfig,\n  };\n\n  const apolloClientVersion = parseInt(config.apolloClientVersion as any);\n  const cleanSchema = config.federation ? removeFederation(schema) : schema;\n  const { useExplicitTyping } = config;\n\n  const introspection = (await execute({\n    schema: cleanSchema,\n    document: parse(`\n      {\n        __schema {\n          types {\n            kind\n            name\n            possibleTypes {\n              name\n            }\n          }\n        }\n      }\n    `),\n  })) as any;\n  const ext = extname(info.outputFile).toLowerCase();\n\n  if (!introspection.data) {\n    throw new Error(`Plugin \"fragment-matcher\" couldn't introspect the schema`);\n  }\n\n  const sortStringsLexicographically = (a: string, b: string) => {\n    if (!config.deterministic) {\n      return 0;\n    }\n    return a.localeCompare(b);\n  };\n\n  const unionAndInterfaceTypes = introspection.data.__schema.types\n    .filter(type => type.kind === 'UNION' || type.kind === 'INTERFACE')\n    .sort((a, b) => sortStringsLexicographically(a.name, b.name));\n\n  const createPossibleTypesCollection = (acc, type) => {\n    return {\n      ...acc,\n      [type.name]: type.possibleTypes.map(possibleType => possibleType.name).sort(sortStringsLexicographically),\n    };\n  };\n\n  const filteredData: IntrospectionResultData | PossibleTypesResultData =\n    apolloClientVersion === 2\n      ? {\n          __schema: {\n            ...introspection.data.__schema,\n            types: unionAndInterfaceTypes,\n          },\n        }\n      : {\n          possibleTypes: unionAndInterfaceTypes.reduce(createPossibleTypesCollection, {}),\n        };\n\n  const content = JSON.stringify(filteredData, null, 2);\n\n  if (extensions.json.includes(ext)) {\n    return content;\n  }\n\n  if (extensions.js.includes(ext)) {\n    const defaultExportStatement = config.module === 'es2015' ? `export default` : 'module.exports =';\n\n    return `\n      ${defaultExportStatement} ${content}\n    `;\n  }\n\n  if (extensions.ts.includes(ext)) {\n    let typename: string;\n    if (apolloClientVersion === 2) {\n      typename = `IntrospectionResultData`;\n    } else if (apolloClientVersion === 3) {\n      typename = `PossibleTypesResultData`;\n    }\n\n    let type: string;\n    if (useExplicitTyping) {\n      type = `export type ${typename} = ${content};`;\n    } else if (apolloClientVersion === 2) {\n      type = `export interface ${typename} {\n        __schema: {\n          types: {\n            kind: string;\n            name: string;\n            possibleTypes: {\n              name: string;\n            }[];\n          }[];\n        };\n      }`;\n    } else if (apolloClientVersion === 3) {\n      type = `export interface ${typename} {\n        possibleTypes: {\n          [key: string]: string[]\n        }\n      }`;\n    }\n\n    return `\n      ${type}\n      const result: ${typename} = ${content};\n      export default result;\n    `;\n  }\n\n  throw new Error(`Extension ${ext} is not supported`);\n};\n\nexport const validate: PluginValidateFn<any> = async (\n  _schema: GraphQLSchema,\n  _documents: Types.DocumentFile[],\n  config: FragmentMatcherConfig,\n  outputFile: string\n) => {\n  const ext = extname(outputFile).toLowerCase();\n  const all = Object.values(extensions).reduce((acc, exts) => [...acc, ...exts], []);\n\n  if (!all.includes(ext)) {\n    throw new Error(\n      `Plugin \"fragment-matcher\" requires extension to be one of ${all.map(val => val.replace('.', '')).join(', ')}!`\n    );\n  }\n\n  if (config.module === 'commonjs' && extensions.ts.includes(ext)) {\n    throw new Error(`Plugin \"fragment-matcher\" doesn't support commonjs modules combined with TypeScript!`);\n  }\n};\n"
  },
  {
    "path": "packages/plugins/other/fragment-matcher/tests/plugin.spec.ts",
    "content": "import '@graphql-codegen/testing';\nimport { codegen } from '@graphql-codegen/core';\nimport { buildASTSchema, parse } from 'graphql';\nimport gql from 'graphql-tag';\nimport { plugin, validate } from '../src/index.js';\n\nconst schema = buildASTSchema(gql`\n  type Character {\n    name: String\n  }\n\n  type Jedi {\n    side: String\n  }\n\n  type Droid {\n    model: String\n  }\n\n  union People = Character | Jedi | Droid\n\n  type Query {\n    allPeople: [People]\n  }\n`);\n\n// should only contain Unions and Interfaces\nconst introspection = JSON.stringify(\n  {\n    __schema: {\n      types: [\n        {\n          kind: 'UNION',\n          name: 'People',\n          possibleTypes: [\n            {\n              name: 'Character',\n            },\n            {\n              name: 'Jedi',\n            },\n            {\n              name: 'Droid',\n            },\n          ],\n        },\n      ],\n    },\n  },\n  null,\n  2\n);\n\nconst apolloClient3Result = JSON.stringify(\n  {\n    possibleTypes: {\n      People: ['Character', 'Jedi', 'Droid'],\n    },\n  },\n  null,\n  2\n);\n\ndescribe('Fragment Matcher Plugin', () => {\n  describe('validate', () => {\n    it('should not throw on tsx?, jsx?, json files, both in lower and upper case', async () => {\n      const extensions = ['.json', '.js', '.jsx', '.ts', '.tsx'];\n      const allCases = extensions.concat(extensions.map(val => val.toUpperCase()));\n\n      try {\n        await Promise.all(allCases.map(ext => validate(schema, [], {}, `foo${ext}`, [])));\n\n        throw new Error('DONE');\n      } catch (e) {\n        expect(e.message).toEqual('DONE');\n      }\n    });\n\n    it('should throw on commonjs + ts', async () => {\n      try {\n        await validate(schema, [], { module: 'commonjs' }, 'foo.ts', []);\n\n        throw new Error('SHOULD_NOT_BE_HERE');\n      } catch (e) {\n        expect(e.message).toContain('commonjs');\n      }\n    });\n\n    it('should throw on unsupported extension', async () => {\n      try {\n        await validate(schema, [], {}, 'foo.yml', []);\n\n        throw new Error('SHOULD_NOT_BE_HERE');\n      } catch (e) {\n        expect(e.message).toContain('extension');\n      }\n    });\n  });\n  describe('JSON', () => {\n    it('should stringify the result', async () => {\n      const content = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 2,\n        },\n        {\n          outputFile: 'foo.json',\n        }\n      );\n\n      expect(content).toEqual(introspection);\n    });\n  });\n\n  describe('JavaScript', () => {\n    it('should use es2015 module by default', async () => {\n      const jsContent = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 2,\n        },\n        {\n          outputFile: 'foo.js',\n        }\n      );\n      const jsxContent = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 2,\n        },\n        {\n          outputFile: 'foo.jsx',\n        }\n      );\n      const output = `\n        export default ${introspection}\n      `;\n\n      expect(jsContent).toBeSimilarStringTo(output);\n      expect(jsxContent).toBeSimilarStringTo(output);\n    });\n\n    it('should be able to use commonjs', async () => {\n      const jsContent = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 2,\n          module: 'commonjs',\n        },\n        {\n          outputFile: 'foo.js',\n        }\n      );\n      const jsxContent = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 2,\n          module: 'commonjs',\n        },\n        {\n          outputFile: 'foo.jsx',\n        }\n      );\n      const output = `\n        module.exports = ${introspection}\n      `;\n\n      expect(jsContent).toBeSimilarStringTo(output);\n      expect(jsxContent).toBeSimilarStringTo(output);\n    });\n  });\n\n  describe('TypeScript', () => {\n    it('should use es2015 module by default', async () => {\n      const tsContent = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 2,\n        },\n        {\n          outputFile: 'foo.ts',\n        }\n      );\n      const tsxContent = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 2,\n        },\n        {\n          outputFile: 'foo.tsx',\n        }\n      );\n      const output = `\n        export interface IntrospectionResultData {\n          __schema: {\n            types: {\n              kind: string;\n              name: string;\n              possibleTypes: {\n                name: string;\n              }[];\n            }[];\n          };\n        }\n        const result: IntrospectionResultData = ${introspection};\n        export default result;\n      `;\n\n      expect(tsContent).toBeSimilarStringTo(output);\n      expect(tsxContent).toBeSimilarStringTo(output);\n    });\n\n    it('should use es2015 module by default - apollo client 3', async () => {\n      const tsContent = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 3,\n        },\n        {\n          outputFile: 'foo.ts',\n        }\n      );\n      const tsxContent = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 3,\n        },\n        {\n          outputFile: 'foo.tsx',\n        }\n      );\n      const output = `\n      export interface PossibleTypesResultData {\n        possibleTypes: {\n          [key: string]: string[]\n        }\n      }\n\n        const result: PossibleTypesResultData = ${apolloClient3Result};\n\n        export default result;\n      `;\n\n      expect(tsContent).toBeSimilarStringTo(output);\n      expect(tsxContent).toBeSimilarStringTo(output);\n    });\n\n    it('should use es2015 even though commonjs is requested', async () => {\n      const tsContent = await plugin(\n        schema,\n        [],\n        {\n          module: 'commonjs',\n        },\n        {\n          outputFile: 'foo.ts',\n        }\n      );\n      const tsxContent = await plugin(\n        schema,\n        [],\n        {\n          module: 'commonjs',\n        },\n        {\n          outputFile: 'foo.tsx',\n        }\n      );\n      const output = `\n        export default result;\n      `;\n\n      expect(tsContent).toBeSimilarStringTo(output);\n      expect(tsxContent).toBeSimilarStringTo(output);\n    });\n\n    it('should support exportAsConst for apolloClientVersion 2', async () => {\n      const tsContent = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 2,\n          useExplicitTyping: true,\n        },\n        {\n          outputFile: 'foo.ts',\n        }\n      );\n      const tsxContent = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 2,\n          useExplicitTyping: true,\n        },\n        {\n          outputFile: 'foo.tsx',\n        }\n      );\n      const output = `\n        export type IntrospectionResultData = ${introspection};\n        const result: IntrospectionResultData = ${introspection};\n        export default result;\n      `;\n\n      expect(tsContent).toBeSimilarStringTo(output);\n      expect(tsxContent).toBeSimilarStringTo(output);\n    });\n\n    it('should support useExplicitTyping for apolloClientVersion 3', async () => {\n      const tsContent = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 3,\n          useExplicitTyping: true,\n        },\n        {\n          outputFile: 'foo.ts',\n        }\n      );\n      const tsxContent = await plugin(\n        schema,\n        [],\n        {\n          apolloClientVersion: 3,\n          useExplicitTyping: true,\n        },\n        {\n          outputFile: 'foo.tsx',\n        }\n      );\n      const output = `\n        export type PossibleTypesResultData = ${apolloClient3Result};\n        const result: PossibleTypesResultData = ${apolloClient3Result};\n        export default result;\n      `;\n\n      expect(tsContent).toBeSimilarStringTo(output);\n      expect(tsxContent).toBeSimilarStringTo(output);\n    });\n  });\n\n  it('should support Apollo Federation', async () => {\n    const federatedSchema = parse(/* GraphQL */ `\n      type Character @key(fields: \"id\") {\n        id: ID\n        name: String\n      }\n\n      type Jedi @key(fields: \"id\") {\n        id: ID\n        side: String\n      }\n\n      type Droid @key(fields: \"id\") {\n        id: ID\n        model: String\n      }\n\n      union People = Character | Jedi | Droid\n\n      type Query {\n        allPeople: [People]\n      }\n    `);\n    const content = await codegen({\n      filename: 'foo.json',\n      schema: federatedSchema,\n      documents: [],\n      plugins: [\n        {\n          'fragment-matcher': {},\n        },\n      ],\n      config: {\n        federation: true,\n        apolloClientVersion: 2,\n      },\n      pluginMap: {\n        'fragment-matcher': {\n          plugin,\n          validate,\n        },\n      },\n    });\n\n    expect(content).toEqual(introspection);\n  });\n  it('should support Apollo Federation with predefined directive definitions', async () => {\n    const federatedSchema = parse(/* GraphQL */ `\n      directive @key(fields: String!) on FIELD_DEFINITION\n\n      type Character @key(fields: \"id\") {\n        id: ID\n        name: String\n      }\n\n      type Jedi @key(fields: \"id\") {\n        id: ID\n        side: String\n      }\n\n      type Droid @key(fields: \"id\") {\n        id: ID\n        model: String\n      }\n\n      union People = Character | Jedi | Droid\n\n      type Query {\n        allPeople: [People]\n      }\n    `);\n    const content = await codegen({\n      filename: 'foo.json',\n      schema: federatedSchema,\n      documents: [],\n      plugins: [\n        {\n          'fragment-matcher': {},\n        },\n      ],\n      config: {\n        apolloClientVersion: 2,\n        federation: true,\n      },\n      pluginMap: {\n        'fragment-matcher': {\n          plugin,\n          validate,\n        },\n      },\n    });\n\n    expect(content).toEqual(introspection);\n  });\n  it('should create the result deterministically when configured to', async () => {\n    const complexSchema = buildASTSchema(gql`\n      type Droid {\n        model: String\n      }\n\n      type Character {\n        name: String\n      }\n\n      type Jedi {\n        side: String\n      }\n\n      union People = Jedi | Droid | Character\n      union People2 = Droid | Jedi | Character\n\n      type Query {\n        allPeople: [People]\n      }\n    `);\n\n    const reorderedComplexSchema = buildASTSchema(gql`\n      type Droid {\n        model: String\n      }\n\n      type Character {\n        name: String\n      }\n\n      type Jedi {\n        side: String\n      }\n\n      union People2 = Droid | Jedi | Character\n      union People = Jedi | Droid | Character\n\n      type Query {\n        allPeople: [People]\n      }\n    `);\n\n    const contentA = await plugin(\n      complexSchema,\n      [],\n      {\n        apolloClientVersion: 2,\n        deterministic: true,\n      },\n      {\n        outputFile: 'foo.json',\n      }\n    );\n    const contentB = await plugin(\n      reorderedComplexSchema,\n      [],\n      {\n        apolloClientVersion: 2,\n        deterministic: true,\n      },\n      {\n        outputFile: 'foo.json',\n      }\n    );\n\n    expect(contentA).toEqual(contentB);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/other/fragment-matcher/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'fragment-matcher',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/plugins/other/introspection/CHANGELOG.md",
    "content": "# @graphql-codegen/introspection\n\n## 5.0.1\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-codegen/visitor-plugin-common@^6.2.3` ↗︎](https://www.npmjs.com/package/@graphql-codegen/visitor-plugin-common/v/6.2.3) (from `^6.0.0`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/plugin-helpers@6.1.1\n  - @graphql-codegen/visitor-plugin-common@6.2.4\n\n## 5.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.0\n  - @graphql-codegen/plugin-helpers@6.0.0\n\n## 4.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`53f270a`](https://github.com/dotansimha/graphql-code-generator/commit/53f270acfa1da992e0f9d2e50921bb588392f8a5)]:\n  - @graphql-codegen/visitor-plugin-common@5.0.0\n\n## 4.0.2\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.2\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 4.0.1\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n  - @graphql-codegen/visitor-plugin-common@4.1.0\n\n## 4.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Patch Changes\n\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96), [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`50471e651`](https://github.com/dotansimha/graphql-code-generator/commit/50471e6514557db827cd26157262401c6c600a8c), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c), [`ca02ad172`](https://github.com/dotansimha/graphql-code-generator/commit/ca02ad172a0e8f52570fdef4271ec286d883236d), [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0), [`5950f5a68`](https://github.com/dotansimha/graphql-code-generator/commit/5950f5a6843cdd92b9d5b8ced3a97b68eadf9f30), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n  - @graphql-codegen/visitor-plugin-common@4.0.0\n\n## 3.0.1\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n  - @graphql-codegen/visitor-plugin-common@3.0.1\n\n## 3.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.0\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 2.2.3\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81), [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n  - @graphql-codegen/visitor-plugin-common@2.13.5\n\n## 2.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n  - @graphql-codegen/visitor-plugin-common@2.13.4\n\n## 2.2.1\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f), [`47d0a57e2`](https://github.com/dotansimha/graphql-code-generator/commit/47d0a57e27dd0d2334670bfc6c81c45e00ff4e74)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.1\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 2.2.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [68bb30e19]\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/visitor-plugin-common@2.11.0\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 2.1.1\n\n### Patch Changes\n\n- 8643b3bf3: Add GraphQL 16 as a peerDependency\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 2.1.0\n\n### Minor Changes\n\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 2.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 1.18.2\n\n### Patch Changes\n\n- d9212aa0: fix(visitor-plugin-common): guard for a runtime type error\n- Updated dependencies [d9212aa0]\n  - @graphql-codegen/plugin-helpers@1.18.5\n\n## 1.18.1\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 1.18.0\n\n### Minor Changes\n\n- 1731ae2b: allow to pass configuration to introspection plugin\n\n### Patch Changes\n\n- Updated dependencies [da8bdd17]\n  - @graphql-codegen/plugin-helpers@1.17.9\n\n## 1.17.8\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n  - @graphql-codegen/plugin-helpers@1.17.8\n"
  },
  {
    "path": "packages/plugins/other/introspection/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/introspection\",\n  \"version\": \"5.0.1\",\n  \"description\": \"GraphQL Code Generator plugin for generating an introspection JSON file for a GraphQLSchema\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/plugins/other/introspection\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"^6.1.1\",\n    \"@graphql-codegen/visitor-plugin-common\": \"^6.2.4\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/introspection/src/index.ts",
    "content": "import { extname } from 'path';\nimport { PluginFunction, PluginValidateFn, removeFederation, Types } from '@graphql-codegen/plugin-helpers';\nimport { getConfigValue } from '@graphql-codegen/visitor-plugin-common';\nimport { GraphQLSchema, introspectionFromSchema } from 'graphql';\n\n/**\n * @description This plugin generates a GraphQL introspection file based on your GraphQL schema.\n */\nexport interface IntrospectionPluginConfig {\n  /**\n   * @description Set to `true` in order to minify the JSON output.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```tsx {10} filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    schema: 'https://localhost:4000/graphql',\n   *    documents: ['src/**\\/*.tsx'],\n   *    generates: {\n   *      'introspection.json': {\n   *        plugins: ['introspection'],\n   *        config: {\n   *          minify: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  minify?: boolean;\n\n  /**\n   * @description Whether to include descriptions in the introspection result.\n   * @default true\n   */\n  descriptions?: boolean;\n\n  /**\n   * @description Whether to include `specifiedByUrl` in the introspection result.\n   * @default false\n   */\n  specifiedByUrl?: boolean;\n\n  /**\n   * @description Whether to include `isRepeatable` flag on directives.\n   * @default true\n   */\n  directiveIsRepeatable?: boolean;\n\n  /**\n   * @description Whether to include `description` field on schema.\n   * @default false\n   */\n  schemaDescription?: boolean;\n\n  // Internal\n  federation?: boolean;\n}\n\nexport const plugin: PluginFunction<IntrospectionPluginConfig> = async (\n  schema: GraphQLSchema,\n  _documents,\n  pluginConfig: IntrospectionPluginConfig\n): Promise<string> => {\n  const cleanSchema = pluginConfig.federation ? removeFederation(schema) : schema;\n  const descriptions = getConfigValue(pluginConfig.descriptions, true);\n  const directiveIsRepeatable = getConfigValue(pluginConfig.directiveIsRepeatable, true);\n  const schemaDescription = getConfigValue(pluginConfig.schemaDescription, undefined);\n  const specifiedByUrl = getConfigValue(pluginConfig.specifiedByUrl, undefined);\n\n  const introspection = introspectionFromSchema(cleanSchema, {\n    descriptions,\n    directiveIsRepeatable,\n    schemaDescription,\n    specifiedByUrl,\n  });\n\n  return pluginConfig.minify ? JSON.stringify(introspection) : JSON.stringify(introspection, null, 2);\n};\n\nexport const validate: PluginValidateFn<any> = async (\n  schema: GraphQLSchema,\n  documents: Types.DocumentFile[],\n  config: any,\n  outputFile: string\n) => {\n  if (extname(outputFile) !== '.json') {\n    throw new Error(`Plugin \"introspection\" requires extension to be \".json\"!`);\n  }\n};\n"
  },
  {
    "path": "packages/plugins/other/introspection/tests/introspection.spec.ts",
    "content": "import { codegen } from '@graphql-codegen/core';\nimport { buildSchema, introspectionFromSchema, IntrospectionObjectType, IntrospectionQuery, parse } from 'graphql';\nimport { plugin } from '../src/index.js';\n\ndescribe('Introspection template', () => {\n  it('should output a JSON file', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type Query {\n        fieldTest: String\n      }\n\n      schema {\n        query: Query\n      }\n    `);\n\n    const content = await plugin(schema, [], {}, { outputFile: '' });\n    const introspection = JSON.stringify(\n      introspectionFromSchema(schema, { descriptions: true, schemaDescription: false, specifiedByUrl: false }),\n      null,\n      2\n    );\n    expect(introspection).toEqual(content);\n  });\n\n  it('should output a JSON file minified', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type Query {\n        fieldTest: String\n      }\n\n      schema {\n        query: Query\n      }\n    `);\n\n    const content = await plugin(schema, [], { minify: true }, { outputFile: '' });\n    const introspection = JSON.stringify(\n      introspectionFromSchema(schema, { descriptions: true, schemaDescription: false, specifiedByUrl: false })\n    );\n    expect(introspection).toEqual(content);\n  });\n\n  it('should support Apollo Federation', async () => {\n    const schema = parse(/* GraphQL */ `\n      type Character @key(fields: \"id\") {\n        id: ID\n        name: String\n      }\n\n      type Jedi @key(fields: \"id\") {\n        id: ID\n        side: String\n      }\n\n      type Droid @key(fields: \"id\") {\n        id: ID\n        model: String\n      }\n\n      union People = Character | Jedi | Droid\n\n      type Query {\n        allPeople: [People]\n      }\n    `);\n\n    const content = await codegen({\n      filename: 'foo.json',\n      schema,\n      documents: [],\n      plugins: [\n        {\n          introspection: {},\n        },\n      ],\n      config: {\n        federation: true,\n      },\n      pluginMap: {\n        introspection: {\n          plugin,\n        },\n      },\n    });\n\n    const introspection: IntrospectionQuery = JSON.parse(content);\n    const { types } = introspection.__schema;\n    const queryType = types.find(\n      type => type.name === introspection.__schema.queryType.name\n    ) as IntrospectionObjectType;\n\n    // scalar _Any\n    expect(types.some(type => type.name === '_Any')).toBe(false);\n    // union _Entity\n    expect(types.some(type => type.name === '_Entity')).toBe(false);\n    // type _Service\n    expect(types.some(type => type.name === '_Service')).toBe(false);\n    // type Query { _entities, _service }\n    expect(queryType.fields.some(f => f.name === '_entities')).toBe(false);\n    expect(queryType.fields.some(f => f.name === '_service')).toBe(false);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/other/introspection/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'introspection',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/plugins/other/schema-ast/CHANGELOG.md",
    "content": "# @graphql-codegen/schema-ast\n\n## 5.0.1\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^11.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/11.0.0) (from `^10.0.0`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/plugin-helpers@6.1.1\n\n## 5.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/plugin-helpers@6.0.0\n\n## 4.1.0\n\n### Minor Changes\n\n- [#10023](https://github.com/dotansimha/graphql-code-generator/pull/10023) [`8f864ef`](https://github.com/dotansimha/graphql-code-generator/commit/8f864ef8aad11f233330c71c467a61c449bf270a) Thanks [@eddeee888](https://github.com/eddeee888)! - Allow .graphqls as schema extension\n\n## 4.0.2\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 4.0.1\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n\n## 4.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Patch Changes\n\n- [#9449](https://github.com/dotansimha/graphql-code-generator/pull/9449) [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^10.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.0.0) (from `^9.0.0`, in `dependencies`)\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n\n## 3.0.1\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n\n## 3.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 2.6.1\n\n### Patch Changes\n\n- [#8771](https://github.com/dotansimha/graphql-code-generator/pull/8771) [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/9.0.0) (from `^8.8.0`, in `dependencies`)\n- Updated dependencies [[`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`6c6b6f2df`](https://github.com/dotansimha/graphql-code-generator/commit/6c6b6f2df88a3a37b437a25320dab5590f033316)]:\n  - @graphql-codegen/plugin-helpers@3.1.2\n\n## 2.6.0\n\n### Minor Changes\n\n- [#8712](https://github.com/dotansimha/graphql-code-generator/pull/8712) [`fedd71cbb`](https://github.com/dotansimha/graphql-code-generator/commit/fedd71cbb7f37440a59032d942cb228df78d52e5) Thanks [@danielwaltz](https://github.com/danielwaltz)! - support gql file extension for schema-ast output\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n\n## 2.5.2\n\n### Patch Changes\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n\n## 2.5.1\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f)]:\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 2.5.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 2.4.1\n\n### Patch Changes\n\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 2.4.0\n\n### Minor Changes\n\n- f3833243d: added includeIntrospectionTypes option\n\n### Patch Changes\n\n- 6c898efe5: list all dependencies used by the package in the package.json\n\n## 2.3.0\n\n### Minor Changes\n\n- 97ddb487a: feat: GraphQL v16 compatibility\n\n### Patch Changes\n\n- Updated dependencies [97ddb487a]\n  - @graphql-codegen/plugin-helpers@2.3.0\n\n## 2.2.0\n\n### Minor Changes\n\n- 3e38de399: enhance: sort the schema before processing to have more consistent results. You can disable it with `sort: false`.\n\n## 2.1.0\n\n### Minor Changes\n\n- 39773f59b: enhance(plugins): use getDocumentNodeFromSchema and other utilities from @graphql-tools/utils\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- 24185985a: bump graphql-tools package versions\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 2.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 1.18.3\n\n### Patch Changes\n\n- dfd25caf: chore(deps): bump graphql-tools versions\n- Updated dependencies [dfd25caf]\n  - @graphql-codegen/plugin-helpers@1.18.7\n\n## 1.18.2\n\n### Patch Changes\n\n- d9212aa0: fix(visitor-plugin-common): guard for a runtime type error\n- Updated dependencies [d9212aa0]\n  - @graphql-codegen/plugin-helpers@1.18.5\n\n## 1.18.1\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 1.18.0\n\n### Minor Changes\n\n- 2e6f20a6: added support for sorting schemas before printing\n\n### Patch Changes\n\n- Updated dependencies [eaf45d1f]\n  - @graphql-codegen/plugin-helpers@1.18.1\n\n## 1.17.8\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n  - @graphql-codegen/plugin-helpers@1.17.8\n"
  },
  {
    "path": "packages/plugins/other/schema-ast/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/schema-ast\",\n  \"version\": \"5.0.1\",\n  \"description\": \"GraphQL Code Generator plugin for generating a .graphql file from a given schema\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/plugins/other/schema-ast\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"^6.1.1\",\n    \"@graphql-tools/utils\": \"^11.0.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/schema-ast/src/index.ts",
    "content": "import { extname } from 'path';\nimport {\n  getCachedDocumentNodeFromSchema,\n  PluginFunction,\n  PluginValidateFn,\n  removeFederation,\n  Types,\n} from '@graphql-codegen/plugin-helpers';\nimport {\n  buildASTSchema,\n  extendSchema,\n  GraphQLSchema,\n  parse,\n  print,\n  printIntrospectionSchema,\n  printSchema,\n  visit,\n} from 'graphql';\n\n/**\n * @description This plugin prints the merged schema as string. If multiple schemas are provided, they will be merged and printed as one schema.\n */\nexport interface SchemaASTConfig {\n  /**\n   * @description Include directives to Schema output.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```tsx {9} filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    schema: './src/schema.graphql',\n   *    generates: {\n   *      'path/to/file.graphql': {\n   *        plugins: ['schema-ast'],\n   *        config: {\n   *          includeDirectives: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  includeDirectives?: boolean;\n  /**\n   * @description Include introspection types to Schema output.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```tsx {9} filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    schema: './src/schema.graphql',\n   *    generates: {\n   *      'path/to/file.graphql': {\n   *        plugins: ['schema-ast'],\n   *        config: {\n   *          includeIntrospectionTypes: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  includeIntrospectionTypes?: boolean;\n  /**\n   * @description Set to true in order to print description as comments (using `#` instead of `\"\"\"`)\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```tsx {9} filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    schema: './src/schema.graphql',\n   *    generates: {\n   *      'path/to/file.graphql': {\n   *        plugins: ['schema-ast'],\n   *        config: {\n   *          commentDescriptions: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  commentDescriptions?: boolean;\n  /**\n   * @description Set to false to disable sorting\n   * @default true\n   */\n  sort?: boolean;\n  federation?: boolean;\n}\n\nexport const plugin: PluginFunction<SchemaASTConfig> = async (\n  schema: GraphQLSchema,\n  _documents,\n  {\n    commentDescriptions = false,\n    includeDirectives = false,\n    includeIntrospectionTypes = false,\n    sort = false,\n    federation,\n  }\n): Promise<string> => {\n  const transformedSchemaAndAst = transformSchemaAST(schema, { sort, federation, includeIntrospectionTypes });\n\n  return [\n    includeIntrospectionTypes ? printIntrospectionSchema(transformedSchemaAndAst.schema) : null,\n    includeDirectives\n      ? print(transformedSchemaAndAst.ast)\n      : (printSchema as any)(transformedSchemaAndAst.schema, { commentDescriptions }),\n  ]\n    .filter(Boolean)\n    .join('\\n');\n};\n\nexport const validate: PluginValidateFn<any> = async (\n  _schema: GraphQLSchema,\n  _documents: Types.DocumentFile[],\n  _config: SchemaASTConfig,\n  outputFile: string,\n  allPlugins: Types.ConfiguredPlugin[]\n) => {\n  const singlePlugin = allPlugins.length === 1;\n\n  const allowedExtensions = ['.graphql', '.gql', '.graphqls'];\n  const isAllowedExtension = allowedExtensions.includes(extname(outputFile));\n\n  if (singlePlugin && !isAllowedExtension) {\n    const allowedExtensionsOutput = allowedExtensions.map(extension => `\"${extension}\"`).join(' or ');\n    throw new Error(`Plugin \"schema-ast\" requires extension to be ${allowedExtensionsOutput}!`);\n  }\n};\n\nexport function transformSchemaAST(schema: GraphQLSchema, config: { [key: string]: any }) {\n  schema = config.federation ? removeFederation(schema) : schema;\n\n  if (config.includeIntrospectionTypes) {\n    // See: https://spec.graphql.org/June2018/#sec-Schema-Introspection\n    const introspectionAST = parse(`\n      extend type Query {\n        __schema: __Schema!\n        __type(name: String!): __Type\n      }\n    `);\n\n    schema = extendSchema(schema, introspectionAST);\n  }\n  let ast = getCachedDocumentNodeFromSchema(schema);\n  ast = config.disableDescriptions\n    ? visit(ast, {\n        leave: node => ({\n          ...node,\n          description: undefined,\n        }),\n      })\n    : ast;\n  schema = config.disableDescriptions ? buildASTSchema(ast) : schema;\n\n  return {\n    schema,\n    ast,\n  };\n}\n"
  },
  {
    "path": "packages/plugins/other/schema-ast/tests/schema-ast.spec.ts",
    "content": "import '@graphql-codegen/testing';\nimport { codegen } from '@graphql-codegen/core';\nimport { Types } from '@graphql-codegen/plugin-helpers';\nimport { buildSchema, parse, versionInfo } from 'graphql';\nimport { plugin, validate } from '../src/index.js';\n\nconst SHOULD_THROW_ERROR = 'SHOULD_THROW_ERROR';\n\ndescribe('Schema AST', () => {\n  describe('Validation', () => {\n    it('Should enforce graphql extension when its the only plugin', async () => {\n      const fileName = 'output.ts';\n      const plugins: Types.ConfiguredPlugin[] = [\n        {\n          'schema-ast': {},\n        },\n      ];\n\n      try {\n        await validate(null, null, null, fileName, plugins);\n\n        throw new Error(SHOULD_THROW_ERROR);\n      } catch (e) {\n        expect(e.message).not.toBe(SHOULD_THROW_ERROR);\n        expect(e.message).toBe('Plugin \"schema-ast\" requires extension to be \".graphql\" or \".gql\" or \".graphqls\"!');\n      }\n    });\n\n    it('Should not enforce graphql extension when its not the only plugin', async () => {\n      const fileName = 'output.ts';\n      const plugins: Types.ConfiguredPlugin[] = [\n        {\n          add: {},\n        },\n        {\n          'schema-ast': {},\n        },\n      ];\n\n      try {\n        await validate(null, null, null, fileName, plugins);\n      } catch {\n        expect(true).toBeFalsy();\n      }\n    });\n\n    it('Should allow .graphql extension when its the only plugin', async () => {\n      const fileName = 'output.graphql';\n      const plugins: Types.ConfiguredPlugin[] = [\n        {\n          'schema-ast': {},\n        },\n      ];\n\n      try {\n        await validate(null, null, null, fileName, plugins);\n      } catch {\n        expect(true).toBeFalsy();\n      }\n    });\n\n    it('Should allow .gql extension when its the only plugin', async () => {\n      const fileName = 'output.gql';\n      const plugins: Types.ConfiguredPlugin[] = [\n        {\n          'schema-ast': {},\n        },\n      ];\n\n      try {\n        await validate(null, null, null, fileName, plugins);\n      } catch {\n        expect(true).toBeFalsy();\n      }\n    });\n\n    it('Should allow .graphqls extension when its the only plugin', async () => {\n      const fileName = 'output.graphqls';\n      const plugins: Types.ConfiguredPlugin[] = [\n        {\n          'schema-ast': {},\n        },\n      ];\n\n      try {\n        await validate(null, null, null, fileName, plugins);\n      } catch {\n        expect(true).toBeFalsy();\n      }\n    });\n  });\n  describe('Output', () => {\n    const typeDefs = /* GraphQL */ `\n      directive @modify(limit: Int) on FIELD_DEFINITION\n\n      type Query {\n        fieldTest: String @modify(limit: 1)\n      }\n\n      schema {\n        query: Query\n      }\n    `;\n    const schema = buildSchema(typeDefs);\n\n    it('Should print schema without directives when \"includeDirectives\" is unset', async () => {\n      const content = await plugin(schema, [], { includeDirectives: false });\n\n      expect(content).toBeSimilarStringTo(`\n        type Query {\n          fieldTest: String\n        }\n      `);\n    });\n\n    it('Should print schema with as \"\"\" comment as default', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          \"\"\"\n          test\n          \"\"\"\n          fieldTest: String\n        }\n      `);\n      const content = await plugin(testSchema, [], { includeDirectives: false });\n\n      expect(content).toBeSimilarStringTo(`\n        type Query {\n          \"\"\"test\"\"\"\n          fieldTest: String\n        }\n      `);\n    });\n\n    if (versionInfo.major < 16) {\n      it('Should print schema with as # when commentDescriptions=true', async () => {\n        const testSchema = buildSchema(/* GraphQL */ `\n          type Query {\n            \"\"\"\n            test\n            \"\"\"\n            fieldTest: String\n          }\n        `);\n        const content = await plugin(testSchema, [], { commentDescriptions: true, includeDirectives: false });\n\n        expect(content).toBeSimilarStringTo(`\n        type Query {\n          #  test\n          fieldTest: String\n        }\n      `);\n      });\n    }\n\n    it('Should print schema with directives when \"includeDirectives\" is set', async () => {\n      const content = await plugin(schema, [], { includeDirectives: true });\n\n      expect(content).toBeSimilarStringTo(`\n        directive @modify(limit: Int) on FIELD_DEFINITION\n      `);\n      expect(content).toBeSimilarStringTo(`\n        type Query {\n          fieldTest: String @modify(limit: 1)\n        }\n      `);\n    });\n\n    it('Should print schema with introspection when \"includeIntrospectionTypes\" is set', async () => {\n      const content = await plugin(schema, [], { includeIntrospectionTypes: true });\n\n      expect(content).toBeSimilarStringTo(`\n        type __Schema\n      `);\n\n      expect(content).toBeSimilarStringTo(`\n        type Query {\n          fieldTest: String\n          __schema: __Schema!\n          __type(name: String!): __Type\n        }\n      `);\n    });\n\n    it('Should print schema without introspection when \"includeIntrospectionTypes\" is unset', async () => {\n      const content = await plugin(schema, [], { includeIntrospectionTypes: false });\n\n      expect(content).not.toBeSimilarStringTo(`\n        type __Schema\n      `);\n\n      expect(content).toBeSimilarStringTo(`\n        type Query {\n          fieldTest: String\n        }\n      `);\n    });\n\n    it('should support Apollo Federation', async () => {\n      const federatedSchema = parse(/* GraphQL */ `\n        type Character @key(fields: \"id\") {\n          id: ID\n          name: String\n        }\n\n        type Jedi @key(fields: \"id\") {\n          id: ID\n          side: String\n        }\n\n        type Droid @key(fields: \"id\") {\n          id: ID\n          model: String\n        }\n\n        union People = Character | Jedi | Droid\n\n        type Query {\n          allPeople: [People]\n        }\n      `);\n\n      const content = await codegen({\n        filename: 'foo.graphql',\n        schema: federatedSchema,\n        documents: [],\n        plugins: [\n          {\n            'schema-ast': {},\n          },\n        ],\n        config: {\n          federation: true,\n        },\n        pluginMap: {\n          'schema-ast': {\n            plugin,\n            validate,\n          },\n        },\n      });\n\n      expect(content).not.toContain(`scalar _Any`);\n      expect(content).not.toContain(`union _Entity`);\n      expect(content).not.toContain(`type _Service`);\n\n      expect(content).toBeSimilarStringTo(`\n        type Character {\n          id: ID\n          name: String\n        }\n\n        type Jedi {\n          id: ID\n          side: String\n        }\n\n        type Droid {\n          id: ID\n          model: String\n        }\n\n        union People = Character | Jedi | Droid\n\n        type Query {\n          allPeople: [People]\n        }\n      `);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/plugins/other/schema-ast/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'schema-ast',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/plugins/other/time/CHANGELOG.md",
    "content": "# @graphql-codegen/time\n\n## 6.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/plugin-helpers@6.0.0\n\n## 5.0.1\n\n### Patch Changes\n\n- [#9881](https://github.com/dotansimha/graphql-code-generator/pull/9881) [`68ea5d4`](https://github.com/dotansimha/graphql-code-generator/commit/68ea5d4d18969840c34e42bf4f8237e849af7aab) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`moment@~2.30.0` ↗︎](https://www.npmjs.com/package/moment/v/2.30.0) (from `~2.29.1`, in `dependencies`)\n\n## 5.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Patch Changes\n\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n\n## 4.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 3.2.3\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n\n## 3.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n\n## 3.2.1\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f)]:\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 3.2.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 3.1.1\n\n### Patch Changes\n\n- 8643b3bf3: Add GraphQL 16 as a peerDependency\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 3.1.0\n\n### Minor Changes\n\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 3.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 2.0.2\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 2.0.1\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n  - @graphql-codegen/plugin-helpers@1.17.8\n\n## 2.0.0\n\n### Major Changes\n\n- bc6e5c08: Update plugin configuration API to use object only (`string` is no longer supported)\n\n  ## Migration Notes\n\n  This only effects developers who used to override the `format`. You now need to specify it with a key!\n\n  #### Before\n\n  ```yaml\n  plugins:\n    - time: 'DD-MM-YYYY'\n  ```\n\n  #### After\n\n  ```yaml\n  plugins:\n    - time:\n        format: 'DD-MM-YYYY'\n  ```\n\n## 1.17.10\n\n### Patch Changes\n\n- ee2b01a3: Fixes for issues with publish command\n\n## 1.17.9\n\n### Patch Changes\n\n- 6cb9c96d: Fixes issues with previous release\n\n## 1.17.8\n\n### Patch Changes\n\n- bccfd28c: Fix issues with adding time to .graphql files\n"
  },
  {
    "path": "packages/plugins/other/time/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/time\",\n  \"version\": \"6.0.0\",\n  \"description\": \"GraphQL Code Generator plugin for adding the current time for an output file\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/plugins/other/time\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"^6.0.0\",\n    \"moment\": \"~2.30.0\"\n  },\n  \"devDependencies\": {\n    \"moment\": \"2.30.1\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/time/src/config.ts",
    "content": "export interface TimePluginConfig {\n  /**\n   * @description Customize the Moment format of the output time.\n   * @default YYYY-MM-DDTHH:mm:ssZ\n   *\n   * @exampleMarkdown\n   * ```tsx {10} filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    schema: 'https://localhost:4000/graphql',\n   *    documents: ['src/**\\/*.tsx'],\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['time'],\n   *        config: {\n   *          format: 'DD.MM.YY'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  format?: string;\n  /**\n   * @description Customize the comment message\n   * @default 'Generated on'\n   *\n   * @exampleMarkdown\n   * ```tsx {10} filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    schema: 'https://localhost:4000/graphql',\n   *    documents: ['src/**\\/*.tsx'],\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['time'],\n   *        config: {\n   *          message: 'The file generated on: '\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  message?: string;\n}\n"
  },
  {
    "path": "packages/plugins/other/time/src/index.ts",
    "content": "import { extname } from 'path';\nimport { PluginFunction, Types } from '@graphql-codegen/plugin-helpers';\nimport { GraphQLSchema } from 'graphql';\n// eslint-disable-next-line n/no-restricted-import -- todo: replace moment in v3\nimport moment from 'moment';\nimport { TimePluginConfig } from './config.js';\n\nexport const plugin: PluginFunction<TimePluginConfig> = async (\n  schema: GraphQLSchema,\n  documents: Types.DocumentFile[],\n  config: TimePluginConfig,\n  { outputFile }\n): Promise<string> => {\n  let format: string;\n  let message = 'Generated on ';\n\n  if (config && typeof config === 'object') {\n    if (config.format) {\n      format = config.format;\n    }\n\n    if (config.message) {\n      message = config.message;\n    }\n  }\n\n  const outputFileExtension = outputFile && extname(outputFile);\n  let commentPrefix = '//';\n\n  if ((outputFileExtension || '').toLowerCase() === '.graphql') {\n    commentPrefix = '#';\n  }\n\n  return commentPrefix + ' ' + message + moment().format(format) + '\\n';\n};\n"
  },
  {
    "path": "packages/plugins/other/time/tests/time.spec.ts",
    "content": "import { plugin } from '../src/index.js';\n\ndescribe('Time', () => {\n  it('Should use default comment when extension is unknown', async () => {\n    const result = await plugin(null as any, [], null, { outputFile: null });\n    expect(result).toContain('// Generated on');\n  });\n\n  it('Should use # prefix for comment when extension is graphql', async () => {\n    const result = await plugin(null as any, [], null, { outputFile: 'schema.graphql' });\n    expect(result).toContain('# Generated on');\n  });\n});\n"
  },
  {
    "path": "packages/plugins/other/time/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'time',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/CHANGELOG.md",
    "content": "# @graphql-codegen/visitor-plugin-common\n\n## 6.2.4\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/relay-operation-optimizer@^7.1.1` ↗︎](https://www.npmjs.com/package/@graphql-tools/relay-operation-optimizer/v/7.1.1) (from `^7.0.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/utils@^11.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/11.0.0) (from `^10.0.0`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/plugin-helpers@6.1.1\n\n## 6.2.3\n\n### Patch Changes\n\n- [#10580](https://github.com/dotansimha/graphql-code-generator/pull/10580) [`6038634`](https://github.com/dotansimha/graphql-code-generator/commit/60386344081917f2884db933309821603a2be2bf) Thanks [@Georgegriff](https://github.com/Georgegriff)! - fixed invalid extracted concrete type name on shared interface\n\n## 6.2.2\n\n### Patch Changes\n\n- [#10530](https://github.com/dotansimha/graphql-code-generator/pull/10530) [`f588d91`](https://github.com/dotansimha/graphql-code-generator/commit/f588d91ac43ea0aa5931915ce980d2e6876bb59c) Thanks [@Georgegriff](https://github.com/Georgegriff)! - fix fragment type generation names\n\n## 6.2.1\n\n### Patch Changes\n\n- [#10503](https://github.com/dotansimha/graphql-code-generator/pull/10503) [`b995ed1`](https://github.com/dotansimha/graphql-code-generator/commit/b995ed13a49379ea05e0e313fac68b557527523a) Thanks [@Georgegriff](https://github.com/Georgegriff)! - Use parent type name on interface types without fragments\n\n## 6.2.0\n\n### Minor Changes\n\n- [#10510](https://github.com/dotansimha/graphql-code-generator/pull/10510) [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670) Thanks [@nickmessing](https://github.com/nickmessing)! - add importExtension configuration option\n\n### Patch Changes\n\n- [#10512](https://github.com/dotansimha/graphql-code-generator/pull/10512) [`f821e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f821e8ab9351f23a9f7e5d5e6fc69c8e8868cad8) Thanks [@realies](https://github.com/realies)! - fix: allow mappers to override root types (Query, Mutation, Subscription)\n\n  Previously, mappers configured for root types were ignored because root types were checked before mappers. This fix moves the mapper check before the root type check, allowing mappers to override `rootValueType` when configured.\n\n- Updated dependencies [[`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670)]:\n  - @graphql-codegen/plugin-helpers@6.1.0\n\n## 6.1.2\n\n### Patch Changes\n\n- [#10499](https://github.com/dotansimha/graphql-code-generator/pull/10499) [`51a1a72`](https://github.com/dotansimha/graphql-code-generator/commit/51a1a7280578d43681391df11d320a8416c0b41d) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix nested fragment not getting correct meta field in Client Preset\n\n## 6.1.1\n\n### Patch Changes\n\n- [#10498](https://github.com/dotansimha/graphql-code-generator/pull/10498) [`6715330`](https://github.com/dotansimha/graphql-code-generator/commit/67153304646694d75aee24afd70c3fce12e9f1f2) Thanks [@ardatan](https://github.com/ardatan)! - Handle schema extension nodes correctly\n\n  When a schema doesn't have an operation type defined but has `schema extension` definitions with directives like below,\n  schema extensions are not converted to schema definitions by GraphQL Tools.\n  So the visitor should handle schema extension nodes correctly.\n\n  Follow-up to https://github.com/ardatan/graphql-tools/pull/7679\n\n  ```graphql\n  extend schema @link(url: \"https://specs.apollo.dev/federation/v2.0\", import: [\"@key\"])\n\n  type Foo {\n    id: ID! @key\n    name: String\n  }\n  ```\n\n## 6.1.0\n\n### Minor Changes\n\n- [#10449](https://github.com/dotansimha/graphql-code-generator/pull/10449) [`8258f1f`](https://github.com/dotansimha/graphql-code-generator/commit/8258f1f6012c106d02ef28bca9ec424f70c4aa26) Thanks [@eddeee888](https://github.com/eddeee888)! - Add addInterfaceFieldResolverTypes option to support custom Interface resolver inheritance\n\n## 6.0.1\n\n### Patch Changes\n\n- [#10412](https://github.com/dotansimha/graphql-code-generator/pull/10412) [`accdab6`](https://github.com/dotansimha/graphql-code-generator/commit/accdab69106605241933e9d66d64dc7077656f30) Thanks [@thekevinbrown](https://github.com/thekevinbrown)! - Add special handling for identifiers that consist entirely of _ characters when transformUnderscore is true. This prevents _ values in GraphQL enums from being emitted without identifers in the resulting types.\n\n## 6.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - BREAKING CHANGES: Do not generate \\_\\_isTypeOf for non-implementing types or non-union members\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Remove deprecated config option `dedupeFragments`\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Remove NameNode override\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - BREAKING CHANGE: Use Record<PropertyKey, never> instead of {} for empty object type\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Ensure Federation Interfaces have `__resolveReference` if they are resolvable entities\n\n  BREAKING CHANGES: Deprecate `onlyResolveTypeForInterfaces` because majority of use cases cannot implement resolvers in Interfaces.\n  BREAKING CHANGES: Deprecate `generateInternalResolversIfNeeded.__resolveReference` because types do not have `__resolveReference` if they are not Federation entities or are not resolvable. Users should not have to manually set this option. This option was put in to wait for this major version.\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - BREAKING CHANGE: Improve Federation Entity's resolvers' parent param type: These types were using reference types inline. This makes it hard to handle mappers. The Parent type now all comes from ParentResolverTypes to make handling mappers and parent types simpler.\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Bump dependencies major versions:\n\n  - dependency-graph to v1\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix `mappers` usage with Federation\n\n  `mappers` was previously used as `__resolveReference`'s first param (usually called \"reference\"). However, this is incorrect because `reference` interface comes directly from `@key` and `@requires` directives. This patch fixes the issue by creating a new `FederationTypes` type and use it as the base for federation entity types when being used to type entity references.\n\n  BREAKING CHANGES: No longer generate `UnwrappedObject` utility type, as this was used to support the wrong previously generated type.\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Minor Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Report to meta user defined objects whether they have isTypeOf resolver\n\n### Patch Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Update @requires type\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix fields or object types marked with @external being wrongly generated\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/plugin-helpers@6.0.0\n\n## 5.8.0\n\n### Minor Changes\n\n- [#10315](https://github.com/dotansimha/graphql-code-generator/pull/10315) [`f6909d1`](https://github.com/dotansimha/graphql-code-generator/commit/f6909d1797c15b79a0afb7ec089471763a485bfc) Thanks [@eddeee888](https://github.com/eddeee888)! - Implement semanticNonNull custom directive\n\n## 5.7.1\n\n### Patch Changes\n\n- [#10302](https://github.com/dotansimha/graphql-code-generator/pull/10302) [`d8566c0`](https://github.com/dotansimha/graphql-code-generator/commit/d8566c015943ea4dbcaeaf57d3d8406553ae230a) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix Apollo unmask directive incorrectly generating fragmentRefs\n\n## 5.7.0\n\n### Minor Changes\n\n- [#10270](https://github.com/dotansimha/graphql-code-generator/pull/10270) [`6d7c1d7`](https://github.com/dotansimha/graphql-code-generator/commit/6d7c1d7c0a4662acdc0efafd4234229ad0a8dd3c) Thanks [@adapap](https://github.com/adapap)! - feat: implement `includeExternalFragments: boolean` option\n\n## 5.6.1\n\n### Patch Changes\n\n- [#10230](https://github.com/dotansimha/graphql-code-generator/pull/10230) [`60dd72f`](https://github.com/dotansimha/graphql-code-generator/commit/60dd72fb103fd7fd70b4e1def98da29588865517) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix generateInternalResolversIfNeeded.\\_\\_resolveReference making the resolver required\n\n  `__resolveReference`'s default behaviour when not declared is to pass the ref to subsequent resolvers i.e. becoming the `parent`. So, it means we don't have to make this resolver required.\n\n  This patch makes `__resolveReference` optional when `generateInternalResolversIfNeeded.__resolveReference` is set to true.\n\n## 5.6.0\n\n### Minor Changes\n\n- [#10163](https://github.com/dotansimha/graphql-code-generator/pull/10163) [`fa64fbf`](https://github.com/dotansimha/graphql-code-generator/commit/fa64fbf8a44e1cee7ae17806dcd178dc7350c4ba) Thanks [@jerelmiller](https://github.com/jerelmiller)! - Add support for Apollo Client `@unmask` directive with fragment masking.\n\n### Patch Changes\n\n- [#10187](https://github.com/dotansimha/graphql-code-generator/pull/10187) [`1617e3c`](https://github.com/dotansimha/graphql-code-generator/commit/1617e3cf38f3059cc5ea88b540033f521f03725a) Thanks [@gilgardosh](https://github.com/gilgardosh)! - Fix: type naming for imported enums\n\n## 5.5.0\n\n### Minor Changes\n\n- [#9989](https://github.com/dotansimha/graphql-code-generator/pull/9989) [`55a1e9e`](https://github.com/dotansimha/graphql-code-generator/commit/55a1e9e63830df17ed40602ea7e322bbf48b17bc) Thanks [@eddeee888](https://github.com/eddeee888)! - Add `generateInternalResolversIfNeeded` option\n\n  This option can be used to generate more correct types for internal resolvers. For example, only generate `__resolveReference` if the federation object has a resolvable `@key`.\n\n  In the future, this option can be extended to support other internal resolvers e.g. `__isTypeOf` is only generated for implementing types and union members.\n\n- [#10141](https://github.com/dotansimha/graphql-code-generator/pull/10141) [`a235051`](https://github.com/dotansimha/graphql-code-generator/commit/a23505180ac2f275a55ece27162ec9bfcdc52e03) Thanks [@eddeee888](https://github.com/eddeee888)! - Add avoidCheckingAbstractTypesRecursively to avoid checking and generating abstract types recursively\n\n  For users that already sets recursive default mappers e.g. `Partial<{T}>` or `DeepPartial<{T}>`, having both options on will cause a nested loop which eventually crashes Codegen. In such case, setting `avoidCheckingAbstractTypesRecursively: true` allows users to continue to use recursive default mappers as before.\n\n### Patch Changes\n\n- Updated dependencies [[`55a1e9e`](https://github.com/dotansimha/graphql-code-generator/commit/55a1e9e63830df17ed40602ea7e322bbf48b17bc)]:\n  - @graphql-codegen/plugin-helpers@5.1.0\n\n## 5.4.0\n\n### Minor Changes\n\n- [#10077](https://github.com/dotansimha/graphql-code-generator/pull/10077) [`3f4f546`](https://github.com/dotansimha/graphql-code-generator/commit/3f4f5466ff168ad822b9a00d83d3779078e6d8c4) Thanks [@eddeee888](https://github.com/eddeee888)! - Extend `config.avoidOptions` to support query, mutation and subscription\n\n  Previously, `config.avoidOptions.resolvers` was being used to make query, mutation and subscription fields non-optional.\n  Now, `config.avoidOptions.query`, `config.avoidOptions.mutation` and `config.avoidOptions.subscription` can be used to target the respective types.\n\n## 5.3.1\n\n### Patch Changes\n\n- [#10014](https://github.com/dotansimha/graphql-code-generator/pull/10014) [`79fee3c`](https://github.com/dotansimha/graphql-code-generator/commit/79fee3cada20d683d250aad5aa5fef9d6ed9f4d2) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix object types with fields being abstract types not pointing to resolver types correctly\n\n## 5.3.0\n\n### Minor Changes\n\n- [#10007](https://github.com/dotansimha/graphql-code-generator/pull/10007) [`808ada5`](https://github.com/dotansimha/graphql-code-generator/commit/808ada595d83d39cad045da5824cac6378e9eca3) Thanks [@eddeee888](https://github.com/eddeee888)! - Add generated resolvers map type name to typescript-resolvers plugin meta\n\n### Patch Changes\n\n- [#10019](https://github.com/dotansimha/graphql-code-generator/pull/10019) [`14ce39e`](https://github.com/dotansimha/graphql-code-generator/commit/14ce39e41dfee38c652be736664177fa2b1df421) Thanks [@vhfmag](https://github.com/vhfmag)! - Improve code generation performance by computing `ClientSideBaseVisitor`'s `fragmentsGraph` once at instantiation time.\n\n## 5.2.0\n\n### Minor Changes\n\n- [#9961](https://github.com/dotansimha/graphql-code-generator/pull/9961) [`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e) Thanks [@eddeee888](https://github.com/eddeee888)! - Update typescript-resolvers to report generated resolver types in the run to meta field in the output\n\n### Patch Changes\n\n- [#9944](https://github.com/dotansimha/graphql-code-generator/pull/9944) [`156cc2b`](https://github.com/dotansimha/graphql-code-generator/commit/156cc2b9a2a5129beba121cfa987b04e29899431) Thanks [@eddeee888](https://github.com/eddeee888)! - Add \\_ prefix to generated `RefType` in `ResolversInterfaceTypes` and `ResolversUnionTypes` as it is sometimes unused\n\n- [#9962](https://github.com/dotansimha/graphql-code-generator/pull/9962) [`b49457b`](https://github.com/dotansimha/graphql-code-generator/commit/b49457b5f29328d2dc23c642788a2e697cb8966e) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix interface mappers not working in nested/self-referencing scenarios\n\n- Updated dependencies [[`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e)]:\n  - @graphql-codegen/plugin-helpers@5.0.4\n\n## 5.1.0\n\n### Minor Changes\n\n- [#9652](https://github.com/dotansimha/graphql-code-generator/pull/9652) [`920b443`](https://github.com/dotansimha/graphql-code-generator/commit/920b443a401b8cc4811f64ec5b25fc7b4ae32b53) Thanks [@gmurphey](https://github.com/gmurphey)! - Added allowUndefinedQueryVariables as config option\n\n### Patch Changes\n\n- [#9842](https://github.com/dotansimha/graphql-code-generator/pull/9842) [`ed9c205`](https://github.com/dotansimha/graphql-code-generator/commit/ed9c205d15d7f14ed73e54aecf40e4fad5664e9d) Thanks [@henryqdineen](https://github.com/henryqdineen)! - properly handle aliased conditionals\n\n## 5.0.0\n\n### Major Changes\n\n- [#9845](https://github.com/dotansimha/graphql-code-generator/pull/9845) [`53f270a`](https://github.com/dotansimha/graphql-code-generator/commit/53f270acfa1da992e0f9d2e50921bb588392f8a5) Thanks [@productdevbook](https://github.com/productdevbook)! - path starts with \"#\"\n\n## 4.1.2\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 4.1.1\n\n### Patch Changes\n\n- [#9673](https://github.com/dotansimha/graphql-code-generator/pull/9673) [`7718a8113`](https://github.com/dotansimha/graphql-code-generator/commit/7718a8113dc6282475cb738f1e28698b8221fa2f) Thanks [@maclockard](https://github.com/maclockard)! - Respect avoidOptionals when all arguments are optional\n\n## 4.1.0\n\n### Minor Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - fix: out-of-memory crash (fixes #7720)\n  perf: implement a caching mechanism that makes sure the type originating at the same location is never generated twice, as long as the combination of selected fields and possible types matches\n  feat: implement `extractAllFieldsToTypes: boolean`\n  feat: implement `printFieldsOnNewLines: boolean`\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - Avoid reading from null values when selection sets only contain fragments.\n\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n\n## 4.0.1\n\n### Patch Changes\n\n- [#9497](https://github.com/dotansimha/graphql-code-generator/pull/9497) [`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a) Thanks [@eddeee888](https://github.com/eddeee888)! - Revert default ID scalar input type to string\n\n  We changed the ID Scalar input type from `string` to `string | number` in the latest major version of `typescript` plugin. This causes issues for server plugins (e.g. typescript-resolvers) that depends on `typescript` plugin. This is because the scalar type needs to be manually inverted on setup which is confusing.\n\n## 4.0.0\n\n### Major Changes\n\n- [#9375](https://github.com/dotansimha/graphql-code-generator/pull/9375) [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929) Thanks [@eddeee888](https://github.com/eddeee888)! - Implement Scalars with input/output types\n\n  In GraphQL, Scalar types can be different for client and server. For example, given the native GraphQL ID:\n\n  - A client may send `string` or `number` in the input\n  - A client receives `string` in its selection set (i.e output)\n  - A server receives `string` in the resolver (GraphQL parses `string` or `number` received from the client to `string`)\n  - A server may return `string` or `number` (GraphQL serializes the value to `string` before sending it to the client )\n\n  Currently, we represent every Scalar with only one type. This is what codegen generates as base type:\n\n  ```ts\n  export type Scalars = {\n    ID: string\n  }\n  ```\n\n  Then, this is used in both input and output type e.g.\n\n  ```ts\n  export type Book = {\n    __typename?: 'Book'\n    id: Scalars['ID'] // Output's ID can be `string` 👍\n  }\n\n  export type QueryBookArgs = {\n    id: Scalars['ID'] // Input's ID can be `string` or `number`. However, the type is only `string` here 👎\n  }\n  ```\n\n  This PR extends each Scalar to have input and output:\n\n  ```ts\n  export type Scalars = {\n    ID: {\n      input: string | number\n      output: string\n    }\n  }\n  ```\n\n  Then, each input/output GraphQL type can correctly refer to the correct input/output scalar type:\n\n  ```ts\n  export type Book = {\n    __typename?: 'Book'\n    id: Scalars['ID']['output'] // Output's ID can be `string` 👍\n  }\n\n  export type QueryBookArgs = {\n    id: Scalars['ID']['input'] // Input's ID can be `string` or `number` 👍\n  }\n  ```\n\n  Note that for `typescript-resolvers`, the type of ID needs to be inverted. However, the referenced types in GraphQL input/output types should still work correctly:\n\n  ```ts\n  export type Scalars = {\n    ID: {\n      input: string;\n      output: string | number;\n    }\n  }\n\n  export type Book = {\n    __typename?: \"Book\";\n    id: Scalars[\"ID\"]['output']; // Resolvers can return `string` or `number` in ID fields 👍\n  };\n\n  export type QueryBookArgs = {\n    id: Scalars[\"ID\"]['input']; // Resolvers receive `string` in ID fields 👍\n  };\n\n  export type ResolversTypes = {\n    ID: ID: ResolverTypeWrapper<Scalars['ID']['output']>; // Resolvers can return `string` or `number` in ID fields 👍\n  }\n\n  export type ResolversParentTypes = {\n    ID: Scalars['ID']['output']; // Resolvers receive `string` or `number` from parents 👍\n  };\n  ```\n\n  ***\n\n  Config changes:\n\n  1. Scalars option can now take input/output types:\n\n  ```ts\n  config: {\n    scalars: {\n      ID: {\n        input: 'string',\n        output: 'string | number'\n      }\n    }\n  }\n  ```\n\n  2. If a string is given (instead of an object with input/output fields), it will be used as both input and output types:\n\n  ```ts\n  config: {\n    scalars: {\n      ID: 'string' // This means `string` will be used for both ID's input and output types\n    }\n  }\n  ```\n\n  3. BREAKING CHANGE: External module Scalar types need to be an object with input/output fields\n\n  ```ts\n  config: {\n    scalars: {\n      ID: './path/to/scalar-module'\n    }\n  }\n  ```\n\n  If correctly, wired up, the following will be generated:\n\n  ```ts\n  // Previously, imported `ID` type can be a primitive type, now it must be an object with input/output fields\n  import { ID } from './path/to/scalar-module'\n\n  export type Scalars = {\n    ID: { input: ID['input']; output: ID['output'] }\n  }\n  ```\n\n  ***\n\n  BREAKING CHANGE: This changes Scalar types which could be referenced in other plugins. If you are a plugin maintainer and reference Scalar, please update your plugin to use the correct input/output types.\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Minor Changes\n\n- [#9196](https://github.com/dotansimha/graphql-code-generator/pull/9196) [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96) Thanks [@beerose](https://github.com/beerose)! - Add `@defer` directive support\n\n  When a query includes a deferred fragment field, the server will return a partial response with the non-deferred fields first, followed by the remaining fields once they have been resolved.\n\n  Once start using the `@defer` directive in your queries, the generated code will automatically include support for the directive.\n\n  ```jsx\n  // src/index.tsx\n  import { graphql } from './gql'\n  const OrdersFragment = graphql(`\n    fragment OrdersFragment on User {\n      orders {\n        id\n        total\n      }\n    }\n  `)\n  const GetUserQuery = graphql(`\n    query GetUser($id: ID!) {\n      user(id: $id) {\n        id\n        name\n        ...OrdersFragment @defer\n      }\n    }\n  `)\n  ```\n\n  The generated type for `GetUserQuery` will have information that the fragment is _incremental,_ meaning it may not be available right away.\n\n  ```tsx\n  // gql/graphql.ts\n  export type GetUserQuery = { __typename?: 'Query'; id: string; name: string } & ({\n    __typename?: 'Query'\n  } & {\n    ' $fragmentRefs'?: { OrdersFragment: Incremental<OrdersFragment> }\n  })\n  ```\n\n  Apart from generating code that includes support for the `@defer` directive, the Codegen also exports a utility function called `isFragmentReady`. You can use it to conditionally render components based on whether the data for a deferred\n  fragment is available:\n\n  ```jsx\n  const OrdersList = (props: { data: FragmentType<typeof OrdersFragment> }) => {\n    const data = useFragment(OrdersFragment, props.data);\n    return (\n      // render orders list\n    )\n  };\n\n  function App() {\n    const { data } = useQuery(GetUserQuery);\n    return (\n      {data && (\n        <>\n          {isFragmentReady(GetUserQuery, OrdersFragment, data)\n  \t\t\t\t\t&& <OrdersList data={data} />}\n        </>\n      )}\n    );\n  }\n  export default App;\n  ```\n\n- [#9339](https://github.com/dotansimha/graphql-code-generator/pull/9339) [`50471e651`](https://github.com/dotansimha/graphql-code-generator/commit/50471e6514557db827cd26157262401c6c600a8c) Thanks [@AaronMoat](https://github.com/AaronMoat)! - Add excludeTypes config to resolversNonOptionalTypename\n\n  This disables the adding of `__typename` in resolver types for any specified typename. This could be useful e.g. if you're wanting to enable this for all new types going forward but not do a big migration.\n\n  Usage example:\n\n  ```typescript\n  const config: CodegenConfig = {\n    schema: 'src/schema/**/*.graphql',\n    generates: {\n      'src/schema/types.ts': {\n        plugins: ['typescript', 'typescript-resolvers'],\n        config: {\n          resolversNonOptionalTypename: {\n            unionMember: true,\n            excludeTypes: ['MyType']\n          }\n        }\n      }\n    }\n  }\n  ```\n\n- [#9229](https://github.com/dotansimha/graphql-code-generator/pull/9229) [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c) Thanks [@eddeee888](https://github.com/eddeee888)! - Use generic to simplify ResolversUnionTypes\n\n  This follows the `ResolversInterfaceTypes`'s approach where the `RefType` generic is used to refer back to `ResolversTypes` or `ResolversParentTypes` in cases of nested Union types\n\n- [#9304](https://github.com/dotansimha/graphql-code-generator/pull/9304) [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823) Thanks [@esfomeado](https://github.com/esfomeado)! - Added support for disabling suffixes on Enums.\n\n- [#9229](https://github.com/dotansimha/graphql-code-generator/pull/9229) [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c) Thanks [@eddeee888](https://github.com/eddeee888)! - Extract interfaces to ResolversInterfaceTypes and add to resolversNonOptionalTypename\n\n  1. `ResolversInterfaceTypes` is a new type that keeps track of a GraphQL interface and its implementing types.\n\n  For example, consider this schema:\n\n  ```graphql\n  extend type Query {\n    character(id: ID!): CharacterNode\n  }\n\n  interface CharacterNode {\n    id: ID!\n  }\n\n  type Wizard implements CharacterNode {\n    id: ID!\n    screenName: String!\n    spells: [String!]!\n  }\n\n  type Fighter implements CharacterNode {\n    id: ID!\n    screenName: String!\n    powerLevel: Int!\n  }\n  ```\n\n  The generated types will look like this:\n\n  ```ts\n  export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = {\n    CharacterNode: Fighter | Wizard\n  }\n\n  export type ResolversTypes = {\n    // other types...\n    CharacterNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['CharacterNode']>\n    Fighter: ResolverTypeWrapper<Fighter>\n    Wizard: ResolverTypeWrapper<Wizard>\n    // other types...\n  }\n\n  export type ResolversParentTypes = {\n    // other types...\n    CharacterNode: ResolversInterfaceTypes<ResolversParentTypes>['CharacterNode']\n    Fighter: Fighter\n    Wizard: Wizard\n    // other types...\n  }\n  ```\n\n  The `RefType` generic is used to reference back to `ResolversTypes` and `ResolversParentTypes` in some cases such as field returning a Union.\n\n  2. `resolversNonOptionalTypename` also affects `ResolversInterfaceTypes`\n\n  Using the schema above, if we use `resolversNonOptionalTypename` option:\n\n  ```typescript\n  const config: CodegenConfig = {\n    schema: 'src/schema/**/*.graphql',\n    generates: {\n      'src/schema/types.ts': {\n        plugins: ['typescript', 'typescript-resolvers'],\n        config: {\n          resolversNonOptionalTypename: true // Or `resolversNonOptionalTypename: { interfaceImplementingType: true }`\n        }\n      }\n    }\n  }\n  ```\n\n  Then, the generated type looks like this:\n\n  ```ts\n  export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = {\n    CharacterNode: (Fighter & { __typename: 'Fighter' }) | (Wizard & { __typename: 'Wizard' })\n  }\n\n  export type ResolversTypes = {\n    // other types...\n    CharacterNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['CharacterNode']>\n    Fighter: ResolverTypeWrapper<Fighter>\n    Wizard: ResolverTypeWrapper<Wizard>\n    // other types...\n  }\n\n  export type ResolversParentTypes = {\n    // other types...\n    CharacterNode: ResolversInterfaceTypes<ResolversParentTypes>['CharacterNode']\n    Fighter: Fighter\n    Wizard: Wizard\n    // other types...\n  }\n  ```\n\n### Patch Changes\n\n- [#9449](https://github.com/dotansimha/graphql-code-generator/pull/9449) [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n\n  - Updated dependency [`@graphql-tools/optimize@^2.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/optimize/v/2.0.0) (from `^1.3.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/relay-operation-optimizer@^7.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/relay-operation-optimizer/v/7.0.0) (from `^6.5.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/utils@^10.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.0.0) (from `^9.0.0`, in `dependencies`)\n\n- [#9414](https://github.com/dotansimha/graphql-code-generator/pull/9414) [`ca02ad172`](https://github.com/dotansimha/graphql-code-generator/commit/ca02ad172a0e8f52570fdef4271ec286d883236d) Thanks [@beerose](https://github.com/beerose)! - Include nested fragments in string documentMode\n\n- [#9369](https://github.com/dotansimha/graphql-code-generator/pull/9369) [`5950f5a68`](https://github.com/dotansimha/graphql-code-generator/commit/5950f5a6843cdd92b9d5b8ced3a97b68eadf9f30) Thanks [@asmundg](https://github.com/asmundg)! - Output valid type names with mergeFragmentTypes\n\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n\n## 3.1.1\n\n### Patch Changes\n\n- [#9301](https://github.com/dotansimha/graphql-code-generator/pull/9301) [`386cf9044`](https://github.com/dotansimha/graphql-code-generator/commit/386cf9044a41d87ed45069b22d26b30f4b262a85) Thanks [@wassim-k](https://github.com/wassim-k)! - Fix fragment imports for near-operation-file with graphQLTag\n\n- [#9231](https://github.com/dotansimha/graphql-code-generator/pull/9231) [`402cb8ac0`](https://github.com/dotansimha/graphql-code-generator/commit/402cb8ac0f0c347b186d295c4b69c19e25a65d00) Thanks [@eddeee888](https://github.com/eddeee888)! - Implement resolversNonOptionalTypename for mapper cases\n\n## 3.1.0\n\n### Minor Changes\n\n- [#9146](https://github.com/dotansimha/graphql-code-generator/pull/9146) [`9f4d9c5a4`](https://github.com/dotansimha/graphql-code-generator/commit/9f4d9c5a479d34da25df8e060a8c2b3b162647dd) Thanks [@eddeee888](https://github.com/eddeee888)! - [typescript-resolvers] Add `resolversNonOptionalTypename` config option.\n\n  This is extending on `ResolversUnionTypes` implemented in https://github.com/dotansimha/graphql-code-generator/pull/9069\n\n  `resolversNonOptionalTypename` adds non-optional `__typename` to union members of `ResolversUnionTypes`, without affecting the union members' base intefaces.\n\n  A common use case for non-optional `__typename` of union members is using it as the common field to work out the final schema type. This makes implementing the union's `__resolveType` very simple as we can use `__typename` to decide which union member the resolved object is. Without this, we have to check the existence of field/s on the incoming object which could be verbose.\n\n  For example, consider this schema:\n\n  ```graphql\n  type Query {\n    book(id: ID!): BookPayload!\n  }\n\n  type Book {\n    id: ID!\n    isbn: String!\n  }\n\n  type BookResult {\n    node: Book\n  }\n\n  type PayloadError {\n    message: String!\n  }\n\n  union BookPayload = BookResult | PayloadError\n  ```\n\n  _With optional `__typename`:_ We need to check existence of certain fields to resolve type in the union resolver:\n\n  ```ts\n  // Query/book.ts\n  export const book = async () => {\n    try {\n      const book = await fetchBook()\n      // 1. No `__typename` in resolver results...\n      return {\n        node: book\n      }\n    } catch (e) {\n      return {\n        message: 'Failed to fetch book'\n      }\n    }\n  }\n\n  // BookPayload.ts\n  export const BookPayload = {\n    __resolveType: parent => {\n      // 2. ... means more checks in `__resolveType`\n      if ('message' in parent) {\n        return 'PayloadError'\n      }\n      return 'BookResult'\n    }\n  }\n  ```\n\n  _With non-optional `__typename`:_ Resolvers declare the type. This which gives us better TypeScript support in resolvers and simplify `__resolveType` implementation:\n\n  ```ts\n  // Query/book.ts\n  export const book = async () => {\n    try {\n      const book = await fetchBook()\n      // 1. `__typename` is declared in resolver results...\n      return {\n        __typename: 'BookResult', // 1a. this also types `node` for us 🎉\n        node: book\n      }\n    } catch (e) {\n      return {\n        __typename: 'PayloadError',\n        message: 'Failed to fetch book'\n      }\n    }\n  }\n\n  // BookPayload.ts\n  export const BookPayload = {\n    __resolveType: parent => parent.__typename // 2. ... means a very simple check in `__resolveType`\n  }\n  ```\n\n  _Using `resolversNonOptionalTypename`:_ add it into `typescript-resolvers` plugin config:\n\n  ```ts\n  // codegen.ts\n  const config: CodegenConfig = {\n    schema: 'src/schema/**/*.graphql',\n    generates: {\n      'src/schema/types.ts': {\n        plugins: ['typescript', 'typescript-resolvers'],\n        config: {\n          resolversNonOptionalTypename: true // Or `resolversNonOptionalTypename: { unionMember: true }`\n        }\n      }\n    }\n  }\n  ```\n\n### Patch Changes\n\n- [#9206](https://github.com/dotansimha/graphql-code-generator/pull/9206) [`e56790104`](https://github.com/dotansimha/graphql-code-generator/commit/e56790104ae56d6c5b48ef71823345bd09d3b835) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix `ResolversUnionTypes` being used in `ResolversParentTypes`\n\n  Previously, objects with mappable fields are converted to Omit format that references its own type group or `ResolversTypes` or `ResolversParentTypes` e.g.\n\n  ```ts\n  export type ResolversTypes = {\n    Book: ResolverTypeWrapper<BookMapper>\n    BookPayload: ResolversTypes['BookResult'] | ResolversTypes['StandardError']\n    // Note: `result` on the next line references `ResolversTypes[\"Book\"]`\n    BookResult: ResolverTypeWrapper<Omit<BookResult, 'result'> & { result?: Maybe<ResolversTypes['Book']> }>\n    StandardError: ResolverTypeWrapper<StandardError>\n  }\n\n  export type ResolversParentTypes = {\n    Book: BookMapper\n    BookPayload: ResolversParentTypes['BookResult'] | ResolversParentTypes['StandardError']\n    // Note: `result` on the next line references `ResolversParentTypes[\"Book\"]`\n    BookResult: Omit<BookResult, 'result'> & { result?: Maybe<ResolversParentTypes['Book']> }\n    StandardError: StandardError\n  }\n  ```\n\n  In https://github.com/dotansimha/graphql-code-generator/pull/9069, we extracted resolver union types to its own group:\n\n  ```ts\n  export type ResolversUnionTypes = {\n    // Note: `result` on the next line references `ResolversTypes[\"Book\"]` which is only correct for the `ResolversTypes` case\n    BookPayload: (Omit<BookResult, 'result'> & { result?: Maybe<ResolversTypes['Book']> }) | StandardError\n  }\n\n  export type ResolversTypes = {\n    Book: ResolverTypeWrapper<BookMapper>\n    BookPayload: ResolverTypeWrapper<ResolversUnionTypes['BookPayload']>\n    BookResult: ResolverTypeWrapper<Omit<BookResult, 'result'> & { result?: Maybe<ResolversTypes['Book']> }>\n    StandardError: ResolverTypeWrapper<StandardError>\n  }\n\n  export type ResolversParentTypes = {\n    Book: BookMapper\n    BookPayload: ResolversUnionTypes['BookPayload']\n    BookResult: Omit<BookResult, 'result'> & { result?: Maybe<ResolversParentTypes['Book']> }\n    StandardError: StandardError\n  }\n  ```\n\n  This change creates an extra `ResolversUnionParentTypes` that is referenced by `ResolversParentTypes` to ensure backwards compatibility:\n\n  ```ts\n  export type ResolversUnionTypes = {\n    BookPayload: (Omit<BookResult, 'result'> & { result?: Maybe<ResolversParentTypes['Book']> }) | StandardError\n  }\n\n  // ... and the reference is changed in ResolversParentTypes:\n  export type ResolversParentTypes = {\n    // ... other fields\n    BookPayload: ResolversUnionParentTypes['BookPayload']\n  }\n  ```\n\n- [#9194](https://github.com/dotansimha/graphql-code-generator/pull/9194) [`acb647e4e`](https://github.com/dotansimha/graphql-code-generator/commit/acb647e4efbddecf732b6e55dc47ac40c9bdaf08) Thanks [@dstaley](https://github.com/dstaley)! - Don't emit import statements for unused fragments\n\n- Updated dependencies [[`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29), [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087)]:\n  - @graphql-codegen/plugin-helpers@4.2.0\n\n## 3.0.2\n\n### Patch Changes\n\n- [#9110](https://github.com/dotansimha/graphql-code-generator/pull/9110) [`ba0610bbd`](https://github.com/dotansimha/graphql-code-generator/commit/ba0610bbd4578d8a82078014766f56d8ae5fcf7a) Thanks [@gilgardosh](https://github.com/gilgardosh)! - Custom mappers with placeholder will apply omit\n\n- [#9069](https://github.com/dotansimha/graphql-code-generator/pull/9069) [`4b49f6fbe`](https://github.com/dotansimha/graphql-code-generator/commit/4b49f6fbed802907b460bfb7b6e9a85f88c555bc) Thanks [@eddeee888](https://github.com/eddeee888)! - Extract union types to ResolversUnionTypes\n\n- [#8895](https://github.com/dotansimha/graphql-code-generator/pull/8895) [`b343626c9`](https://github.com/dotansimha/graphql-code-generator/commit/b343626c978b9ee0f14e314cea6c01ae3dad057c) Thanks [@benkroeger](https://github.com/benkroeger)! - Preserve .js extension when importDocumentNodeExternallyFrom and emitLegacyCommonJSImports is false\n\n## 3.0.1\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n\n- [#8971](https://github.com/dotansimha/graphql-code-generator/pull/8971) [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Always inline referenced fragments within their document. This prevents issues with duplicated fragments or missing fragments.\n\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n\n## 3.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- [#8871](https://github.com/dotansimha/graphql-code-generator/pull/8871) [`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5) Thanks [@B2o5T](https://github.com/B2o5T)! - eslint fixes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 2.13.8\n\n### Patch Changes\n\n- [#8816](https://github.com/dotansimha/graphql-code-generator/pull/8816) [`a98198524`](https://github.com/dotansimha/graphql-code-generator/commit/a9819852443884b43de7c15040ccffc205f9177a) Thanks [@charle692](https://github.com/charle692)! - Fix issue where visitor-plugin-common emitted ESM imports for Operations when emitLegacyCommonJSImports is true\n\n## 2.13.7\n\n### Patch Changes\n\n- [#8755](https://github.com/dotansimha/graphql-code-generator/pull/8755) [`eb454d06c`](https://github.com/dotansimha/graphql-code-generator/commit/eb454d06c977f11f7d4a7b0b07eb80f8fd590560) Thanks [@schmod](https://github.com/schmod)! - avoid using TypeScript namespace imports for enums\n\n## 2.13.6\n\n### Patch Changes\n\n- [#8771](https://github.com/dotansimha/graphql-code-generator/pull/8771) [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/9.0.0) (from `^8.8.0`, in `dependencies`)\n- Updated dependencies [[`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`6c6b6f2df`](https://github.com/dotansimha/graphql-code-generator/commit/6c6b6f2df88a3a37b437a25320dab5590f033316)]:\n  - @graphql-codegen/plugin-helpers@3.1.2\n\n## 2.13.5\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n\n## 2.13.4\n\n### Patch Changes\n\n- [#8686](https://github.com/dotansimha/graphql-code-generator/pull/8686) [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`change-case-all@1.0.15` ↗︎](https://www.npmjs.com/package/change-case-all/v/1.0.15) (from `1.0.14`, in `dependencies`)\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n\n## 2.13.3\n\n### Patch Changes\n\n- [#8664](https://github.com/dotansimha/graphql-code-generator/pull/8664) [`62f655452`](https://github.com/dotansimha/graphql-code-generator/commit/62f6554520955dd675e11c920f35ef9bf0aaeffe) Thanks [@jdmoody](https://github.com/jdmoody)! - Fix issue where selection set flattening uses the wrong parent type\n\n## 2.13.2\n\n### Patch Changes\n\n- [#8586](https://github.com/dotansimha/graphql-code-generator/pull/8586) [`ef4c2c9c2`](https://github.com/dotansimha/graphql-code-generator/commit/ef4c2c9c233c68830f10eb4c167c7cceead27122) Thanks [@levrik](https://github.com/levrik)! - Fix incompatibility between `@oneOf` input types and declaration kind other than `type`\n\n## 2.13.1\n\n### Patch Changes\n\n- [#8525](https://github.com/dotansimha/graphql-code-generator/pull/8525) [`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127) Thanks [@charlypoly](https://github.com/charlypoly)! - remove `DetailledError`, not supported by Listr renderer\n\n- Updated dependencies [[`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127)]:\n  - @graphql-codegen/plugin-helpers@2.7.2\n\n## 2.13.0\n\n### Minor Changes\n\n- [#8498](https://github.com/dotansimha/graphql-code-generator/pull/8498) [`a46b8d99c`](https://github.com/dotansimha/graphql-code-generator/commit/a46b8d99c797283d773ec14163c62be9c84d4c2b) Thanks [@charlypoly](https://github.com/charlypoly)! - Fragment masking ` $fragmentName` and ` $fragmentRefs` are optionals\n\n## 2.12.2\n\n### Patch Changes\n\n- [#8432](https://github.com/dotansimha/graphql-code-generator/pull/8432) [`1bd7f771c`](https://github.com/dotansimha/graphql-code-generator/commit/1bd7f771ccb949a5a37395c7c57cb41c19340714) Thanks [@mvestergaard](https://github.com/mvestergaard)! - Remove extension from operations file import\n\n## 2.12.1\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- [#8185](https://github.com/dotansimha/graphql-code-generator/pull/8185) [`47d0a57e2`](https://github.com/dotansimha/graphql-code-generator/commit/47d0a57e27dd0d2334670bfc6c81c45e00ff4e74) Thanks [@chrisands](https://github.com/chrisands)! - Fix emitLegacyCommonJSImports to being passed\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f)]:\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 2.12.0\n\n### Minor Changes\n\n- 2cbcbb371: Add new flag to emit legacy common js imports. Default it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\n\n  You can use the option in your config:\n\n  ```yaml\n  schema: 'schema.graphql'\n   documents:\n     - 'src/**/*.graphql'\n   emitLegacyCommonJSImports: true\n  ```\n\n  Alternative you can use the CLI to set this option:\n\n  ```bash\n  $ codegen --config-file=config.yml --emit-legacy-common-js-imports\n  ```\n\n### Patch Changes\n\n- Updated dependencies [2cbcbb371]\n  - @graphql-codegen/plugin-helpers@2.6.0\n\n## 2.11.1\n\n### Patch Changes\n\n- 525ad580b: Revert breaking change for Next.js applications that are incapable of resolving an import with a `.js` extension.\n\n## 2.11.0\n\n### Minor Changes\n\n- 68bb30e19: Attach `.js` extension to imports starting with either a `.` or `/` character.\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 2.10.0\n\n### Minor Changes\n\n- aa1e6eafd: Add @Deprecated support for input\n\n### Patch Changes\n\n- a42fcbfe4: docs: Swapping rootValueType with directiveContextTypes for correctness\n- 8b10f22be: Ensure falsy enum values are still mapped\n\n## 2.9.1\n\n### Patch Changes\n\n- d16bebacb: Update @graphql-tools/relay-operation-optimizer package;\n\n  - Previously that package used relay-compiler@12 which has graphql v15 as a peer dependency and it was causing peer dependency warnings if user installs a different version of `graphql` package. Now we forked and released v12 under a different name and removed version range for `graphql` in `peerDependencies` of `relay-compiler`\n\n## 2.9.0\n\n### Minor Changes\n\n- c3d7b7226: support the `@oneOf` directive on input types.\n\n## 2.8.0\n\n### Minor Changes\n\n- f1fb77bd4: feat: Add option to squash exactly similar fragment types\n\n## 2.7.6\n\n### Patch Changes\n\n- 9a5f31cb6: New option `onlyEnums` for Typescript\n\n## 2.7.5\n\n### Patch Changes\n\n- 2966686e9: Generate $fragmentName for fragment subtypes for fragment masking\n\n## 2.7.4\n\n### Patch Changes\n\n- 337fd4f77: WP: [typescript-resolvers] Add directiveContextTypes option\n\n## 2.7.3\n\n### Patch Changes\n\n- 54718c039: Improve @Deprecated Enum Type developer experience\n\n## 2.7.2\n\n### Patch Changes\n\n- 11d05e361: fix(resolvers): fix conflict between `typesPrefix: true` and `enumPrefix: false`\n\n## 2.7.1\n\n### Patch Changes\n\n- fd55e2039: fix incorrect type generation when using the inlineFragmentTypes 'combine' option that resulted in generating masked fragment output.\n\n## 2.7.0\n\n### Minor Changes\n\n- 1479233df: Add new `inlineFragmentTypes` mode `'mask'`, which allows generating masked fragment types.\n\n## 2.6.0\n\n### Minor Changes\n\n- bef4376d5: fix: RequireFields generic making all other fields optional\n\n### Patch Changes\n\n- c8ef37ae0: fix(typescript-resolvers): Fix optional field types\n- be7cb3a82: Performance work: resolvers plugins, documents loading\n- Updated dependencies [754a33715]\n  - @graphql-codegen/plugin-helpers@2.4.0\n\n## 2.5.2\n\n### Patch Changes\n\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 2.5.1\n\n### Patch Changes\n\n- a9f1f1594: Use maybeValue as default output for optionals on preResolveTypes: true\n- 9ea6621ec: add missing ListType method parameters\n\n## 2.5.0\n\n### Minor Changes\n\n- 97ddb487a: feat: GraphQL v16 compatibility\n\n### Patch Changes\n\n- Updated dependencies [97ddb487a]\n  - @graphql-codegen/plugin-helpers@2.3.0\n\n## 2.4.0\n\n### Minor Changes\n\n- ad02cb9b8: Fixed an issue where ResolversParentTypes referenced non-existing fields of ResolversParentTypes when the corresponding type was a mapped enum.\n\n## 2.3.0\n\n### Minor Changes\n\n- b9e85adae: feat(visitor-plugin-common): support custom scalar type from extensions\n\n### Patch Changes\n\n- 3c2c847be: Fix dedupleFragments option for typescript-react-query (and possibly others)\n- Updated dependencies [7c60e5acc]\n  - @graphql-codegen/plugin-helpers@2.2.0\n\n## 2.2.1\n\n### Patch Changes\n\n- 0b090e31a: Apply proper indentation to DirectiveArgs types\n\n## 2.2.0\n\n### Minor Changes\n\n- d6c2d4c09: Allow declaring Argument and InputType field mappings based on directive annotations.\n\n  **WARNING:** Using this option does only change the type definitions.\n\n  For actually ensuring that a type is correct at runtime you will have to use schema transforms (e.g. with [@graphql-tools/utils mapSchema](https://www.graphql-tools.com/docs/schema-directives)) that apply those rules! Otherwise, you might end up with a runtime type mismatch which could cause unnoticed bugs or runtime errors.\n\n  Please use this configuration option with care!\n\n  ```yaml\n  plugins:\n    config:\n      directiveArgumentAndInputFieldMappings:\n        asNumber: number\n  ```\n\n  ```graphql\n  directive @asNumber on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION\n\n  input MyInput {\n    id: ID! @asNumber\n  }\n\n  type User {\n    id: ID!\n  }\n\n  type Query {\n    user(id: ID! @asNumber): User\n  }\n  ```\n\n  Usage e.g. with `typescript-resolvers`\n\n  ```ts\n  const Query: QueryResolvers = {\n    user(_, args) {\n      // args.id is of type 'number'\n    }\n  }\n  ```\n\n- 5086791ac: Allow overwriting the resolver type signature based on directive usages.\n\n  **WARNING:** Using this option does only change the generated type definitions.\n\n  For actually ensuring that a type is correct at runtime you will have to use schema transforms (e.g. with [@graphql-tools/utils mapSchema](https://www.graphql-tools.com/docs/schema-directives)) that apply those rules! Otherwise, you might end up with a runtime type mismatch which could cause unnoticed bugs or runtime errors.\n\n  Example configuration:\n\n  ```yaml\n  config:\n    # This was possible before\n    customResolverFn: ../resolver-types.ts#UnauthenticatedResolver\n    # This is new\n    directiveResolverMappings:\n      authenticated: ../resolvers-types.ts#AuthenticatedResolver\n  ```\n\n  Example mapping file (`resolver-types.ts`):\n\n  ```ts\n  export type UnauthenticatedContext = {\n    user: null\n  }\n\n  export type AuthenticatedContext = {\n    user: { id: string }\n  }\n\n  export type UnauthenticatedResolver<TResult, TParent, _TContext, TArgs> = (\n    parent: TParent,\n    args: TArgs,\n    context: UnauthenticatedContext,\n    info: GraphQLResolveInfo\n  ) => Promise<TResult> | TResult\n\n  export type AuthenticatedResolver<TResult, TParent, _TContext, TArgs> = (\n    parent: TParent,\n    args: TArgs,\n    context: AuthenticatedContext,\n    info: GraphQLResolveInfo\n  ) => Promise<TResult> | TResult\n  ```\n\n  Example Schema:\n\n  ```graphql\n  directive @authenticated on FIELD_DEFINITION\n\n  type Query {\n    yee: String\n    foo: String @authenticated\n  }\n  ```\n\n### Patch Changes\n\n- feeae1c66: Do not throw an error when trying to merge inline fragment usages.\n\n## 2.1.2\n\n### Patch Changes\n\n- 6470e6cc9: fix(plugin-helpers): remove unnecessary import\n- 263570e50: Don't generate duplicate imports for the same identifier\n- Updated dependencies [6470e6cc9]\n- Updated dependencies [35199dedf]\n  - @graphql-codegen/plugin-helpers@2.1.1\n\n## 2.1.1\n\n### Patch Changes\n\n- aabeff181: Don't generate import statements for fragments declared in the file we're outputting to\n\n## 2.1.0\n\n### Minor Changes\n\n- 290170262: add getOperationVariableName function to ClientSideBasePluginConfig class\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- 24185985a: bump graphql-tools package versions\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 2.0.0\n\n### Major Changes\n\n- d80efdec4: Change `preResolveTypes` default to be `true` for more readable types\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- d80efdec4: Add option `inlineFragmentTypes` for deep inlining fragment types within operation types. This `inlineFragmentTypes` is set to `inline` by default (Previous behaviour is `combine`).\n\n  This behavior is the better default for users that only use Fragments for building operations and then want to have access to all the data via the operation type (instead of accessing slices of the data via fragments).\n\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 1.22.0\n\n### Minor Changes\n\n- 9005cc17: add `allowEnumStringTypes` option for allowing string literals as valid return types from resolvers in addition to enum values.\\_\n\n### Patch Changes\n\n- df19a4ed: Allow multiple `{T}` instances in defaultMapper\n- Updated dependencies [470336a1]\n  - @graphql-codegen/plugin-helpers@1.18.8\n\n## 1.21.3\n\n### Patch Changes\n\n- 6762aff5: Fix for array types with @skip @include directives\n\n## 1.21.2\n\n### Patch Changes\n\n- 6aaecf1c: Fix issues with missing sub-fragments when skipTypename: true\n\n## 1.21.1\n\n### Patch Changes\n\n- cf1e5abc: Introduce new feature for removing duplicated fragments\n\n## 1.21.0\n\n### Minor Changes\n\n- 8da7dff6: Skip typechecking on generated values by casting to unknown\n\n### Patch Changes\n\n- dfd25caf: chore(deps): bump graphql-tools versions\n- Updated dependencies [dfd25caf]\n  - @graphql-codegen/plugin-helpers@1.18.7\n\n## 1.20.0\n\n### Minor Changes\n\n- f0b5ea53: Add entireFieldWrapperValue configuration option, to wrap arrays\n- 097bea2f: Added new configuration settings for scalars: `strictScalars` and `defaultScalarType`\n\n### Patch Changes\n\n- d9212aa0: fix(visitor-plugin-common): guard for a runtime type error\n- Updated dependencies [d9212aa0]\n  - @graphql-codegen/plugin-helpers@1.18.5\n\n## 1.19.1\n\n### Patch Changes\n\n- 23862e7e: fix(naming-convention): revert and pin change-case-all dependency for workaround #3256\n- Updated dependencies [23862e7e]\n  - @graphql-codegen/plugin-helpers@1.18.4\n\n## 1.19.0\n\n### Minor Changes\n\n- d4942d04: NEW CONFIG (`onlyResolveTypeForInterfaces`): Allow to generate only \\_\\_resolveType for interfaces\n\n### Patch Changes\n\n- e947f8e3: Allow to have declarationKind of type: class, interface: interface\n- 29b75b1e: enhance(docs): improve docs for naming convention\n- 1f6f3db6: Fix for @skip @include directives upon arrays\n- 29b75b1e: enhance(namingConvention): use change-case-all instead of individual packages for naming convention\n- Updated dependencies [29b75b1e]\n  - @graphql-codegen/plugin-helpers@1.18.3\n\n## 1.18.3\n\n### Patch Changes\n\n- 5749cb8a: chore: fix type-level incompatibilities of the `avoidOptionals`\n- 5a12fe58: fix type error on parsing enums\n\n## 1.18.2\n\n### Patch Changes\n\n- ca66569f: Fix issues with undefined calls for str.replace\n\n## 1.18.1\n\n### Patch Changes\n\n- 63be0f40: Fix issues with empty interfaces causing syntax issues\n- 190482a1: add support for fragment variables\n- 4444348d: Correctly escape enum values defined in the GraphQLSchema object\n- 142b32b3: Better support for @skip/@include directives with complex selection sets\n- 42213fa0: Strip trailing whitespace from some output\n\n## 1.18.0\n\n### Minor Changes\n\n- bd4bf7cf: feat(visitor-plugin-common): add ignoreEnumValuesFromSchema to ignore enum values from GraphQLSchema\n\n## 1.17.22\n\n### Patch Changes\n\n- 64293437: Support for input lists coercion\n- fd5843a7: Fixed a bug where some import namespacing is missed when generating resolver types.\n- d75051f5: generate correct types for fragments with an interface type condition that are spread on an interface field.\n\n## 1.17.21\n\n### Patch Changes\n\n- 8356f8a2: Extended behaviour to allow support in `internalResolversPrefix` flag for resolvers plugin\n\n## 1.17.20\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 1.17.19\n\n### Patch Changes\n\n- 99819bf1: Improve DocumentNode optimization for plugins that generate it\n- c3b59e81: Extract buildMapperImport to external function\n\n## 1.17.18\n\n### Patch Changes\n\n- faa13973: Fixed a bug in `parseMapper` that were preventing to use mappers with complex type usages\n\n## 1.17.17\n\n### Patch Changes\n\n- 612e5e52: remove broken isTypeOf call for expanding fragments with flattenGeneratedTypes = true\n- 9f2a4e2f: Expose `_hasRequiredVariables` to `buildOperation` in order to allow better type-safety for plugins that deals with `variables`\n- 0f35e775: Fix issues with incorrect naming of operation and variables when used with typesSuffix\n- Updated dependencies [eaf45d1f]\n  - @graphql-codegen/plugin-helpers@1.18.1\n\n## 1.17.16\n\n### Patch Changes\n\n- 92d8f876: Fixed unquoted numeric enum identifiers\n\n## 1.17.15\n\n### Patch Changes\n\n- d2cde3d5: fixed isTypeOf resolvers signature\n- 89a6aa80: Fixes issues with typesSuffix and arguments type name\n- f603b8f8: Support unnamed queries in operation visitors\n- Updated dependencies [da8bdd17]\n  - @graphql-codegen/plugin-helpers@1.17.9\n\n## 1.17.14\n\n### Patch Changes\n\n- 07f9b1b2: Fix a bug caused numeric enum values defined in the GraphQLSchema to be printed incorrectly\n- 35f67120: bugfix: allow to specify mappers for GraphQL `interface` and override the default behaviour.\n\n## 1.17.13\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n  - @graphql-codegen/plugin-helpers@1.17.8\n\n## 1.17.12\n\n### Patch Changes\n\n- 4266a15f: Allow getDocumentNodeSignature to control the entire generation flow of the typed documents\n\n## 1.17.11\n\n### Patch Changes\n\n- ee2b01a3: Fixes for issues with publish command\n\n## 1.17.10\n\n### Patch Changes\n\n- 6cb9c96d: Fixes issues with previous release\n\n## 1.17.9\n\n### Patch Changes\n\n- bccfd28c: Allow to set `gqlImport` to a clean `gql` string and skip import generating\n\n## 1.17.8\n\n### Patch Changes\n\n- ce3a5798: Publish minor version to include fixes for client-side-base-visitor, required to v2 of ts-react-apollo plugin (for unified apollo import)\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/visitor-plugin-common\",\n  \"version\": \"6.2.4\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/plugins/other/visitor-plugin-common\"\n  },\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"dependencies\": {\n    \"@graphql-tools/optimize\": \"^2.0.0\",\n    \"@graphql-codegen/plugin-helpers\": \"^6.1.1\",\n    \"@graphql-tools/relay-operation-optimizer\": \"^7.1.1\",\n    \"@graphql-tools/utils\": \"^11.0.0\",\n    \"auto-bind\": \"~4.0.0\",\n    \"dependency-graph\": \"^1.0.0\",\n    \"graphql-tag\": \"^2.11.0\",\n    \"parse-filepath\": \"^1.0.2\",\n    \"change-case-all\": \"1.0.15\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"devDependencies\": {\n    \"@types/parse-filepath\": \"1.0.2\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/avoid-optionals.ts",
    "content": "import { AvoidOptionalsConfig, NormalizedAvoidOptionalsConfig } from './types.js';\n\nexport const DEFAULT_AVOID_OPTIONALS: NormalizedAvoidOptionalsConfig = {\n  object: false,\n  inputValue: false,\n  field: false,\n  defaultValue: false,\n  resolvers: false,\n  query: false,\n  mutation: false,\n  subscription: false,\n};\n\nexport function normalizeAvoidOptionals(\n  avoidOptionals?: boolean | AvoidOptionalsConfig\n): NormalizedAvoidOptionalsConfig {\n  if (typeof avoidOptionals === 'boolean') {\n    return {\n      object: avoidOptionals,\n      inputValue: avoidOptionals,\n      field: avoidOptionals,\n      defaultValue: avoidOptionals,\n      resolvers: avoidOptionals,\n      query: avoidOptionals,\n      mutation: avoidOptionals,\n      subscription: avoidOptionals,\n    };\n  }\n\n  return {\n    ...DEFAULT_AVOID_OPTIONALS,\n    ...avoidOptionals,\n  };\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/base-documents-visitor.ts",
    "content": "import autoBind from 'auto-bind';\nimport { pascalCase } from 'change-case-all';\nimport {\n  FragmentDefinitionNode,\n  GraphQLSchema,\n  OperationDefinitionNode,\n  OperationTypeNode,\n  VariableDefinitionNode,\n} from 'graphql';\nimport { ParsedTypesConfig, RawTypesConfig } from './base-types-visitor.js';\nimport { BaseVisitor } from './base-visitor.js';\nimport { DEFAULT_SCALARS } from './scalars.js';\nimport { SelectionSetToObject } from './selection-set-to-object.js';\nimport { NormalizedScalarsMap, CustomDirectivesConfig } from './types.js';\nimport { buildScalarsFromConfig, DeclarationBlock, DeclarationBlockConfig, getConfigValue } from './utils.js';\nimport { OperationVariablesToObject } from './variables-to-object.js';\n\nfunction getRootType(operation: OperationTypeNode, schema: GraphQLSchema) {\n  switch (operation) {\n    case 'query':\n      return schema.getQueryType();\n    case 'mutation':\n      return schema.getMutationType();\n    case 'subscription':\n      return schema.getSubscriptionType();\n  }\n  throw new Error(`Unknown operation type: ${operation}`);\n}\n\nexport interface ParsedDocumentsConfig extends ParsedTypesConfig {\n  addTypename: boolean;\n  preResolveTypes: boolean;\n  extractAllFieldsToTypes: boolean;\n  globalNamespace: boolean;\n  operationResultSuffix: string;\n  dedupeOperationSuffix: boolean;\n  omitOperationSuffix: boolean;\n  namespacedImportName: string | null;\n  exportFragmentSpreadSubTypes: boolean;\n  skipTypeNameForRoot: boolean;\n  experimentalFragmentVariables: boolean;\n  mergeFragmentTypes: boolean;\n  customDirectives: CustomDirectivesConfig;\n}\n\nexport interface RawDocumentsConfig extends RawTypesConfig {\n  /**\n   * @default true\n   * @description Uses primitive types where possible.\n   * Set to `false` in order to use `Pick` and take use the types generated by `typescript` plugin.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          preResolveTypes: false\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  preResolveTypes?: boolean;\n  /**\n   * @default false\n   * @description Avoid adding `__typename` for root types. This is ignored when a selection explicitly specifies `__typename`.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          skipTypeNameForRoot: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  skipTypeNameForRoot?: boolean;\n  /**\n   * @default false\n   * @description Puts all generated code under `global` namespace. Useful for Stencil integration.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          globalNamespace: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  globalNamespace?: boolean;\n  /**\n   * @default \"\"\n   * @description Adds a suffix to generated operation result type names\n   */\n  operationResultSuffix?: string;\n  /**\n   * @default false\n   * @description Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\n   */\n  dedupeOperationSuffix?: boolean;\n  /**\n   * @default false\n   * @description Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\n   */\n  omitOperationSuffix?: boolean;\n  /**\n   * @default false\n   * @description If set to true, it will export the sub-types created in order to make it easier to access fields declared under fragment spread.\n   */\n  exportFragmentSpreadSubTypes?: boolean;\n  /**\n   * @default false\n   * @description If set to true, it will enable support for parsing variables on fragments.\n   */\n  experimentalFragmentVariables?: boolean;\n  /**\n   * @default false\n   * @description If set to true, merge equal fragment interfaces.\n   */\n  mergeFragmentTypes?: boolean;\n\n  // The following are internal, and used by presets\n  /**\n   * @ignore\n   */\n  namespacedImportName?: string;\n\n  /**\n   * @description Configures behavior for use with custom directives from\n   * various GraphQL libraries.\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript'],\n   *        config: {\n   *          customDirectives: {\n   *            apolloUnmask: true\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  customDirectives?: CustomDirectivesConfig;\n}\n\nexport class BaseDocumentsVisitor<\n  TRawConfig extends RawDocumentsConfig = RawDocumentsConfig,\n  TPluginConfig extends ParsedDocumentsConfig = ParsedDocumentsConfig\n> extends BaseVisitor<TRawConfig, TPluginConfig> {\n  protected _unnamedCounter = 1;\n  protected _variablesTransfomer: OperationVariablesToObject;\n  protected _selectionSetToObject: SelectionSetToObject;\n  protected _globalDeclarations: Set<string> = new Set<string>();\n\n  constructor(\n    rawConfig: TRawConfig,\n    additionalConfig: TPluginConfig,\n    protected _schema: GraphQLSchema,\n    defaultScalars: NormalizedScalarsMap = DEFAULT_SCALARS\n  ) {\n    super(rawConfig, {\n      exportFragmentSpreadSubTypes: getConfigValue(rawConfig.exportFragmentSpreadSubTypes, false),\n      enumPrefix: getConfigValue(rawConfig.enumPrefix, true),\n      enumSuffix: getConfigValue(rawConfig.enumSuffix, true),\n      preResolveTypes: getConfigValue(rawConfig.preResolveTypes, true),\n      dedupeOperationSuffix: getConfigValue(rawConfig.dedupeOperationSuffix, false),\n      omitOperationSuffix: getConfigValue(rawConfig.omitOperationSuffix, false),\n      skipTypeNameForRoot: getConfigValue(rawConfig.skipTypeNameForRoot, false),\n      namespacedImportName: getConfigValue(rawConfig.namespacedImportName, null),\n      experimentalFragmentVariables: getConfigValue(rawConfig.experimentalFragmentVariables, false),\n      addTypename: !rawConfig.skipTypename,\n      globalNamespace: !!rawConfig.globalNamespace,\n      operationResultSuffix: getConfigValue(rawConfig.operationResultSuffix, ''),\n      scalars: buildScalarsFromConfig(_schema, rawConfig, defaultScalars),\n      customDirectives: getConfigValue(rawConfig.customDirectives, { apolloUnmask: false }),\n      ...((additionalConfig || {}) as any),\n    });\n\n    autoBind(this);\n    this._variablesTransfomer = new OperationVariablesToObject(\n      this.scalars,\n      this.convertName,\n      this.config.namespacedImportName\n    );\n  }\n\n  public getGlobalDeclarations(noExport = false): string[] {\n    return Array.from(this._globalDeclarations).map(t => (noExport ? t : `export ${t}`));\n  }\n\n  setSelectionSetHandler(handler: SelectionSetToObject): void {\n    this._selectionSetToObject = handler;\n  }\n\n  setDeclarationBlockConfig(config: DeclarationBlockConfig): void {\n    this._declarationBlockConfig = config;\n  }\n\n  setVariablesTransformer(variablesTransfomer: OperationVariablesToObject): void {\n    this._variablesTransfomer = variablesTransfomer;\n  }\n\n  public get schema(): GraphQLSchema {\n    return this._schema;\n  }\n\n  public get addTypename(): boolean {\n    return this._parsedConfig.addTypename;\n  }\n\n  private handleAnonymousOperation(node: OperationDefinitionNode): string {\n    const name = node.name?.value;\n\n    if (name) {\n      return this.convertName(name, {\n        useTypesPrefix: false,\n        useTypesSuffix: false,\n      });\n    }\n\n    return this.convertName(String(this._unnamedCounter++), {\n      prefix: 'Unnamed_',\n      suffix: '_',\n      useTypesPrefix: false,\n      useTypesSuffix: false,\n    });\n  }\n\n  FragmentDefinition(node: FragmentDefinitionNode): string {\n    const fragmentRootType = this._schema.getType(node.typeCondition.name.value);\n    const selectionSet = this._selectionSetToObject.createNext(fragmentRootType, node.selectionSet);\n    const fragmentSuffix = this.getFragmentSuffix(node);\n    return [\n      selectionSet.transformFragmentSelectionSetToTypes(node.name.value, fragmentSuffix, this._declarationBlockConfig),\n      this.config.experimentalFragmentVariables\n        ? new DeclarationBlock({\n            ...this._declarationBlockConfig,\n            blockTransformer: t => this.applyVariablesWrapper(t),\n          })\n            .export()\n            .asKind('type')\n            .withName(\n              this.convertName(node.name.value, {\n                suffix: fragmentSuffix + 'Variables',\n              })\n            )\n            .withBlock(this._variablesTransfomer.transform(node.variableDefinitions)).string\n        : undefined,\n    ]\n      .filter(r => r)\n      .join('\\n\\n');\n  }\n\n  protected applyVariablesWrapper(variablesBlock: string, _operationType?: string): string {\n    return variablesBlock;\n  }\n\n  OperationDefinition(node: OperationDefinitionNode): string {\n    const name = this.handleAnonymousOperation(node);\n    const operationRootType = getRootType(node.operation, this._schema);\n\n    if (!operationRootType) {\n      throw new Error(`Unable to find root schema type for operation type \"${node.operation}\"!`);\n    }\n\n    const selectionSet = this._selectionSetToObject.createNext(operationRootType, node.selectionSet);\n    const visitedOperationVariables = this._variablesTransfomer.transform<VariableDefinitionNode>(\n      node.variableDefinitions\n    );\n    const operationType: string = pascalCase(node.operation);\n    const operationTypeSuffix = this.getOperationSuffix(name, operationType);\n    const selectionSetObjects = selectionSet.transformSelectionSet(\n      this.convertName(name, {\n        suffix: operationTypeSuffix,\n      })\n    );\n\n    const operationResult = new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind('type')\n      .withName(\n        this.convertName(name, {\n          suffix: operationTypeSuffix + this._parsedConfig.operationResultSuffix,\n        })\n      )\n      .withContent(selectionSetObjects.mergedTypeString).string;\n\n    const operationVariables = new DeclarationBlock({\n      ...this._declarationBlockConfig,\n      blockTransformer: t => this.applyVariablesWrapper(t, operationType),\n    })\n      .export()\n      .asKind('type')\n      .withName(\n        this.convertName(name, {\n          suffix: operationTypeSuffix + 'Variables',\n        })\n      )\n      .withBlock(visitedOperationVariables).string;\n\n    const dependentTypesContent = this._parsedConfig.extractAllFieldsToTypes\n      ? selectionSetObjects.dependentTypes.map(\n          i =>\n            new DeclarationBlock(this._declarationBlockConfig)\n              .export()\n              .asKind('type')\n              .withName(i.name)\n              .withContent(i.content).string\n        )\n      : [];\n\n    return [\n      ...(dependentTypesContent.length > 0 ? [dependentTypesContent.join('\\n')] : []),\n      operationVariables,\n      operationResult,\n    ]\n      .filter(r => r)\n      .join('\\n\\n');\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/base-resolvers-visitor.ts",
    "content": "import { ApolloFederation, type FederationMeta, getBaseType } from '@graphql-codegen/plugin-helpers';\nimport { getRootTypeNames } from '@graphql-tools/utils';\nimport autoBind from 'auto-bind';\nimport {\n  ASTNode,\n  DirectiveDefinitionNode,\n  EnumTypeDefinitionNode,\n  FieldDefinitionNode,\n  GraphQLInterfaceType,\n  GraphQLNamedType,\n  GraphQLObjectType,\n  GraphQLSchema,\n  GraphQLUnionType,\n  InputValueDefinitionNode,\n  InterfaceTypeDefinitionNode,\n  isEnumType,\n  isInterfaceType,\n  isNonNullType,\n  isObjectType,\n  isUnionType,\n  ListTypeNode,\n  NamedTypeNode,\n  NonNullTypeNode,\n  ObjectTypeDefinitionNode,\n  ScalarTypeDefinitionNode,\n  UnionTypeDefinitionNode,\n} from 'graphql';\nimport { BaseVisitor, BaseVisitorConvertOptions, ParsedConfig, RawConfig } from './base-visitor.js';\nimport { parseEnumValues } from './enum-values.js';\nimport { buildMapperImport, ExternalParsedMapper, ParsedMapper, parseMapper, transformMappers } from './mappers.js';\nimport { DEFAULT_SCALARS } from './scalars.js';\nimport {\n  AvoidOptionalsConfig,\n  ConvertOptions,\n  DeclarationKind,\n  EnumValuesMap,\n  NormalizedAvoidOptionalsConfig,\n  NormalizedScalarsMap,\n  ParsedEnumValuesMap,\n  ResolversNonOptionalTypenameConfig,\n} from './types.js';\nimport {\n  buildScalarsFromConfig,\n  DeclarationBlock,\n  DeclarationBlockConfig,\n  getBaseTypeNode,\n  getConfigValue,\n  indent,\n  OMIT_TYPE,\n  REQUIRE_FIELDS_TYPE,\n  stripMapperTypeInterpolation,\n  wrapTypeWithModifiers,\n} from './utils.js';\nimport { OperationVariablesToObject } from './variables-to-object.js';\nimport { normalizeAvoidOptionals } from './avoid-optionals.js';\n\nexport interface ParsedResolversConfig extends ParsedConfig {\n  contextType: ParsedMapper;\n  fieldContextTypes: Array<string>;\n  directiveContextTypes: Array<string>;\n  rootValueType: ParsedMapper;\n  mappers: {\n    [typeName: string]: ParsedMapper;\n  };\n  defaultMapper: ParsedMapper | null;\n  avoidOptionals: NormalizedAvoidOptionalsConfig;\n  addUnderscoreToArgsType: boolean;\n  addInterfaceFieldResolverTypes: boolean;\n  enumValues: ParsedEnumValuesMap;\n  resolverTypeWrapperSignature: string;\n  federation: boolean;\n  enumPrefix: boolean;\n  enumSuffix: boolean;\n  optionalResolveType: boolean;\n  immutableTypes: boolean;\n  namespacedImportName: string;\n  resolverTypeSuffix: string;\n  allResolversTypeName: string;\n  internalResolversPrefix: string;\n  directiveResolverMappings: Record<string, string>;\n  resolversNonOptionalTypename: ResolversNonOptionalTypenameConfig;\n  avoidCheckingAbstractTypesRecursively: boolean;\n}\n\nexport interface FieldDefinitionResult {\n  node: FieldDefinitionNode;\n  printContent: FieldDefinitionPrintFn;\n}\n\ntype FieldDefinitionPrintFn = (\n  parentNode: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode,\n  avoidResolverOptionals: boolean\n) => { value: string | null; meta: { federation?: { isResolveReference: boolean } } };\nexport interface RootResolver {\n  content: string;\n  generatedResolverTypes: {\n    resolversMap: { name: string };\n    userDefined: Record<\n      string,\n      {\n        name: string;\n        hasIsTypeOf: boolean;\n        federation?: { hasResolveReference: boolean };\n      }\n    >;\n  };\n}\n\nexport interface RawResolversConfig extends RawConfig {\n  /**\n   * @description Adds `_` to generated `Args` types in order to avoid duplicate identifiers.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          addUnderscoreToArgsType: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   */\n  addUnderscoreToArgsType?: boolean;\n  /**\n   * @description Use this configuration to set a custom type for your `context`, and it will\n   * affect all the resolvers, without the need to override it using generics each time.\n   * If you wish to use an external type and import it from another file, you can use `add` plugin\n   * and add the required `import` statement, or you can use a `module#type` syntax.\n   *\n   * @exampleMarkdown\n   * ## Custom Context Type\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          contextType: 'MyContext'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Custom Context Type by Path\n   *\n   * Note that the path should be relative to the generated file.\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          contextType: './my-types#MyContext'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  contextType?: string;\n  /**\n   * @description Use this to set a custom type for a specific field `context`.\n   * It will only affect the targeted resolvers.\n   * You can either use `Field.Path#ContextTypeName` or `Field.Path#ExternalFileName#ContextTypeName`\n   *\n   * @exampleMarkdown\n   * ## Custom Field Context Types\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          fieldContextTypes: ['MyType.foo#CustomContextType', 'MyType.bar#./my-file#ContextTypeOne']\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   */\n  fieldContextTypes?: Array<string>;\n  /**\n   * @description Use this configuration to set a custom type for the `rootValue`, and it will\n   * affect resolvers of all root types (Query, Mutation and Subscription), without the need to override it using generics each time.\n   * If you wish to use an external type and import it from another file, you can use `add` plugin\n   * and add the required `import` statement, or you can use both `module#type` or `module#namespace#type` syntax.\n   *\n   * @exampleMarkdown\n   * ## Custom RootValue Type\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          rootValueType: 'MyRootValue'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Custom RootValue Type\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          rootValueType: './my-types#MyRootValue'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  rootValueType?: string;\n  /**\n   * @description Use this to set a custom type for a specific field `context` decorated by a directive.\n   * It will only affect the targeted resolvers.\n   * You can either use `Field.Path#ContextTypeName` or `Field.Path#ExternalFileName#ContextTypeName`\n   *\n   * ContextTypeName should by a generic Type that take the context or field context type as only type parameter.\n   *\n   * @exampleMarkdown\n   * ## Directive Context Extender\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          directiveContextTypes: ['myCustomDirectiveName#./my-file#CustomContextExtender']\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   */\n  directiveContextTypes?: Array<string>;\n  /**\n   * @description Adds a suffix to the imported names to prevent name clashes.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          mapperTypeSuffix: 'Model'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  mapperTypeSuffix?: string;\n  /**\n   * @description Replaces a GraphQL type usage with a custom type, allowing you to return custom object from\n   * your resolvers.\n   * You can use both `module#type` and `module#namespace#type` syntax.\n   *\n   * @exampleMarkdown\n   * ## Custom Context Type\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          mappers: {\n   *            User: './my-models#UserDbObject',\n   *            Book: './my-models#Collections',\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  mappers?: { [typeName: string]: string };\n  /**\n   * @description Allow you to set the default mapper when it's not being override by `mappers` or generics.\n   * You can specify a type name, or specify a string in `module#type` or `module#namespace#type` format.\n   * The default value of mappers is the TypeScript type generated by `typescript` package.\n   *\n   * @exampleMarkdown\n   * ## Replace with any\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          defaultMapper: 'any',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Custom Base Object\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          defaultMapper: './my-file#BaseObject',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Wrap default types with Partial\n   *\n   * You can also specify a custom wrapper for the original type, without overriding the original generated types, use `{T}` to specify the identifier. (for flow, use `$Shape<{T}>`)\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          defaultMapper: 'Partial<{T}>',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Allow deep partial with `utility-types`\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        plugins: ['typescript', 'typescript-resolver', { add: { content: \"import { DeepPartial } from 'utility-types';\" } }],\n   *        config: {\n   *          defaultMapper: 'DeepPartial<{T}>',\n   *          avoidCheckingAbstractTypesRecursively: true // required if you have complex nested abstract types\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  defaultMapper?: string;\n  /**\n   * @description This will cause the generator to avoid using optionals (`?`),\n   * so all field resolvers must be implemented in order to avoid compilation errors.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ## Override all definition types\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        plugins: ['typescript', 'typescript-resolver'],\n   *        config: {\n   *          avoidOptionals: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Override only specific definition types\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        plugins: ['typescript', 'typescript-resolver'],\n   *        config: {\n   *          avoidOptionals: {\n   *            field: true,\n   *            inputValue: true,\n   *            object: true,\n   *            defaultValue: true,\n   *            query: true,\n   *            mutation: true,\n   *            subscription: true,\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  avoidOptionals?: boolean | AvoidOptionalsConfig;\n  /**\n   * @description Warns about unused mappers.\n   * @default true\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        plugins: ['typescript', 'typescript-resolver'],\n   *        config: {\n   *          showUnusedMappers: true,\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  showUnusedMappers?: boolean;\n  /**\n   * @description Overrides the default value of enum values declared in your GraphQL schema, supported\n   * in this plugin because of the need for integration with `typescript` package.\n   * See documentation under `typescript` plugin for more information and examples.\n   */\n  enumValues?: EnumValuesMap;\n  /**\n   * @default Promise<T> | T\n   * @description Allow you to override `resolverTypeWrapper` definition.\n   */\n  resolverTypeWrapperSignature?: string;\n  /**\n   * @default false\n   * @description Supports Apollo Federation\n   */\n  federation?: boolean;\n  /**\n   * @default true\n   * @description Allow you to disable prefixing for generated enums, works in combination with `typesPrefix`.\n   *\n   * @exampleMarkdown\n   * ## Disable enum prefixes\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        plugins: ['typescript', 'typescript-resolver'],\n   *        config: {\n   *          typesPrefix: 'I',\n   *          enumPrefix: false\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  enumPrefix?: boolean;\n\n  /**\n   * @default true\n   * @description Allow you to disable suffixing for generated enums, works in combination with `typesSuffix`.\n   *\n   * @exampleMarkdown\n   * ## Disable enum suffixes\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        plugins: ['typescript', 'typescript-resolver'],\n   *        config: {\n   *          typesSuffix: 'I',\n   *          enumSuffix: false\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  enumSuffix?: boolean;\n  /**\n   * @description Configures behavior for custom directives from various GraphQL libraries.\n   * @exampleMarkdown\n   * ## `@semanticNonNull`\n   * First, install `graphql-sock` peer dependency:\n   *\n   * ```sh npm2yarn\n   * npm install -D graphql-sock\n   * ```\n   *\n   * Now, you can enable support for `@semanticNonNull` directive:\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript-resolvers'],\n   *        config: {\n   *          customDirectives: {\n   *            semanticNonNull: true\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  customDirectives?: {\n    semanticNonNull?: boolean;\n  };\n  /**\n   * @default false\n   * @description Sets the `__resolveType` field as optional field.\n   */\n  optionalResolveType?: boolean;\n  /**\n   * @default false\n   * @description Generates immutable types by adding `readonly` to properties and uses `ReadonlyArray`.\n   */\n  immutableTypes?: boolean;\n  /**\n   * @default ''\n   * @description Prefixes all GraphQL related generated types with that value, as namespaces import.\n   * You can use this feature to allow separation of plugins to different files.\n   */\n  namespacedImportName?: string;\n  /**\n   * @default Resolvers\n   * @description Suffix we add to each generated type resolver.\n   */\n  resolverTypeSuffix?: string;\n  /**\n   * @default Resolvers\n   * @description The type name to use when exporting all resolvers signature as unified type.\n   */\n  allResolversTypeName?: string;\n  /**\n   * @type string\n   * @default '__'\n   * @description Defines the prefix value used for `__resolveType` and `__isTypeOf` resolvers.\n   * If you are using `mercurius-js`, please set this field to empty string for better compatibility.\n   */\n  internalResolversPrefix?: string;\n  /**\n   * @description Makes `__typename` of resolver mappings non-optional without affecting the base types.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ## Enable for all\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        plugins: ['typescript', 'typescript-resolver'],\n   *        config: {\n   *          resolversNonOptionalTypename: true // or { unionMember: true, interfaceImplementingType: true }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Enable except for some types\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        plugins: ['typescript', 'typescript-resolver'],\n   *        config: {\n   *          resolversNonOptionalTypename: {\n   *            unionMember: true,\n   *            interfaceImplementingType: true,\n   *            excludeTypes: ['MyType'],\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  resolversNonOptionalTypename?: boolean | ResolversNonOptionalTypenameConfig;\n  /**\n   * @type boolean\n   * @default false\n   * @description If true, recursively goes through all object type's fields, checks if they have abstract types and generates expected types correctly.\n   * This may not work for cases where provided default mapper types are also nested e.g. `defaultMapper: DeepPartial<{T}>` or `defaultMapper: Partial<{T}>`.\n   */\n  avoidCheckingAbstractTypesRecursively?: boolean;\n  /**\n   * @description If true, add field resolver types to Interfaces.\n   * By default, GraphQL Interfaces do not trigger any field resolvers,\n   * meaning every implementing type must implement the same resolver for the shared fields.\n   *\n   * Some tools provide a way to change the default behaviour by making GraphQL Objects inherit\n   * missing resolvers from their Interface types. In these cases, it is fine to turn this option to true.\n   *\n   * For example, if you are using `@graphql-tools/schema#makeExecutableSchema` with `inheritResolversFromInterfaces: true`,\n   * you can make `addInterfaceFieldResolverTypes: true` as well\n   * https://the-guild.dev/graphql/tools/docs/generate-schema#makeexecutableschema\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file': {\n   *       plugins: ['typescript', 'typescript-resolver'],\n   *       config: {\n   *         addInterfaceFieldResolverTypes: true,\n   *       },\n   *     },\n   *   },\n   * };\n   * export default config;\n   * ```\n   *\n   * @type boolean\n   * @default false\n   */\n  addInterfaceFieldResolverTypes?: boolean;\n  /**\n   * @ignore\n   */\n  directiveResolverMappings?: Record<string, string>;\n}\n\nexport type ResolverTypes = { [gqlType: string]: string };\nexport type ResolverParentTypes = { [gqlType: string]: string };\nexport type GroupedMappers = Record<string, { identifier: string; asDefault?: boolean }[]>;\ntype FieldContextTypeMap = Record<string, ParsedMapper>;\n\nexport class BaseResolversVisitor<\n  TRawConfig extends RawResolversConfig = RawResolversConfig,\n  TPluginConfig extends ParsedResolversConfig = ParsedResolversConfig\n> extends BaseVisitor<TRawConfig, TPluginConfig> {\n  protected declare _parsedConfig: TPluginConfig;\n  protected _declarationBlockConfig: DeclarationBlockConfig = {};\n  protected _collectedResolvers: {\n    [key: string]: {\n      typename: string;\n      baseGeneratedTypename?: string;\n    };\n  } = {};\n  protected _parsedSchemaMeta: {\n    types: {\n      interface: Record<\n        string,\n        {\n          type: GraphQLInterfaceType;\n          implementingTypes: Record<string, GraphQLObjectType>;\n        }\n      >;\n      union: Record<\n        string,\n        {\n          type: GraphQLUnionType;\n          unionMembers: Record<string, GraphQLObjectType>;\n        }\n      >;\n    };\n    typesWithIsTypeOf: Record<string, true>;\n  } = {\n    types: {\n      interface: {},\n      union: {},\n    },\n    typesWithIsTypeOf: {},\n  };\n  protected _collectedDirectiveResolvers: { [key: string]: string } = {};\n  protected _variablesTransformer: OperationVariablesToObject;\n  protected _usedMappers: { [key: string]: boolean } = {};\n  protected _resolversTypes: ResolverTypes = {};\n  protected _resolversParentTypes: ResolverParentTypes = {};\n  protected _hasReferencedResolversUnionTypes = false;\n  protected _hasReferencedResolversInterfaceTypes = false;\n  protected _resolversUnionTypes: Record<string, string> = {};\n  protected _resolversInterfaceTypes: Record<string, string> = {};\n  protected _rootTypeNames = new Set<string>();\n  protected _globalDeclarations = new Set<string>();\n  protected _federation: ApolloFederation;\n  protected _hasScalars = false;\n  protected _fieldContextTypeMap: FieldContextTypeMap;\n  protected _directiveContextTypesMap: FieldContextTypeMap;\n  protected _checkedTypesWithNestedAbstractTypes: Record<string, { checkStatus: 'yes' | 'no' | 'checking' }> = {};\n  private _directiveResolverMappings: Record<string, string>;\n  private _shouldMapType: { [typeName: string]: boolean } = {};\n\n  constructor(\n    rawConfig: TRawConfig,\n    additionalConfig: TPluginConfig,\n    private _schema: GraphQLSchema,\n    defaultScalars: NormalizedScalarsMap = DEFAULT_SCALARS,\n    federationMeta: FederationMeta = {}\n  ) {\n    super(rawConfig, {\n      immutableTypes: getConfigValue(rawConfig.immutableTypes, false),\n      optionalResolveType: getConfigValue(rawConfig.optionalResolveType, false),\n      enumPrefix: getConfigValue(rawConfig.enumPrefix, true),\n      enumSuffix: getConfigValue(rawConfig.enumSuffix, true),\n      federation: getConfigValue(rawConfig.federation, false),\n      resolverTypeWrapperSignature: getConfigValue(rawConfig.resolverTypeWrapperSignature, 'Promise<T> | T'),\n      enumValues: parseEnumValues({\n        schema: _schema,\n        mapOrStr: rawConfig.enumValues,\n      }),\n      addUnderscoreToArgsType: getConfigValue(rawConfig.addUnderscoreToArgsType, false),\n      addInterfaceFieldResolverTypes: getConfigValue(rawConfig.addInterfaceFieldResolverTypes, false),\n      contextType: parseMapper(rawConfig.contextType || 'any', 'ContextType'),\n      fieldContextTypes: getConfigValue(rawConfig.fieldContextTypes, []),\n      directiveContextTypes: getConfigValue(rawConfig.directiveContextTypes, []),\n      resolverTypeSuffix: getConfigValue(rawConfig.resolverTypeSuffix, 'Resolvers'),\n      allResolversTypeName: getConfigValue(rawConfig.allResolversTypeName, 'Resolvers'),\n      rootValueType: parseMapper(rawConfig.rootValueType || 'Record<PropertyKey, never>', 'RootValueType'),\n      namespacedImportName: getConfigValue(rawConfig.namespacedImportName, ''),\n      avoidOptionals: normalizeAvoidOptionals(rawConfig.avoidOptionals),\n      defaultMapper: rawConfig.defaultMapper\n        ? parseMapper(rawConfig.defaultMapper || 'any', 'DefaultMapperType')\n        : null,\n      mappers: transformMappers(rawConfig.mappers || {}, rawConfig.mapperTypeSuffix),\n      scalars: buildScalarsFromConfig(_schema, rawConfig, defaultScalars),\n      internalResolversPrefix: getConfigValue(rawConfig.internalResolversPrefix, '__'),\n      generateInternalResolversIfNeeded: {},\n      resolversNonOptionalTypename: normalizeResolversNonOptionalTypename(\n        getConfigValue(rawConfig.resolversNonOptionalTypename, false)\n      ),\n      avoidCheckingAbstractTypesRecursively: getConfigValue(rawConfig.avoidCheckingAbstractTypesRecursively, false),\n      ...additionalConfig,\n    } as TPluginConfig);\n\n    autoBind(this);\n    this._federation = new ApolloFederation({\n      enabled: this.config.federation,\n      schema: this.schema,\n      meta: federationMeta,\n    });\n    this._rootTypeNames = getRootTypeNames(_schema);\n    this._variablesTransformer = new OperationVariablesToObject(\n      this.scalars,\n      this.convertName,\n      this.config.namespacedImportName\n    );\n\n    // 1. Parse schema meta at the start once,\n    // so we can use it in subsequent generate functions\n    this.parseSchemaMeta();\n\n    // 2. Generate types for resolvers\n    this._resolversTypes = this.createResolversFields({\n      applyWrapper: type => this.applyResolverTypeWrapper(type),\n      clearWrapper: type => this.clearResolverTypeWrapper(type),\n      getTypeToUse: name => this.getTypeToUse(name),\n      currentType: 'ResolversTypes',\n      onNotMappedObjectType: ({ initialType }) => initialType,\n    });\n    this._resolversParentTypes = this.createResolversFields({\n      applyWrapper: type => type,\n      clearWrapper: type => type,\n      getTypeToUse: name => this.getParentTypeToUse(name),\n      currentType: 'ResolversParentTypes',\n      shouldInclude: namedType => !isEnumType(namedType),\n      onNotMappedObjectType: ({ typeName, initialType }) => {\n        let result = initialType;\n        if (this._federation.getMeta()[typeName]?.referenceSelectionSetsString) {\n          result += ` | ${this.convertName('FederationReferenceTypes')}['${typeName}']`;\n        }\n        return result;\n      },\n    });\n    this._resolversUnionTypes = this.createResolversUnionTypes();\n    this._resolversInterfaceTypes = this.createResolversInterfaceTypes();\n    this._fieldContextTypeMap = this.createFieldContextTypeMap();\n    this._directiveContextTypesMap = this.createDirectivedContextType();\n    this._directiveResolverMappings = rawConfig.directiveResolverMappings ?? {};\n  }\n\n  public getResolverTypeWrapperSignature(): string {\n    return `export type ResolverTypeWrapper<T> = ${this.config.resolverTypeWrapperSignature};`;\n  }\n\n  protected shouldMapType(type: GraphQLNamedType, duringCheck: string[] = []): boolean {\n    if (type.name.startsWith('__') || this.config.scalars[type.name]) {\n      return false;\n    }\n\n    if (this.config.mappers[type.name]) {\n      return true;\n    }\n\n    if (isObjectType(type) || isInterfaceType(type)) {\n      const fields = type.getFields();\n\n      return Object.keys(fields)\n        .filter(fieldName => {\n          const field = fields[fieldName];\n          const fieldType = getBaseType(field.type);\n\n          return !duringCheck.includes(fieldType.name);\n        })\n        .some(fieldName => {\n          const field = fields[fieldName];\n          const fieldType = getBaseType(field.type);\n\n          if (this._shouldMapType[fieldType.name] !== undefined) {\n            return this._shouldMapType[fieldType.name];\n          }\n\n          if (this.config.mappers[type.name]) {\n            return true;\n          }\n\n          duringCheck.push(type.name);\n          const innerResult = this.shouldMapType(fieldType, duringCheck);\n\n          return innerResult;\n        });\n    }\n\n    return false;\n  }\n\n  public convertName(\n    node: ASTNode | string,\n    options?: BaseVisitorConvertOptions & ConvertOptions,\n    applyNamespacedImport = false\n  ): string {\n    const sourceType = super.convertName(node, options);\n\n    return `${\n      applyNamespacedImport && this.config.namespacedImportName ? this.config.namespacedImportName + '.' : ''\n    }${sourceType}`;\n  }\n\n  // Kamil: this one is heeeeavvyyyy\n  protected createResolversFields({\n    applyWrapper,\n    clearWrapper,\n    getTypeToUse,\n    currentType,\n    shouldInclude,\n    onNotMappedObjectType,\n  }: {\n    applyWrapper: (str: string) => string;\n    clearWrapper: (str: string) => string;\n    getTypeToUse: (str: string) => string;\n    currentType: 'ResolversTypes' | 'ResolversParentTypes';\n    shouldInclude?: (type: GraphQLNamedType) => boolean;\n    onNotMappedObjectType: (params: { initialType: string; typeName: string }) => string;\n  }): ResolverTypes {\n    const allSchemaTypes = this._schema.getTypeMap();\n    const typeNames = this._federation.filterTypeNames(Object.keys(allSchemaTypes));\n\n    // avoid checking all types recursively if we have no `mappers` defined\n    if (Object.keys(this.config.mappers).length > 0) {\n      for (const typeName of typeNames) {\n        if (this._shouldMapType[typeName] === undefined) {\n          const schemaType = allSchemaTypes[typeName];\n          this._shouldMapType[typeName] = this.shouldMapType(schemaType);\n        }\n      }\n    }\n\n    return typeNames.reduce<ResolverTypes>((prev, typeName) => {\n      const schemaType = allSchemaTypes[typeName];\n\n      if (typeName.startsWith('__') || (shouldInclude && !shouldInclude(schemaType))) {\n        return prev;\n      }\n\n      const isRootType = this._rootTypeNames.has(typeName);\n      const isMapped = this.config.mappers[typeName];\n      const isScalar = this.config.scalars[typeName];\n      const hasDefaultMapper = !!this.config.defaultMapper?.type;\n\n      // Check for mappers first, even for root types, to allow overriding rootValueType\n      if (isMapped && this.config.mappers[typeName].type && !hasPlaceholder(this.config.mappers[typeName].type)) {\n        this.markMapperAsUsed(typeName);\n        prev[typeName] = applyWrapper(this.config.mappers[typeName].type);\n\n        return prev;\n      }\n\n      if (isRootType) {\n        prev[typeName] = applyWrapper(this.config.rootValueType.type);\n\n        return prev;\n      }\n      if (isEnumType(schemaType) && this.config.enumValues[typeName]) {\n        const isExternalFile = !!this.config.enumValues[typeName].sourceFile;\n        prev[typeName] = isExternalFile\n          ? this.convertName(this.config.enumValues[typeName].typeIdentifier, {\n              useTypesPrefix: false,\n              useTypesSuffix: false,\n            })\n          : this.config.enumValues[typeName].sourceIdentifier;\n      } else if (hasDefaultMapper && !hasPlaceholder(this.config.defaultMapper.type)) {\n        prev[typeName] = applyWrapper(this.config.defaultMapper.type);\n      } else if (isScalar) {\n        prev[typeName] = applyWrapper(this._getScalar(typeName));\n      } else if (isInterfaceType(schemaType)) {\n        this._hasReferencedResolversInterfaceTypes = true;\n        const type = this.convertName('ResolversInterfaceTypes');\n        const generic = this.convertName(currentType);\n        prev[typeName] = applyWrapper(`${type}<${generic}>['${typeName}']`);\n        return prev;\n      } else if (isUnionType(schemaType)) {\n        this._hasReferencedResolversUnionTypes = true;\n        const type = this.convertName('ResolversUnionTypes');\n        const generic = this.convertName(currentType);\n        prev[typeName] = applyWrapper(`${type}<${generic}>['${typeName}']`);\n      } else if (isEnumType(schemaType)) {\n        prev[typeName] = this.convertName(\n          typeName,\n          {\n            useTypesPrefix: this.config.enumPrefix,\n            useTypesSuffix: this.config.enumSuffix,\n          },\n          true\n        );\n      } else {\n        prev[typeName] = this.convertName(typeName, {}, true);\n\n        if (prev[typeName] !== 'any' && isObjectType(schemaType)) {\n          const relevantFields = this.getRelevantFieldsToOmit({\n            schemaType,\n            getTypeToUse,\n            shouldInclude,\n          });\n\n          // If relevantFields, puts ResolverTypeWrapper on top of an entire type\n          let internalType =\n            relevantFields.length > 0 ? this.replaceFieldsInType(prev[typeName], relevantFields) : prev[typeName];\n\n          if (isMapped) {\n            // replace the placeholder with the actual type\n            if (hasPlaceholder(internalType)) {\n              internalType = replacePlaceholder(internalType, typeName);\n            }\n            if (this.config.mappers[typeName].type && hasPlaceholder(this.config.mappers[typeName].type)) {\n              internalType = replacePlaceholder(this.config.mappers[typeName].type, internalType);\n            }\n          } else {\n            internalType = onNotMappedObjectType({\n              typeName,\n              initialType: internalType,\n            });\n          }\n\n          prev[typeName] = applyWrapper(internalType);\n        }\n      }\n\n      if (!isMapped && hasDefaultMapper && hasPlaceholder(this.config.defaultMapper.type)) {\n        const originalTypeName = isScalar ? this._getScalar(typeName) : prev[typeName];\n\n        if (isUnionType(schemaType)) {\n          // Don't clear ResolverTypeWrapper from Unions\n          prev[typeName] = replacePlaceholder(this.config.defaultMapper.type, originalTypeName);\n        } else {\n          const name = clearWrapper(originalTypeName);\n          const replaced = replacePlaceholder(this.config.defaultMapper.type, name);\n          prev[typeName] = applyWrapper(replaced);\n        }\n      }\n\n      return prev;\n    }, {});\n  }\n\n  protected replaceFieldsInType(\n    typeName: string,\n    relevantFields: ReturnType<typeof this.getRelevantFieldsToOmit>\n  ): string {\n    this._globalDeclarations.add(OMIT_TYPE);\n    return `Omit<${typeName}, ${relevantFields.map(f => `'${f.fieldName}'`).join(' | ')}> & { ${relevantFields\n      .map(f => `${f.fieldName}${f.addOptionalSign ? '?' : ''}: ${f.replaceWithType}`)\n      .join(', ')} }`;\n  }\n\n  protected applyMaybe(str: string): string {\n    const namespacedImportPrefix = this.config.namespacedImportName ? this.config.namespacedImportName + '.' : '';\n    return `${namespacedImportPrefix}Maybe<${str}>`;\n  }\n\n  protected applyResolverTypeWrapper(str: string): string {\n    return `ResolverTypeWrapper<${this.clearResolverTypeWrapper(str)}>`;\n  }\n\n  protected clearMaybe(str: string): string {\n    const namespacedImportPrefix = this.config.namespacedImportName ? this.config.namespacedImportName + '.' : '';\n    if (str.startsWith(`${namespacedImportPrefix}Maybe<`)) {\n      const maybeRe = new RegExp(`${namespacedImportPrefix.replace('.', '\\\\.')}Maybe<(.*?)>$`);\n      return str.replace(maybeRe, '$1');\n    }\n\n    return str;\n  }\n\n  protected clearResolverTypeWrapper(str: string): string {\n    if (str.startsWith('ResolverTypeWrapper<')) {\n      return str.replace(/ResolverTypeWrapper<(.*?)>$/, '$1');\n    }\n\n    return str;\n  }\n\n  protected wrapWithArray(t: string): string {\n    if (this.config.immutableTypes) {\n      return `ReadonlyArray<${t}>`;\n    }\n\n    return `Array<${t}>`;\n  }\n\n  protected createResolversUnionTypes(): Record<string, string> {\n    if (!this._hasReferencedResolversUnionTypes) {\n      return {};\n    }\n\n    const unionTypes = Object.entries(this._parsedSchemaMeta.types.union).reduce<Record<string, string>>(\n      (res, [typeName, { type: schemaType, unionMembers }]) => {\n        if (isUnionType(schemaType)) {\n          const { unionMember, excludeTypes } = this.config.resolversNonOptionalTypename;\n          res[typeName] = this.getAbstractMembersType({\n            typeName,\n            memberTypes: Object.values(unionMembers),\n            isTypenameNonOptional: unionMember && !excludeTypes?.includes(typeName),\n          });\n        }\n        return res;\n      },\n      {}\n    );\n\n    return unionTypes;\n  }\n\n  protected createResolversInterfaceTypes(): Record<string, string> {\n    if (!this._hasReferencedResolversInterfaceTypes) {\n      return {};\n    }\n\n    const interfaceTypes = Object.entries(this._parsedSchemaMeta.types.interface).reduce<Record<string, string>>(\n      (res, [typeName, { type: schemaType, implementingTypes }]) => {\n        if (isInterfaceType(schemaType)) {\n          const { interfaceImplementingType, excludeTypes } = this.config.resolversNonOptionalTypename;\n\n          res[typeName] = this.getAbstractMembersType({\n            typeName,\n            memberTypes: Object.values(implementingTypes),\n            isTypenameNonOptional: interfaceImplementingType && !excludeTypes?.includes(typeName),\n          });\n        }\n\n        return res;\n      },\n      {}\n    );\n\n    return interfaceTypes;\n  }\n\n  /**\n   * Function to generate the types of Abstract Type Members i.e. Union Members or Interface Implementing Types\n   */\n  getAbstractMembersType({\n    typeName,\n    memberTypes,\n    isTypenameNonOptional,\n  }: {\n    typeName: string;\n    memberTypes: readonly GraphQLObjectType[] | GraphQLObjectType[];\n    isTypenameNonOptional: boolean;\n  }): string {\n    const members = memberTypes\n      .map(type => {\n        const isTypeMapped = this.config.mappers[type.name];\n        // 1. If mapped without placehoder, just use it without doing extra checks\n        if (isTypeMapped && !hasPlaceholder(isTypeMapped.type)) {\n          return { typename: type.name, typeValue: isTypeMapped.type };\n        }\n\n        // 2. Work out value for type\n        // 2a. By default, use the typescript type\n        let typeValue = this.convertName(type.name, {}, true);\n\n        // 2b. Find fields to Omit if needed.\n        //  - If no field to Omit, \"type with maybe Omit\" is typescript type i.e. no Omit\n        //  - If there are fields to Omit, keep track of these \"type with maybe Omit\" to replace in original unionMemberValue\n        const fieldsToOmit = this.getRelevantFieldsToOmit({\n          schemaType: type,\n          getTypeToUse: baseType => `_RefType['${baseType}']`,\n        });\n        if (fieldsToOmit.length > 0) {\n          typeValue = this.replaceFieldsInType(typeValue, fieldsToOmit);\n        }\n\n        // 2c. If type is mapped with placeholder, use the \"type with maybe Omit\" as {T}\n        if (isTypeMapped && hasPlaceholder(isTypeMapped.type)) {\n          return { typename: type.name, typeValue: replacePlaceholder(isTypeMapped.type, typeValue) };\n        }\n\n        // 2d. If has default mapper with placeholder, use the \"type with maybe Omit\" as {T}\n        const hasDefaultMapper = !!this.config.defaultMapper?.type;\n        const isScalar = this.config.scalars[typeName];\n        if (hasDefaultMapper && hasPlaceholder(this.config.defaultMapper.type)) {\n          const finalTypename = isScalar ? this._getScalar(typeName) : typeValue;\n          return {\n            typename: type.name,\n            typeValue: replacePlaceholder(this.config.defaultMapper.type, finalTypename),\n          };\n        }\n\n        return { typename: type.name, typeValue };\n      })\n      .map(({ typename, typeValue }) => {\n        const nonOptionalTypenameModifier = isTypenameNonOptional ? ` & { __typename: '${typename}' }` : '';\n\n        return `( ${typeValue}${nonOptionalTypenameModifier} )`; // Must wrap every type in explicit \"( )\" to separate them\n      });\n    const result =\n      members.length === 0\n        ? 'never'\n        : members.length > 1\n        ? `\\n    | ${members.map(m => m.replace(/\\n/g, '\\n  ')).join('\\n    | ')}\\n  `\n        : members.join(' | ');\n    return result;\n  }\n\n  protected createFieldContextTypeMap(): FieldContextTypeMap {\n    return this.config.fieldContextTypes.reduce<FieldContextTypeMap>((prev, fieldContextType) => {\n      const isScoped = fieldContextType.includes('\\\\#');\n      if (fieldContextType.includes('\\\\#')) {\n        fieldContextType = fieldContextType.replace('\\\\#', '');\n      }\n      const items = fieldContextType.split('#');\n      if (items.length === 3) {\n        const [path, source, contextTypeName] = items;\n        const sourceStr = isScoped ? `\\\\#${source}` : source;\n        return { ...prev, [path]: parseMapper(`${sourceStr}#${contextTypeName}`) };\n      }\n      const [path, contextType] = items;\n      return { ...prev, [path]: parseMapper(contextType) };\n    }, {});\n  }\n  protected createDirectivedContextType(): FieldContextTypeMap {\n    return this.config.directiveContextTypes.reduce<FieldContextTypeMap>((prev, fieldContextType) => {\n      const isScoped = fieldContextType.includes('\\\\#');\n      if (fieldContextType.includes('\\\\#')) {\n        fieldContextType = fieldContextType.replace('\\\\#', '');\n      }\n      const items = fieldContextType.split('#');\n      if (items.length === 3) {\n        const [path, source, contextTypeName] = items;\n        const sourceStr = isScoped ? `\\\\#${source}` : source;\n        return { ...prev, [path]: parseMapper(`${sourceStr}#${contextTypeName}`) };\n      }\n      const [path, contextType] = items;\n      return { ...prev, [path]: parseMapper(contextType) };\n    }, {});\n  }\n\n  public buildResolversTypes(): string {\n    const declarationKind = 'type';\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(declarationKind)\n      .withName(this.convertName('ResolversTypes'))\n      .withComment('Mapping between all available schema types and the resolvers types')\n      .withBlock(\n        Object.keys(this._resolversTypes)\n          .map(typeName =>\n            indent(`${typeName}: ${this._resolversTypes[typeName]}${this.getPunctuation(declarationKind)}`)\n          )\n          .join('\\n')\n      ).string;\n  }\n\n  public buildResolversParentTypes(): string {\n    const declarationKind = 'type';\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(declarationKind)\n      .withName(this.convertName('ResolversParentTypes'))\n      .withComment('Mapping between all available schema types and the resolvers parents')\n      .withBlock(\n        Object.keys(this._resolversParentTypes)\n          .map(typeName =>\n            indent(`${typeName}: ${this._resolversParentTypes[typeName]}${this.getPunctuation(declarationKind)}`)\n          )\n          .join('\\n')\n      ).string;\n  }\n\n  public buildResolversUnionTypes(): string {\n    if (Object.keys(this._resolversUnionTypes).length === 0) {\n      return '';\n    }\n\n    const declarationKind = 'type';\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(declarationKind)\n      .withName(this.convertName('ResolversUnionTypes'), `<_RefType extends Record<string, unknown>>`)\n      .withComment('Mapping of union types')\n      .withBlock(\n        Object.entries(this._resolversUnionTypes)\n          .map(([typeName, value]) => indent(`${typeName}: ${value}${this.getPunctuation(declarationKind)}`))\n          .join('\\n')\n      ).string;\n  }\n\n  public buildResolversInterfaceTypes(): string {\n    if (Object.keys(this._resolversInterfaceTypes).length === 0) {\n      return '';\n    }\n\n    const declarationKind = 'type';\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(declarationKind)\n      .withName(this.convertName('ResolversInterfaceTypes'), `<_RefType extends Record<string, unknown>>`)\n      .withComment('Mapping of interface types')\n      .withBlock(\n        Object.entries(this._resolversInterfaceTypes)\n          .map(([typeName, value]) => indent(`${typeName}: ${value}${this.getPunctuation(declarationKind)}`))\n          .join('\\n')\n      ).string;\n  }\n\n  public buildFederationTypes(): string {\n    const federationMeta = this._federation.getMeta();\n\n    if (Object.keys(federationMeta).length === 0) {\n      return '';\n    }\n\n    const declarationKind = 'type';\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(declarationKind)\n      .withName(this.convertName('FederationTypes'))\n      .withComment('Mapping of federation types')\n      .withBlock(\n        Object.keys(federationMeta)\n          .map(typeName => {\n            return indent(`${typeName}: ${this.convertName(typeName)}${this.getPunctuation(declarationKind)}`);\n          })\n          .join('\\n')\n      ).string;\n  }\n\n  public buildFederationReferenceTypes(): string {\n    const federationMeta = this._federation.getMeta();\n\n    if (Object.keys(federationMeta).length === 0) {\n      return '';\n    }\n\n    const declarationKind = 'type';\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(declarationKind)\n      .withName(this.convertName('FederationReferenceTypes'))\n      .withComment('Mapping of federation reference types')\n      .withBlock(\n        Object.entries(federationMeta)\n          .map(([typeName, { referenceSelectionSetsString }]) => {\n            if (!referenceSelectionSetsString) {\n              return undefined;\n            }\n\n            return indent(`${typeName}: ${referenceSelectionSetsString}${this.getPunctuation(declarationKind)}`);\n          })\n          .filter(v => v)\n          .join('\\n')\n      ).string;\n  }\n\n  public get schema(): GraphQLSchema {\n    return this._schema;\n  }\n\n  public get defaultMapperType(): string {\n    return this.config.defaultMapper.type;\n  }\n\n  public get unusedMappers() {\n    return Object.keys(this.config.mappers).filter(name => !this._usedMappers[name]);\n  }\n\n  public get globalDeclarations(): string[] {\n    return Array.from(this._globalDeclarations);\n  }\n\n  protected isMapperImported(groupedMappers: GroupedMappers, identifier: string, source: string): boolean {\n    const exists = groupedMappers[source] ? !!groupedMappers[source].find(m => m.identifier === identifier) : false;\n    const existsFromEnums = !!Object.keys(this.config.enumValues)\n      .map(key => this.config.enumValues[key])\n      .find(o => o.sourceFile === source && o.typeIdentifier === identifier);\n\n    return exists || existsFromEnums;\n  }\n\n  public get mappersImports(): string[] {\n    const groupedMappers: GroupedMappers = {};\n\n    const addMapper = (source: string, identifier: string, asDefault: boolean) => {\n      if (!this.isMapperImported(groupedMappers, identifier, source)) {\n        groupedMappers[source] ||= [];\n\n        groupedMappers[source].push({ identifier, asDefault });\n      }\n    };\n\n    for (const { mapper } of Object.keys(this.config.mappers)\n      .map(gqlTypeName => ({ gqlType: gqlTypeName, mapper: this.config.mappers[gqlTypeName] }))\n      .filter(({ mapper }) => mapper.isExternal)) {\n      const externalMapper = mapper as ExternalParsedMapper;\n      const identifier = stripMapperTypeInterpolation(externalMapper.import);\n      addMapper(externalMapper.source, identifier, externalMapper.default);\n    }\n\n    if (this.config.contextType.isExternal) {\n      addMapper(this.config.contextType.source, this.config.contextType.import, this.config.contextType.default);\n    }\n\n    if (this.config.rootValueType.isExternal) {\n      addMapper(this.config.rootValueType.source, this.config.rootValueType.import, this.config.rootValueType.default);\n    }\n\n    if (this.config.defaultMapper?.isExternal) {\n      const identifier = stripMapperTypeInterpolation(this.config.defaultMapper.import);\n      addMapper(this.config.defaultMapper.source, identifier, this.config.defaultMapper.default);\n    }\n\n    for (const parsedMapper of Object.values(this._fieldContextTypeMap)) {\n      if (parsedMapper.isExternal) {\n        addMapper(parsedMapper.source, parsedMapper.import, parsedMapper.default);\n      }\n    }\n\n    for (const parsedMapper of Object.values(this._directiveContextTypesMap)) {\n      if (parsedMapper.isExternal) {\n        addMapper(parsedMapper.source, parsedMapper.import, parsedMapper.default);\n      }\n    }\n\n    return Object.keys(groupedMappers)\n      .map(source => buildMapperImport(source, groupedMappers[source], this.config.useTypeImports))\n      .filter(Boolean);\n  }\n\n  setDeclarationBlockConfig(config: DeclarationBlockConfig): void {\n    this._declarationBlockConfig = config;\n  }\n\n  setVariablesTransformer(variablesTransfomer: OperationVariablesToObject): void {\n    this._variablesTransformer = variablesTransfomer;\n  }\n\n  public hasScalars(): boolean {\n    return this._hasScalars;\n  }\n\n  public hasFederation(): boolean {\n    return Object.keys(this._federation.getMeta()).length > 0;\n  }\n\n  public getRootResolver(): RootResolver {\n    const name = this.convertName(this.config.allResolversTypeName);\n    const declarationKind = 'type';\n    const contextType = `<ContextType = ${this.config.contextType.type}>`;\n\n    const userDefinedTypes: RootResolver['generatedResolverTypes']['userDefined'] = {};\n    const content = [\n      new DeclarationBlock(this._declarationBlockConfig)\n        .export()\n        .asKind(declarationKind)\n        .withName(name, contextType)\n        .withBlock(\n          Object.keys(this._collectedResolvers)\n            .map(schemaTypeName => {\n              const resolverType = this._collectedResolvers[schemaTypeName];\n\n              if (resolverType.baseGeneratedTypename) {\n                userDefinedTypes[schemaTypeName] = {\n                  name: resolverType.baseGeneratedTypename,\n                  hasIsTypeOf: this._parsedSchemaMeta.typesWithIsTypeOf[schemaTypeName] || false,\n                };\n\n                const federationMeta = this._federation.getMeta()[schemaTypeName];\n                if (federationMeta) {\n                  userDefinedTypes[schemaTypeName].federation = {\n                    hasResolveReference: federationMeta.hasResolveReference,\n                  };\n                }\n              }\n\n              return indent(this.formatRootResolver(schemaTypeName, resolverType.typename, declarationKind));\n            })\n            .join('\\n')\n        ).string,\n    ].join('\\n');\n\n    return {\n      content,\n      generatedResolverTypes: {\n        resolversMap: { name },\n        userDefined: userDefinedTypes,\n      },\n    };\n  }\n\n  protected formatRootResolver(schemaTypeName: string, resolverType: string, declarationKind: DeclarationKind): string {\n    return `${schemaTypeName}${this.config.avoidOptionals.resolvers ? '' : '?'}: ${resolverType}${this.getPunctuation(\n      declarationKind\n    )}`;\n  }\n\n  public getAllDirectiveResolvers(): string {\n    if (Object.keys(this._collectedDirectiveResolvers).length) {\n      const declarationKind = 'type';\n      const name = this.convertName('DirectiveResolvers');\n      const contextType = `<ContextType = ${this.config.contextType.type}>`;\n\n      return [\n        new DeclarationBlock(this._declarationBlockConfig)\n          .export()\n          .asKind(declarationKind)\n          .withName(name, contextType)\n          .withBlock(\n            Object.keys(this._collectedDirectiveResolvers)\n              .map(schemaTypeName => {\n                const resolverType = this._collectedDirectiveResolvers[schemaTypeName];\n\n                return indent(this.formatRootResolver(schemaTypeName, resolverType, declarationKind));\n              })\n              .join('\\n')\n          ).string,\n      ].join('\\n');\n    }\n\n    return '';\n  }\n\n  ListType(node: ListTypeNode): string {\n    const asString = node.type as any as string;\n\n    return this.wrapWithArray(asString);\n  }\n\n  protected _getScalar(name: string): string {\n    return `${\n      this.config.namespacedImportName ? this.config.namespacedImportName + '.' : ''\n    }Scalars['${name}']['output']`;\n  }\n\n  NamedType(node: NamedTypeNode): string {\n    const nameStr = node.name.value;\n\n    if (this.config.scalars[nameStr]) {\n      return this._getScalar(nameStr);\n    }\n\n    return this.convertName(node, null, true);\n  }\n\n  NonNullType(node: NonNullTypeNode): string {\n    const asString = node.type as any as string;\n\n    return asString;\n  }\n\n  protected markMapperAsUsed(name: string): void {\n    this._usedMappers[name] = true;\n  }\n\n  protected getTypeToUse(name: string): string {\n    const resolversType = this.convertName('ResolversTypes');\n\n    return `${resolversType}['${name}']`;\n  }\n\n  protected getParentTypeToUse(name: string): string {\n    const resolversType = this.convertName('ResolversParentTypes');\n\n    return `${resolversType}['${name}']`;\n  }\n\n  protected getParentTypeForSignature(_node: FieldDefinitionNode): string {\n    return 'ParentType';\n  }\n\n  protected transformParentGenericType(parentType: string): string {\n    return `ParentType extends ${parentType} = ${parentType}`;\n  }\n\n  FieldDefinition(node: FieldDefinitionNode, key: string | number, parent: any): FieldDefinitionResult {\n    const hasArguments = node.arguments && node.arguments.length > 0;\n    const declarationKind = 'type';\n\n    const original: FieldDefinitionNode = parent[key];\n\n    return {\n      node: original,\n      printContent: (parentNode, avoidResolverOptionals) => {\n        const parentName = parentNode.name.value;\n        const parentType = this.schema.getType(parentName);\n        const meta: ReturnType<FieldDefinitionPrintFn>['meta'] = {};\n        const typeName = node.name.value;\n\n        const fieldsToGenerate = this._federation.findFieldNodesToGenerate({ node: parentNode });\n        const shouldGenerateField =\n          fieldsToGenerate.some(field => field.name.value === typeName) ||\n          this._federation.isResolveReferenceField(node);\n\n        if (!shouldGenerateField) {\n          return { value: null, meta };\n        }\n\n        const contextType = this.getContextType(parentName, node);\n\n        let argsType = hasArguments\n          ? this.convertName(\n              parentName +\n                (this.config.addUnderscoreToArgsType ? '_' : '') +\n                this.convertName(typeName, {\n                  useTypesPrefix: false,\n                  useTypesSuffix: false,\n                }) +\n                'Args',\n              {\n                useTypesPrefix: true,\n              },\n              true\n            )\n          : null;\n\n        const avoidInputsOptionals = this.config.avoidOptionals.inputValue;\n\n        if (argsType !== null) {\n          const argsToForceRequire = original.arguments.filter(\n            arg => !!arg.defaultValue || arg.type.kind === 'NonNullType'\n          );\n\n          if (argsToForceRequire.length > 0) {\n            argsType = this.applyRequireFields(argsType, argsToForceRequire);\n          } else if (original.arguments.length > 0 && avoidInputsOptionals !== true) {\n            argsType = this.applyOptionalFields(argsType, original.arguments);\n          }\n        }\n\n        const { mappedTypeKey, resolverType } = ((): { mappedTypeKey: string; resolverType: string } => {\n          const baseType = getBaseTypeNode(original.type);\n          const realType = baseType.name.value;\n          const typeToUse = this.getTypeToUse(realType);\n          /**\n           * Turns GraphQL type to TypeScript types (`mappedType`) e.g.\n           * - String!  -> ResolversTypes['String']>\n           * - String   -> Maybe<ResolversTypes['String']>\n           * - [String] -> Maybe<Array<Maybe<ResolversTypes['String']>>>\n           * - [String!]! -> Array<ResolversTypes['String']>\n           */\n          const mappedType = this._variablesTransformer.wrapAstTypeWithModifiers(typeToUse, original.type);\n\n          const subscriptionType = this._schema.getSubscriptionType();\n          const isSubscriptionType = subscriptionType && subscriptionType.name === parentName;\n\n          if (isSubscriptionType) {\n            return {\n              mappedTypeKey: `${mappedType}, \"${typeName}\"`,\n              resolverType: 'SubscriptionResolver',\n            };\n          }\n\n          const directiveMappings =\n            node.directives\n              ?.map(directive => this._directiveResolverMappings[directive.name.value])\n              .filter(Boolean)\n              .reverse() ?? [];\n\n          return {\n            mappedTypeKey: mappedType,\n            resolverType: directiveMappings[0] ?? 'Resolver',\n          };\n        })();\n\n        const signature: {\n          name: string;\n          modifier: string;\n          type: string;\n          genericTypes: string[];\n        } = {\n          name: typeName,\n          modifier: avoidResolverOptionals ? '' : '?',\n          type: resolverType,\n          genericTypes: [mappedTypeKey, this.getParentTypeForSignature(node), contextType, argsType].filter(f => f),\n        };\n\n        if (this._federation.isResolveReferenceField(node)) {\n          if (!this._federation.getMeta()[parentType.name].hasResolveReference) {\n            return { value: '', meta };\n          }\n          const resultType = `${mappedTypeKey} | FederationReferenceType`;\n          const referenceType = 'FederationReferenceType';\n\n          signature.type = 'ReferenceResolver';\n          signature.genericTypes = [resultType, referenceType, contextType];\n          meta.federation = { isResolveReference: true };\n        }\n\n        return {\n          value: indent(\n            `${signature.name}${signature.modifier}: ${signature.type}<${signature.genericTypes.join(\n              ', '\n            )}>${this.getPunctuation(declarationKind)}`\n          ),\n          meta,\n        };\n      },\n    };\n  }\n\n  private getFieldContextType(parentName: string, node: FieldDefinitionNode): string {\n    if (this._fieldContextTypeMap[`${parentName}.${node.name.value}`]) {\n      return this._fieldContextTypeMap[`${parentName}.${node.name.value}`].type;\n    }\n    return 'ContextType';\n  }\n\n  private getContextType(parentName: string, node: FieldDefinitionNode): string {\n    let contextType = this.getFieldContextType(parentName, node);\n\n    for (const directive of node.directives) {\n      const name = directive.name.value;\n      const directiveMap = this._directiveContextTypesMap[name];\n      if (directiveMap) {\n        contextType = `${directiveMap.type}<${contextType}>`;\n      }\n    }\n    return contextType;\n  }\n\n  private parseSchemaMeta(): void {\n    const allSchemaTypes = this._schema.getTypeMap();\n    const typeNames = this._federation.filterTypeNames(Object.keys(allSchemaTypes));\n\n    for (const typeName of typeNames) {\n      const schemaType = allSchemaTypes[typeName];\n\n      if (isUnionType(schemaType)) {\n        this._parsedSchemaMeta.types.union[schemaType.name] = {\n          type: schemaType,\n          unionMembers: {},\n        };\n\n        const unionMemberTypes = schemaType.getTypes();\n        for (const type of unionMemberTypes) {\n          this._parsedSchemaMeta.types.union[schemaType.name].unionMembers[type.name] = type;\n          this._parsedSchemaMeta.typesWithIsTypeOf[type.name] = true;\n        }\n      }\n\n      if (isInterfaceType(schemaType)) {\n        this._parsedSchemaMeta.types.interface[schemaType.name] = {\n          type: schemaType,\n          implementingTypes: {},\n        };\n\n        for (const graphqlType of Object.values(allSchemaTypes)) {\n          if (graphqlType instanceof GraphQLObjectType) {\n            const allInterfaces = graphqlType.getInterfaces();\n\n            if (allInterfaces.some(int => int.name === schemaType.name)) {\n              this._parsedSchemaMeta.types.interface[schemaType.name].implementingTypes[graphqlType.name] = graphqlType;\n              this._parsedSchemaMeta.typesWithIsTypeOf[graphqlType.name] = true;\n            }\n          }\n        }\n      }\n    }\n  }\n\n  protected applyRequireFields(argsType: string, fields: InputValueDefinitionNode[]): string {\n    this._globalDeclarations.add(REQUIRE_FIELDS_TYPE);\n    return `RequireFields<${argsType}, ${fields.map(f => `'${f.name.value}'`).join(' | ')}>`;\n  }\n\n  protected applyOptionalFields(argsType: string, _fields: readonly InputValueDefinitionNode[]): string {\n    return `Partial<${argsType}>`;\n  }\n\n  ObjectTypeDefinition(node: ObjectTypeDefinitionNode): string | null {\n    const typeName = node.name.value;\n    const fieldsToGenerate = this._federation.findFieldNodesToGenerate({ node });\n    if (fieldsToGenerate.length === 0) {\n      return null;\n    }\n\n    const declarationKind = 'type';\n    const name = this.convertName(node, {\n      suffix: this.config.resolverTypeSuffix,\n    });\n    const parentType = this.getParentTypeToUse(typeName);\n\n    const rootType = ((): false | 'query' | 'mutation' | 'subscription' => {\n      if (this.schema.getQueryType()?.name === typeName) {\n        return 'query';\n      }\n      if (this.schema.getMutationType()?.name === typeName) {\n        return 'mutation';\n      }\n      if (this.schema.getSubscriptionType()?.name === typeName) {\n        return 'subscription';\n      }\n      return false;\n    })();\n\n    const fieldsContent = (node.fields as unknown as FieldDefinitionResult[])\n      .map(({ printContent }) => {\n        return printContent(\n          node,\n          (rootType === 'query' && this.config.avoidOptionals.query) ||\n            (rootType === 'mutation' && this.config.avoidOptionals.mutation) ||\n            (rootType === 'subscription' && this.config.avoidOptionals.subscription) ||\n            (rootType === false && this.config.avoidOptionals.resolvers)\n        ).value;\n      })\n      .filter(v => v);\n\n    if (!rootType && this._parsedSchemaMeta.typesWithIsTypeOf[typeName]) {\n      fieldsContent.push(\n        indent(\n          `${\n            this.config.internalResolversPrefix\n          }isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>${this.getPunctuation(declarationKind)}`\n        )\n      );\n    }\n\n    if (fieldsContent.length === 0) {\n      return null;\n    }\n\n    const genericTypes: string[] = [\n      `ContextType = ${this.config.contextType.type}`,\n      this.transformParentGenericType(parentType),\n    ];\n    this._federation.addFederationTypeGenericIfApplicable({\n      genericTypes,\n      federationTypesType: this.convertName('FederationReferenceTypes'),\n      typeName,\n    });\n\n    const block = new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(declarationKind)\n      .withName(name, `<${genericTypes.join(', ')}>`)\n      .withBlock(fieldsContent.join('\\n'));\n\n    this._collectedResolvers[node.name.value] = {\n      typename: name + '<ContextType>',\n      baseGeneratedTypename: name,\n    };\n\n    return block.string;\n  }\n\n  UnionTypeDefinition(node: UnionTypeDefinitionNode, key: string | number, parent: any): string {\n    const declarationKind = 'type';\n    const name = this.convertName(node, {\n      suffix: this.config.resolverTypeSuffix,\n    });\n    const originalNode = parent[key] as UnionTypeDefinitionNode;\n    const possibleTypes = originalNode.types\n      .map(node => node.name.value)\n      .map(f => `'${f}'`)\n      .join(' | ');\n\n    this._collectedResolvers[node.name.value] = {\n      typename: name + '<ContextType>',\n      baseGeneratedTypename: name,\n    };\n    const parentType = this.getParentTypeToUse(node.name.value);\n\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(declarationKind)\n      .withName(name, `<ContextType = ${this.config.contextType.type}, ${this.transformParentGenericType(parentType)}>`)\n      .withBlock(\n        indent(\n          `${this.config.internalResolversPrefix}resolveType${\n            this.config.optionalResolveType ? '?' : ''\n          }: TypeResolveFn<${possibleTypes}, ParentType, ContextType>${this.getPunctuation(declarationKind)}`\n        )\n      ).string;\n  }\n\n  ScalarTypeDefinition(node: ScalarTypeDefinitionNode): string {\n    const nameAsString = node.name.value;\n    const baseName = this.getTypeToUse(nameAsString);\n\n    if (this._federation.skipScalar(nameAsString)) {\n      return null;\n    }\n\n    this._hasScalars = true;\n    this._collectedResolvers[node.name.value] = {\n      typename: 'GraphQLScalarType',\n    };\n\n    return new DeclarationBlock({\n      ...this._declarationBlockConfig,\n      blockTransformer(block) {\n        return block;\n      },\n    })\n      .export()\n      .asKind('interface')\n      .withName(\n        this.convertName(node, {\n          suffix: 'ScalarConfig',\n        }),\n        ` extends GraphQLScalarTypeConfig<${baseName}, any>`\n      )\n      .withBlock(indent(`name: '${node.name.value}'${this.getPunctuation('interface')}`)).string;\n  }\n\n  DirectiveDefinition(node: DirectiveDefinitionNode, key: string | number, parent: any): string {\n    if (this._federation.skipDirective(node.name.value)) {\n      return null;\n    }\n\n    const directiveName = this.convertName(node, {\n      suffix: 'DirectiveResolver',\n    });\n    const sourceNode = parent[key] as DirectiveDefinitionNode;\n    const hasArguments = sourceNode.arguments && sourceNode.arguments.length > 0;\n\n    this._collectedDirectiveResolvers[node.name.value] = directiveName + '<any, any, ContextType>';\n\n    const directiveArgsTypeName = this.convertName(node, {\n      suffix: 'DirectiveArgs',\n    });\n\n    return [\n      new DeclarationBlock({\n        ...this._declarationBlockConfig,\n        blockTransformer(block) {\n          return block;\n        },\n      })\n        .export()\n        .asKind('type')\n        .withName(directiveArgsTypeName)\n        .withContent(\n          hasArguments\n            ? `{\\n${this._variablesTransformer.transform<InputValueDefinitionNode>(sourceNode.arguments)}\\n}`\n            : '{ }'\n        ).string,\n      new DeclarationBlock({\n        ...this._declarationBlockConfig,\n        blockTransformer(block) {\n          return block;\n        },\n      })\n        .export()\n        .asKind('type')\n        .withName(\n          directiveName,\n          `<Result, Parent, ContextType = ${this.config.contextType.type}, Args = ${directiveArgsTypeName}>`\n        )\n        .withContent(`DirectiveResolverFn<Result, Parent, ContextType, Args>`).string,\n    ].join('\\n');\n  }\n\n  protected buildEnumResolverContentBlock(_node: EnumTypeDefinitionNode, _mappedEnumType: string): string {\n    throw new Error(`buildEnumResolverContentBlock is not implemented!`);\n  }\n\n  protected buildEnumResolversExplicitMappedValues(\n    _node: EnumTypeDefinitionNode,\n    _valuesMapping: { [valueName: string]: string | number }\n  ): string {\n    throw new Error(`buildEnumResolversExplicitMappedValues is not implemented!`);\n  }\n\n  EnumTypeDefinition(node: EnumTypeDefinitionNode): string {\n    const rawTypeName = node.name.value;\n\n    // If we have enumValues set, and it's point to an external enum - we need to allow internal values resolvers\n    // In case we have enumValues set but as explicit values, no need to to do mapping since it's already\n    // have type validation (the original enum has been modified by base types plugin).\n    // If we have mapper for that type - we can skip\n    if (!this.config.mappers[rawTypeName] && !this.config.enumValues[rawTypeName]) {\n      return null;\n    }\n\n    const name = this.convertName(node, { suffix: this.config.resolverTypeSuffix });\n    this._collectedResolvers[rawTypeName] = {\n      typename: name,\n      baseGeneratedTypename: name,\n    };\n    const hasExplicitValues = this.config.enumValues[rawTypeName]?.mappedValues;\n\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind('type')\n      .withName(name)\n      .withContent(\n        hasExplicitValues\n          ? this.buildEnumResolversExplicitMappedValues(node, this.config.enumValues[rawTypeName].mappedValues)\n          : this.buildEnumResolverContentBlock(node, this.getTypeToUse(rawTypeName))\n      ).string;\n  }\n\n  InterfaceTypeDefinition(node: InterfaceTypeDefinitionNode): string {\n    const name = this.convertName(node, {\n      suffix: this.config.resolverTypeSuffix,\n    });\n    const declarationKind = 'type';\n    const typeName = node.name.value;\n    const implementingTypes = Object.keys(this._parsedSchemaMeta.types.interface[typeName].implementingTypes);\n\n    this._collectedResolvers[typeName] = {\n      typename: name + '<ContextType>',\n      baseGeneratedTypename: name,\n    };\n\n    const parentType = this.getParentTypeToUse(typeName);\n\n    const genericTypes: string[] = [\n      `ContextType = ${this.config.contextType.type}`,\n      this.transformParentGenericType(parentType),\n    ];\n    this._federation.addFederationTypeGenericIfApplicable({\n      genericTypes,\n      federationTypesType: this.convertName('FederationReferenceTypes'),\n      typeName,\n    });\n\n    const possibleTypes = implementingTypes.map(name => `'${name}'`).join(' | ') || 'null';\n\n    // An Interface has __resolveType resolver, and no other fields.\n    const blockFields: string[] = [\n      indent(\n        `${this.config.internalResolversPrefix}resolveType${\n          this.config.optionalResolveType ? '?' : ''\n        }: TypeResolveFn<${possibleTypes}, ParentType, ContextType>${this.getPunctuation(declarationKind)}`\n      ),\n    ];\n\n    // An Interface in Federation may have the additional __resolveReference resolver, if resolvable.\n    // So, we filter out the normal fields declared on the Interface and add the __resolveReference resolver.\n    const fields = (node.fields as unknown as FieldDefinitionResult[]).map(({ printContent }) =>\n      printContent(node, this.config.avoidOptionals.resolvers)\n    );\n    for (const field of fields) {\n      if (field.meta.federation?.isResolveReference || this.config.addInterfaceFieldResolverTypes) {\n        blockFields.push(field.value);\n      }\n    }\n\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(declarationKind)\n      .withName(name, `<${genericTypes.join(', ')}>`)\n      .withBlock(blockFields.join('\\n')).string;\n  }\n\n  SchemaDefinition() {\n    return null;\n  }\n\n  SchemaExtension() {\n    return null;\n  }\n\n  private getRelevantFieldsToOmit({\n    schemaType,\n    shouldInclude,\n    getTypeToUse,\n  }: {\n    schemaType: GraphQLObjectType;\n    getTypeToUse: (name: string) => string;\n    shouldInclude?: (type: GraphQLNamedType) => boolean;\n  }): {\n    addOptionalSign: boolean;\n    fieldName: string;\n    replaceWithType: string;\n  }[] {\n    const fields = schemaType.getFields();\n    return this._federation\n      .filterFieldNames(Object.keys(fields))\n      .filter(fieldName => {\n        const field = fields[fieldName];\n        const baseType = getBaseType(field.type);\n\n        // Filter out fields of types that are not included\n        if (shouldInclude && !shouldInclude(baseType)) {\n          return false;\n        }\n        return true;\n      })\n      .map(fieldName => {\n        const field = fields[fieldName];\n        const baseType = getBaseType(field.type);\n        const isUnion = isUnionType(baseType);\n        const isInterface = isInterfaceType(baseType);\n        const isObject = isObjectType(baseType);\n        let isObjectWithAbstractType = false;\n\n        if (isObject && !this.config.avoidCheckingAbstractTypesRecursively) {\n          isObjectWithAbstractType = checkIfObjectTypeHasAbstractTypesRecursively(baseType, {\n            isObjectWithAbstractType,\n            checkedTypesWithNestedAbstractTypes: this._checkedTypesWithNestedAbstractTypes,\n          });\n        }\n\n        if (\n          !this.config.mappers[baseType.name] &&\n          !isUnion &&\n          !isInterface &&\n          !this._shouldMapType[baseType.name] &&\n          !isObjectWithAbstractType\n        ) {\n          return null;\n        }\n\n        const addOptionalSign = !this.config.avoidOptionals.resolvers && !isNonNullType(field.type);\n\n        return {\n          addOptionalSign,\n          fieldName,\n          replaceWithType: wrapTypeWithModifiers(getTypeToUse(baseType.name), field.type, {\n            wrapOptional: this.applyMaybe,\n            wrapArray: this.wrapWithArray,\n          }),\n        };\n      })\n      .filter(a => a);\n  }\n}\n\nfunction replacePlaceholder(pattern: string, typename: string): string {\n  return pattern.replace(/\\{T\\}/g, typename);\n}\n\nfunction hasPlaceholder(pattern: string): boolean {\n  return pattern.includes('{T}');\n}\n\nfunction normalizeResolversNonOptionalTypename(\n  input?: boolean | ResolversNonOptionalTypenameConfig\n): ResolversNonOptionalTypenameConfig {\n  const defaultConfig: ResolversNonOptionalTypenameConfig = {\n    unionMember: false,\n  };\n\n  if (typeof input === 'boolean') {\n    return {\n      unionMember: input,\n      interfaceImplementingType: input,\n    };\n  }\n\n  return {\n    ...defaultConfig,\n    ...input,\n  };\n}\n\nfunction checkIfObjectTypeHasAbstractTypesRecursively(\n  baseType: GraphQLObjectType,\n  result: {\n    isObjectWithAbstractType: boolean;\n    checkedTypesWithNestedAbstractTypes: Record<string, { checkStatus: 'yes' | 'no' | 'checking' }>;\n  }\n): boolean {\n  if (\n    result.checkedTypesWithNestedAbstractTypes[baseType.name] &&\n    (result.checkedTypesWithNestedAbstractTypes[baseType.name].checkStatus === 'yes' ||\n      result.checkedTypesWithNestedAbstractTypes[baseType.name].checkStatus === 'no')\n  ) {\n    return result.checkedTypesWithNestedAbstractTypes[baseType.name].checkStatus === 'yes';\n  }\n\n  result.checkedTypesWithNestedAbstractTypes[baseType.name] ||= { checkStatus: 'checking' };\n\n  let atLeastOneFieldWithAbstractType = false;\n\n  const fields = baseType.getFields();\n  for (const field of Object.values(fields)) {\n    const fieldBaseType = getBaseType(field.type);\n\n    // If the field is self-referencing, skip it. Otherwise, it's an infinite loop\n    if (baseType.name === fieldBaseType.name) {\n      continue;\n    }\n\n    // If the current field has been checked, and it has nested abstract types,\n    // mark the parent type as having nested abstract types\n    if (result.checkedTypesWithNestedAbstractTypes[fieldBaseType.name]) {\n      if (result.checkedTypesWithNestedAbstractTypes[fieldBaseType.name].checkStatus === 'yes') {\n        atLeastOneFieldWithAbstractType = true;\n        result.checkedTypesWithNestedAbstractTypes[baseType.name].checkStatus = 'yes';\n      }\n      continue;\n    } else {\n      result.checkedTypesWithNestedAbstractTypes[fieldBaseType.name] = { checkStatus: 'checking' };\n    }\n\n    // If the field is an abstract type, then both the field type and parent type are abstract types\n    if (isInterfaceType(fieldBaseType) || isUnionType(fieldBaseType)) {\n      atLeastOneFieldWithAbstractType = true;\n      result.checkedTypesWithNestedAbstractTypes[fieldBaseType.name].checkStatus = 'yes';\n      result.checkedTypesWithNestedAbstractTypes[baseType.name].checkStatus = 'yes';\n      continue;\n    }\n\n    // If the field is an object, check it recursively to see if it has abstract types\n    // If it does, both field type and parent type have abstract types\n    if (isObjectType(fieldBaseType)) {\n      // IMPORTANT: we are pointing the parent type to the field type here\n      // to make sure when the field type is updated to either 'yes' or 'no', it becomes the parent's type as well\n      if (result.checkedTypesWithNestedAbstractTypes[baseType.name].checkStatus === 'checking') {\n        result.checkedTypesWithNestedAbstractTypes[baseType.name] =\n          result.checkedTypesWithNestedAbstractTypes[fieldBaseType.name];\n      }\n\n      const foundAbstractType = checkIfObjectTypeHasAbstractTypesRecursively(fieldBaseType, result);\n      if (foundAbstractType) {\n        atLeastOneFieldWithAbstractType = true;\n        result.checkedTypesWithNestedAbstractTypes[fieldBaseType.name].checkStatus = 'yes';\n        result.checkedTypesWithNestedAbstractTypes[baseType.name].checkStatus = 'yes';\n      }\n      continue;\n    }\n\n    // Otherwise, the current field type is not abstract type\n    // This includes scalar types, enums, input types and objects without abstract types\n    result.checkedTypesWithNestedAbstractTypes[fieldBaseType.name].checkStatus = 'no';\n  }\n\n  if (atLeastOneFieldWithAbstractType) {\n    result.isObjectWithAbstractType = true;\n  } else {\n    result.checkedTypesWithNestedAbstractTypes[baseType.name].checkStatus = 'no';\n  }\n\n  return atLeastOneFieldWithAbstractType;\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/base-types-visitor.ts",
    "content": "import {\n  DirectiveDefinitionNode,\n  DirectiveNode,\n  EnumTypeDefinitionNode,\n  EnumValueDefinitionNode,\n  FieldDefinitionNode,\n  GraphQLEnumType,\n  GraphQLSchema,\n  InputObjectTypeDefinitionNode,\n  InputValueDefinitionNode,\n  InterfaceTypeDefinitionNode,\n  isEnumType,\n  Kind,\n  ListTypeNode,\n  NamedTypeNode,\n  NonNullTypeNode,\n  ObjectTypeDefinitionNode,\n  ScalarTypeDefinitionNode,\n  UnionTypeDefinitionNode,\n} from 'graphql';\nimport { BaseVisitor, ParsedConfig, RawConfig } from './base-visitor.js';\nimport { normalizeDeclarationKind } from './declaration-kinds.js';\nimport { parseEnumValues } from './enum-values.js';\nimport { transformDirectiveArgumentAndInputFieldMappings } from './mappers.js';\nimport { DEFAULT_SCALARS } from './scalars.js';\nimport {\n  DeclarationKind,\n  DeclarationKindConfig,\n  DirectiveArgumentAndInputFieldMappings,\n  EnumValuesMap,\n  NormalizedScalarsMap,\n  ParsedDirectiveArgumentAndInputFieldMappings,\n  ParsedEnumValuesMap,\n} from './types.js';\nimport {\n  buildScalarsFromConfig,\n  DeclarationBlock,\n  DeclarationBlockConfig,\n  getConfigValue,\n  indent,\n  isOneOfInputObjectType,\n  transformComment,\n  wrapWithSingleQuotes,\n} from './utils.js';\nimport { OperationVariablesToObject } from './variables-to-object.js';\n\nexport interface ParsedTypesConfig extends ParsedConfig {\n  enumValues: ParsedEnumValuesMap;\n  declarationKind: DeclarationKindConfig;\n  addUnderscoreToArgsType: boolean;\n  onlyEnums: boolean;\n  onlyOperationTypes: boolean;\n  enumPrefix: boolean;\n  enumSuffix: boolean;\n  fieldWrapperValue: string;\n  wrapFieldDefinitions: boolean;\n  entireFieldWrapperValue: string;\n  wrapEntireDefinitions: boolean;\n  ignoreEnumValuesFromSchema: boolean;\n  directiveArgumentAndInputFieldMappings: ParsedDirectiveArgumentAndInputFieldMappings;\n}\n\nexport interface RawTypesConfig extends RawConfig {\n  /**\n   * @description Adds `_` to generated `Args` types in order to avoid duplicate identifiers.\n   *\n   * @exampleMarkdown\n   * ## With Custom Values\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          addUnderscoreToArgsType: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  addUnderscoreToArgsType?: boolean;\n  /**\n   * @description Overrides the default value of enum values declared in your GraphQL schema.\n   * You can also map the entire enum to an external type by providing a string that of `module#type`.\n   *\n   * @exampleMarkdown\n   * ## With Custom Values\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          enumValues: {\n   *            MyEnum: {\n   *              A: 'foo'\n   *            }\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## With External Enum\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          enumValues: {\n   *            MyEnum: './my-file#MyCustomEnum',\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Import All Enums from a file\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          enumValues: {\n   *            MyEnum: './my-file',\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  enumValues?: EnumValuesMap;\n  /**\n   * @description Overrides the default output for various GraphQL elements.\n   *\n   * @exampleMarkdown\n   * ## Override all declarations\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          declarationKind: 'interface'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Override only specific declarations\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          declarationKind: {\n   *            type: 'interface',\n   *            input: 'interface'\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  declarationKind?: DeclarationKind | DeclarationKindConfig;\n  /**\n   * @default true\n   * @description Allow you to disable prefixing for generated enums, works in combination with `typesPrefix`.\n   *\n   * @exampleMarkdown\n   * ## Disable enum prefixes\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          typesPrefix: 'I',\n   *          enumPrefix: false\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  enumPrefix?: boolean;\n  /**\n   * @default true\n   * @description Allow you to disable suffixing for generated enums, works in combination with `typesSuffix`.\n   *\n   * @exampleMarkdown\n   * ## Disable enum suffixes\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          typesSuffix: 'I',\n   *          enumSuffix: false\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  enumSuffix?: boolean;\n  /**\n   * @description Allow you to add wrapper for field type, use T as the generic value. Make sure to set `wrapFieldDefinitions` to `true` in order to make this flag work.\n   * @default T\n   *\n   * @exampleMarkdown\n   * ## Allow Promise\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          wrapFieldDefinitions: true,\n   *          fieldWrapperValue: 'T | Promise<T>',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  fieldWrapperValue?: string;\n  /**\n   * @description Set to `true` in order to wrap field definitions with `FieldWrapper`.\n   * This is useful to allow return types such as Promises and functions.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ## Enable wrapping fields\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          wrapFieldDefinitions: true,\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  wrapFieldDefinitions?: boolean;\n  /**\n   * @description This will cause the generator to emit types for enums only\n   * @default false\n   *\n   * @exampleMarkdown\n   * ## Override all definition types\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          onlyEnums: true,\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  onlyEnums?: boolean;\n  /**\n   * @description This will cause the generator to emit types for operations only (basically only enums and scalars)\n   * @default false\n   *\n   * @exampleMarkdown\n   * ## Override all definition types\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          onlyOperationTypes: true,\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  onlyOperationTypes?: boolean;\n  /**\n   * @description This will cause the generator to ignore enum values defined in GraphQLSchema\n   * @default false\n   *\n   * @exampleMarkdown\n   * ## Ignore enum values from schema\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          ignoreEnumValuesFromSchema: true,\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  ignoreEnumValuesFromSchema?: boolean;\n  /**\n   * @name wrapEntireFieldDefinitions\n   * @type boolean\n   * @description Set to `true` in order to wrap field definitions with `EntireFieldWrapper`.\n   * This is useful to allow return types such as Promises and functions for fields.\n   * Differs from `wrapFieldDefinitions` in that this wraps the entire field definition if i.e. the field is an Array, while\n   * `wrapFieldDefinitions` will wrap every single value inside the array.\n   * @default true\n   *\n   * @example Enable wrapping entire fields\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          wrapEntireFieldDefinitions: false,\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  wrapEntireFieldDefinitions?: boolean;\n  /**\n   * @name entireFieldWrapperValue\n   * @type string\n   * @description Allow to override the type value of `EntireFieldWrapper`. This wrapper applies outside of Array and Maybe\n   * unlike `fieldWrapperValue`, that will wrap the inner type.\n   * @default T | Promise<T> | (() => T | Promise<T>)\n   *\n   * @example Only allow values\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          entireFieldWrapperValue: 'T',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  entireFieldWrapperValue?: string;\n  /**\n   * @description Replaces a GraphQL scalar with a custom type based on the applied directive on an argument or input field.\n   *\n   * You can use both `module#type` and `module#namespace#type` syntax.\n   * Will NOT work with introspected schemas since directives are not exported.\n   * Only works with directives on ARGUMENT_DEFINITION or INPUT_FIELD_DEFINITION.\n   *\n   * **WARNING:** Using this option does only change the type definitions.\n   *\n   * For actually ensuring that a type is correct at runtime you will have to use schema transforms (e.g. with [@graphql-tools/utils mapSchema](https://graphql-tools.com/docs/schema-directives)) that apply those rules!\n   * Otherwise, you might end up with a runtime type mismatch which could cause unnoticed bugs or runtime errors.\n   *\n   * Please use this configuration option with care!\n   *\n   * @exampleMarkdown\n   * ## Custom Context Type\\\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          directiveArgumentAndInputFieldMappings: {\n   *            AsNumber: 'number',\n   *            AsComplex: './my-models#Complex',\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  directiveArgumentAndInputFieldMappings?: DirectiveArgumentAndInputFieldMappings;\n  /**\n   * @description Adds a suffix to the imported names to prevent name clashes.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          directiveArgumentAndInputFieldMappings: 'Model'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  directiveArgumentAndInputFieldMappingTypeSuffix?: string;\n}\n\nconst onlyUnderscoresPattern = /^_+$/;\n\nexport class BaseTypesVisitor<\n  TRawConfig extends RawTypesConfig = RawTypesConfig,\n  TPluginConfig extends ParsedTypesConfig = ParsedTypesConfig\n> extends BaseVisitor<TRawConfig, TPluginConfig> {\n  protected _argumentsTransformer: OperationVariablesToObject;\n\n  constructor(\n    protected _schema: GraphQLSchema,\n    rawConfig: TRawConfig,\n    additionalConfig: TPluginConfig,\n    defaultScalars: NormalizedScalarsMap = DEFAULT_SCALARS\n  ) {\n    super(rawConfig, {\n      enumPrefix: getConfigValue(rawConfig.enumPrefix, true),\n      enumSuffix: getConfigValue(rawConfig.enumSuffix, true),\n      onlyEnums: getConfigValue(rawConfig.onlyEnums, false),\n      onlyOperationTypes: getConfigValue(rawConfig.onlyOperationTypes, false),\n      addUnderscoreToArgsType: getConfigValue(rawConfig.addUnderscoreToArgsType, false),\n      enumValues: parseEnumValues({\n        schema: _schema,\n        mapOrStr: rawConfig.enumValues,\n        ignoreEnumValuesFromSchema: rawConfig.ignoreEnumValuesFromSchema,\n      }),\n      declarationKind: normalizeDeclarationKind(rawConfig.declarationKind),\n      scalars: buildScalarsFromConfig(_schema, rawConfig, defaultScalars),\n      fieldWrapperValue: getConfigValue(rawConfig.fieldWrapperValue, 'T'),\n      wrapFieldDefinitions: getConfigValue(rawConfig.wrapFieldDefinitions, false),\n      entireFieldWrapperValue: getConfigValue(rawConfig.entireFieldWrapperValue, 'T'),\n      wrapEntireDefinitions: getConfigValue(rawConfig.wrapEntireFieldDefinitions, false),\n      ignoreEnumValuesFromSchema: getConfigValue(rawConfig.ignoreEnumValuesFromSchema, false),\n      directiveArgumentAndInputFieldMappings: transformDirectiveArgumentAndInputFieldMappings(\n        rawConfig.directiveArgumentAndInputFieldMappings ?? {},\n        rawConfig.directiveArgumentAndInputFieldMappingTypeSuffix\n      ),\n      ...additionalConfig,\n    });\n\n    // Note: Missing directive mappers but not a problem since always overriden by implementors\n    this._argumentsTransformer = new OperationVariablesToObject(this.scalars, this.convertName);\n  }\n\n  protected getExportPrefix(): string {\n    return 'export ';\n  }\n\n  public getFieldWrapperValue(): string {\n    if (this.config.fieldWrapperValue) {\n      return `${this.getExportPrefix()}type FieldWrapper<T> = ${this.config.fieldWrapperValue};`;\n    }\n\n    return '';\n  }\n\n  public getEntireFieldWrapperValue(): string {\n    if (this.config.entireFieldWrapperValue) {\n      return `${this.getExportPrefix()}type EntireFieldWrapper<T> = ${this.config.entireFieldWrapperValue};`;\n    }\n\n    return '';\n  }\n\n  public getScalarsImports(): string[] {\n    return Object.keys(this.config.scalars).reduce((res, enumName) => {\n      const mappedValue = this.config.scalars[enumName];\n\n      if (mappedValue.input.isExternal) {\n        res.push(this._buildTypeImport(mappedValue.input.import, mappedValue.input.source, mappedValue.input.default));\n      }\n\n      if (mappedValue.output.isExternal) {\n        res.push(\n          this._buildTypeImport(mappedValue.output.import, mappedValue.output.source, mappedValue.output.default)\n        );\n      }\n\n      return res;\n    }, []);\n  }\n\n  public getDirectiveArgumentAndInputFieldMappingsImports(): string[] {\n    return Object.keys(this.config.directiveArgumentAndInputFieldMappings)\n      .map(directive => {\n        const mappedValue = this.config.directiveArgumentAndInputFieldMappings[directive];\n\n        if (mappedValue.isExternal) {\n          return this._buildTypeImport(mappedValue.import, mappedValue.source, mappedValue.default);\n        }\n\n        return null;\n      })\n      .filter(a => a);\n  }\n\n  public get scalarsDefinition(): string {\n    if (this.config.onlyEnums) return '';\n    const allScalars = Object.keys(this.config.scalars).map(scalarName => {\n      const inputScalarValue = this.config.scalars[scalarName].input.type;\n      const outputScalarValue = this.config.scalars[scalarName].output.type;\n      const scalarType = this._schema.getType(scalarName);\n      const comment = scalarType?.astNode && scalarType.description ? transformComment(scalarType.description, 1) : '';\n      const { scalar } = this._parsedConfig.declarationKind;\n\n      return (\n        comment +\n        indent(\n          `${scalarName}: { input: ${inputScalarValue}${this.getPunctuation(\n            scalar\n          )} output: ${outputScalarValue}${this.getPunctuation(scalar)} }`\n        )\n      );\n    });\n\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(this._parsedConfig.declarationKind.scalar)\n      .withName('Scalars')\n      .withComment('All built-in and custom scalars, mapped to their actual values')\n      .withBlock(allScalars.join('\\n')).string;\n  }\n\n  public get directiveArgumentAndInputFieldMappingsDefinition(): string {\n    const directiveEntries = Object.entries(this.config.directiveArgumentAndInputFieldMappings);\n    if (directiveEntries.length === 0) {\n      return '';\n    }\n\n    const allDirectives: Array<string> = [];\n\n    for (const [directiveName, parsedMapper] of directiveEntries) {\n      const directiveType = this._schema.getDirective(directiveName);\n      const comment =\n        directiveType?.astNode && directiveType.description ? transformComment(directiveType.description, 1) : '';\n      const { directive } = this._parsedConfig.declarationKind;\n      allDirectives.push(comment + indent(`${directiveName}: ${parsedMapper.type}${this.getPunctuation(directive)}`));\n    }\n\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(this._parsedConfig.declarationKind.directive)\n      .withName('DirectiveArgumentAndInputFieldMappings')\n      .withComment('Type overrides using directives')\n      .withBlock(allDirectives.join('\\n')).string;\n  }\n\n  setDeclarationBlockConfig(config: DeclarationBlockConfig): void {\n    this._declarationBlockConfig = config;\n  }\n\n  setArgumentsTransformer(argumentsTransfomer: OperationVariablesToObject): void {\n    this._argumentsTransformer = argumentsTransfomer;\n  }\n\n  NonNullType(node: NonNullTypeNode): string {\n    const asString = node.type as any as string;\n\n    return asString;\n  }\n\n  getInputObjectDeclarationBlock(node: InputObjectTypeDefinitionNode): DeclarationBlock {\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(this._parsedConfig.declarationKind.input)\n      .withName(this.convertName(node))\n      .withComment(node.description?.value)\n      .withBlock(node.fields.join('\\n'));\n  }\n\n  getInputObjectOneOfDeclarationBlock(node: InputObjectTypeDefinitionNode): DeclarationBlock {\n    // As multiple fields always result in a union, we have\n    // to force a declaration kind of `type` in this case\n    const declarationKind = node.fields.length === 1 ? this._parsedConfig.declarationKind.input : 'type';\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(declarationKind)\n      .withName(this.convertName(node))\n      .withComment(node.description?.value)\n      .withContent(`\\n` + node.fields.join('\\n  |'));\n  }\n\n  InputObjectTypeDefinition(node: InputObjectTypeDefinitionNode): string {\n    if (this.config.onlyEnums) return '';\n\n    if (isOneOfInputObjectType(this._schema.getType(node.name.value))) {\n      return this.getInputObjectOneOfDeclarationBlock(node).string;\n    }\n\n    return this.getInputObjectDeclarationBlock(node).string;\n  }\n\n  InputValueDefinition(node: InputValueDefinitionNode): string {\n    if (this.config.onlyEnums) return '';\n\n    const comment = transformComment(node.description.value, 1);\n    const { input } = this._parsedConfig.declarationKind;\n\n    let type: string = node.type as any as string;\n    if (node.directives && this.config.directiveArgumentAndInputFieldMappings) {\n      type = this._getDirectiveOverrideType(node.directives) || type;\n    }\n\n    return comment + indent(`${node.name.value}: ${type}${this.getPunctuation(input)}`);\n  }\n\n  FieldDefinition(node: FieldDefinitionNode): string {\n    if (this.config.onlyEnums) return '';\n\n    const typeString = node.type as any as string;\n    const { type } = this._parsedConfig.declarationKind;\n    const comment = this.getNodeComment(node);\n\n    return comment + indent(`${node.name.value}: ${typeString}${this.getPunctuation(type)}`);\n  }\n\n  UnionTypeDefinition(node: UnionTypeDefinitionNode, key: string | number | undefined, parent: any): string {\n    if (this.config.onlyOperationTypes || this.config.onlyEnums) return '';\n    const originalNode = parent[key] as UnionTypeDefinitionNode;\n    const possibleTypes = originalNode.types\n      .map(t => (this.scalars[t.name.value] ? this._getScalar(t.name.value, 'output') : this.convertName(t)))\n      .join(' | ');\n\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind('type')\n      .withName(this.convertName(node))\n      .withComment(node.description.value)\n      .withContent(possibleTypes).string;\n  }\n\n  protected mergeInterfaces(interfaces: string[], hasOtherFields: boolean): string {\n    return interfaces.join(' & ') + (interfaces.length && hasOtherFields ? ' & ' : '');\n  }\n\n  appendInterfacesAndFieldsToBlock(block: DeclarationBlock, interfaces: string[], fields: string[]): void {\n    block.withContent(this.mergeInterfaces(interfaces, fields.length > 0));\n    block.withBlock(this.mergeAllFields(fields, interfaces.length > 0));\n  }\n\n  getObjectTypeDeclarationBlock(\n    node: ObjectTypeDefinitionNode,\n    originalNode: ObjectTypeDefinitionNode\n  ): DeclarationBlock {\n    const optionalTypename = this.config.nonOptionalTypename ? '__typename' : '__typename?';\n    const { type, interface: interfacesType } = this._parsedConfig.declarationKind;\n    const allFields = [\n      ...(this.config.addTypename\n        ? [\n            indent(\n              `${this.config.immutableTypes ? 'readonly ' : ''}${optionalTypename}: '${\n                node.name.value\n              }'${this.getPunctuation(type)}`\n            ),\n          ]\n        : []),\n      ...node.fields,\n    ] as string[];\n    const interfacesNames = originalNode.interfaces ? originalNode.interfaces.map(i => this.convertName(i)) : [];\n\n    const declarationBlock = new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(type)\n      .withName(this.convertName(node))\n      .withComment(node.description?.value);\n\n    if (type === 'interface' || type === 'class') {\n      if (interfacesNames.length > 0) {\n        const keyword = interfacesType === 'interface' && type === 'class' ? 'implements' : 'extends';\n\n        declarationBlock.withContent(`${keyword} ` + interfacesNames.join(', ') + (allFields.length > 0 ? ' ' : ' {}'));\n      }\n\n      declarationBlock.withBlock(this.mergeAllFields(allFields, false));\n    } else {\n      this.appendInterfacesAndFieldsToBlock(declarationBlock, interfacesNames, allFields);\n    }\n\n    return declarationBlock;\n  }\n\n  protected mergeAllFields(allFields: string[], _hasInterfaces: boolean): string {\n    return allFields.join('\\n');\n  }\n\n  ObjectTypeDefinition(node: ObjectTypeDefinitionNode, key: number | string, parent: any): string {\n    if (this.config.onlyOperationTypes || this.config.onlyEnums) return '';\n    const originalNode = parent[key] as ObjectTypeDefinitionNode;\n\n    return [this.getObjectTypeDeclarationBlock(node, originalNode).string, this.buildArgumentsBlock(originalNode)]\n      .filter(f => f)\n      .join('\\n\\n');\n  }\n\n  getInterfaceTypeDeclarationBlock(\n    node: InterfaceTypeDefinitionNode,\n    _originalNode: InterfaceTypeDefinitionNode\n  ): DeclarationBlock {\n    const declarationBlock = new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(this._parsedConfig.declarationKind.interface)\n      .withName(this.convertName(node))\n      .withComment(node.description?.value);\n\n    return declarationBlock.withBlock(node.fields.join('\\n'));\n  }\n\n  InterfaceTypeDefinition(node: InterfaceTypeDefinitionNode, key: number | string, parent: any): string {\n    if (this.config.onlyOperationTypes || this.config.onlyEnums) return '';\n    const originalNode = parent[key] as InterfaceTypeDefinitionNode;\n\n    return [this.getInterfaceTypeDeclarationBlock(node, originalNode).string, this.buildArgumentsBlock(originalNode)]\n      .filter(f => f)\n      .join('\\n\\n');\n  }\n\n  ScalarTypeDefinition(_node: ScalarTypeDefinitionNode): string {\n    // We empty this because we handle scalars in a different way, see constructor.\n    return '';\n  }\n\n  protected _buildTypeImport(identifier: string, source: string, asDefault = false): string {\n    const { useTypeImports } = this.config;\n    if (asDefault) {\n      if (useTypeImports) {\n        return `import type { default as ${identifier} } from '${source}';`;\n      }\n      return `import ${identifier} from '${source}';`;\n    }\n    return `import${useTypeImports ? ' type' : ''} { ${identifier} } from '${source}';`;\n  }\n\n  protected handleEnumValueMapper(\n    typeIdentifier: string,\n    importIdentifier: string | null,\n    sourceIdentifier: string | null,\n    sourceFile: string | null\n  ): string[] {\n    if (importIdentifier !== sourceIdentifier) {\n      // use namespace import to dereference nested enum\n      // { enumValues: { MyEnum: './my-file#NS.NestedEnum' } }\n      return [\n        this._buildTypeImport(importIdentifier || sourceIdentifier, sourceFile),\n        `import ${typeIdentifier} = ${sourceIdentifier};`,\n      ];\n    }\n    if (sourceIdentifier !== typeIdentifier) {\n      return [this._buildTypeImport(`${sourceIdentifier} as ${typeIdentifier}`, sourceFile)];\n    }\n    return [this._buildTypeImport(importIdentifier || sourceIdentifier, sourceFile)];\n  }\n\n  public getEnumsImports(): string[] {\n    return Object.keys(this.config.enumValues)\n      .flatMap(enumName => {\n        const mappedValue = this.config.enumValues[enumName];\n\n        if (mappedValue.sourceFile) {\n          if (mappedValue.isDefault) {\n            return [this._buildTypeImport(mappedValue.typeIdentifier, mappedValue.sourceFile, true)];\n          }\n\n          return this.handleEnumValueMapper(\n            mappedValue.typeIdentifier,\n            mappedValue.importIdentifier,\n            mappedValue.sourceIdentifier,\n            mappedValue.sourceFile\n          );\n        }\n\n        return [];\n      })\n      .filter(Boolean);\n  }\n\n  EnumTypeDefinition(node: EnumTypeDefinitionNode): string {\n    const enumName = node.name.value;\n\n    // In case of mapped external enum string\n    if (this.config.enumValues[enumName]?.sourceFile) {\n      return null;\n    }\n\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind('enum')\n      .withName(\n        this.convertName(node, {\n          useTypesPrefix: this.config.enumPrefix,\n          useTypesSuffix: this.config.enumSuffix,\n        })\n      )\n      .withComment(node.description.value)\n      .withBlock(this.buildEnumValuesBlock(enumName, node.values)).string;\n  }\n\n  protected makeValidEnumIdentifier(identifier: string): string {\n    if (/^[0-9]/.exec(identifier)) {\n      return wrapWithSingleQuotes(identifier, true);\n    }\n    return identifier;\n  }\n\n  protected buildEnumValuesBlock(typeName: string, values: ReadonlyArray<EnumValueDefinitionNode>): string {\n    const schemaEnumType: GraphQLEnumType | undefined = this._schema\n      ? (this._schema.getType(typeName) as GraphQLEnumType)\n      : undefined;\n\n    return values\n      .map(enumOption => {\n        const optionName = this.makeValidEnumIdentifier(\n          this.convertName(enumOption, {\n            useTypesPrefix: false,\n            // We can only strip out the underscores if the value contains other\n            // characters. Otherwise we'll generate syntactically invalid code.\n            transformUnderscore: !onlyUnderscoresPattern.test(enumOption.name.value),\n          })\n        );\n        const comment = this.getNodeComment(enumOption);\n        const schemaEnumValue =\n          schemaEnumType && !this.config.ignoreEnumValuesFromSchema\n            ? schemaEnumType.getValue(enumOption.name.value).value\n            : undefined;\n        let enumValue: string | number =\n          typeof schemaEnumValue === 'undefined' ? enumOption.name.value : schemaEnumValue;\n\n        if (typeof this.config.enumValues[typeName]?.mappedValues?.[enumValue] !== 'undefined') {\n          enumValue = this.config.enumValues[typeName].mappedValues[enumValue];\n        }\n\n        return (\n          comment +\n          indent(\n            `${optionName}${this._declarationBlockConfig.enumNameValueSeparator} ${wrapWithSingleQuotes(\n              enumValue,\n              typeof schemaEnumValue !== 'undefined'\n            )}`\n          )\n        );\n      })\n      .join(',\\n');\n  }\n\n  DirectiveDefinition(_node: DirectiveDefinitionNode): string {\n    return '';\n  }\n\n  getArgumentsObjectDeclarationBlock(\n    node: InterfaceTypeDefinitionNode | ObjectTypeDefinitionNode,\n    name: string,\n    field: FieldDefinitionNode\n  ): DeclarationBlock {\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(this._parsedConfig.declarationKind.arguments)\n      .withName(this.convertName(name))\n      .withComment(node.description?.value)\n      .withBlock(this._argumentsTransformer.transform<InputValueDefinitionNode>(field.arguments));\n  }\n\n  getArgumentsObjectTypeDefinition(\n    node: InterfaceTypeDefinitionNode | ObjectTypeDefinitionNode,\n    name: string,\n    field: FieldDefinitionNode\n  ): string {\n    if (this.config.onlyEnums) return '';\n    return this.getArgumentsObjectDeclarationBlock(node, name, field).string;\n  }\n\n  protected buildArgumentsBlock(node: InterfaceTypeDefinitionNode | ObjectTypeDefinitionNode) {\n    const fieldsWithArguments = node.fields.filter(field => field.arguments && field.arguments.length > 0) || [];\n    return fieldsWithArguments\n      .map(field => {\n        const name =\n          node.name.value +\n          (this.config.addUnderscoreToArgsType ? '_' : '') +\n          this.convertName(field, {\n            useTypesPrefix: false,\n            useTypesSuffix: false,\n          }) +\n          'Args';\n\n        return this.getArgumentsObjectTypeDefinition(node, name, field);\n      })\n      .join('\\n\\n');\n  }\n\n  protected _getScalar(name: string, type: 'input' | 'output'): string {\n    return `Scalars['${name}']['${type}']`;\n  }\n\n  protected _getDirectiveArgumentNadInputFieldMapping(name: string): string {\n    return `DirectiveArgumentAndInputFieldMappings['${name}']`;\n  }\n\n  protected _getDirectiveOverrideType(directives: ReadonlyArray<DirectiveNode>): string | null {\n    const type = directives\n      .map(directive => {\n        const directiveName = directive.name.value;\n        if (this.config.directiveArgumentAndInputFieldMappings[directiveName]) {\n          return this._getDirectiveArgumentNadInputFieldMapping(directiveName);\n        }\n        return null;\n      })\n      .reverse()\n      .find(a => !!a);\n\n    return type || null;\n  }\n\n  protected _getTypeForNode(node: NamedTypeNode, isVisitingInputType: boolean): string {\n    const typeAsString = node.name.value;\n\n    if (this.scalars[typeAsString]) {\n      return this._getScalar(typeAsString, isVisitingInputType ? 'input' : 'output');\n    }\n    if (this.config.enumValues[typeAsString]) {\n      return this.config.enumValues[typeAsString].typeIdentifier;\n    }\n\n    const schemaType = this._schema.getType(typeAsString);\n\n    if (schemaType && isEnumType(schemaType)) {\n      return this.convertName(node, {\n        useTypesPrefix: this.config.enumPrefix,\n        useTypesSuffix: this.config.enumSuffix,\n      });\n    }\n\n    return this.convertName(node);\n  }\n\n  NamedType(node: NamedTypeNode, key, parent, path, ancestors): string {\n    const currentVisitContext = this.getVisitorKindContextFromAncestors(ancestors);\n    const isVisitingInputType = currentVisitContext.includes(Kind.INPUT_OBJECT_TYPE_DEFINITION);\n    const typeToUse = this._getTypeForNode(node, isVisitingInputType);\n\n    if (!isVisitingInputType && this.config.fieldWrapperValue && this.config.wrapFieldDefinitions) {\n      return `FieldWrapper<${typeToUse}>`;\n    }\n\n    return typeToUse;\n  }\n\n  ListType(node: ListTypeNode, _key, _parent, _path, _ancestors): string {\n    const asString = node.type as any as string;\n\n    return this.wrapWithListType(asString);\n  }\n\n  SchemaDefinition() {\n    return null;\n  }\n\n  SchemaExtension() {\n    return null;\n  }\n\n  getNodeComment(node: FieldDefinitionNode | EnumValueDefinitionNode | InputValueDefinitionNode): string {\n    let commentText = node.description?.value;\n    const deprecationDirective = node.directives.find(v => v.name.value === 'deprecated');\n    if (deprecationDirective) {\n      const deprecationReason = this.getDeprecationReason(deprecationDirective);\n      commentText = `${commentText ? `${commentText}\\n` : ''}@deprecated ${deprecationReason}`;\n    }\n    const comment = transformComment(commentText, 1);\n    return comment;\n  }\n\n  protected getDeprecationReason(directive: DirectiveNode): string | void {\n    if (directive.name.value === 'deprecated') {\n      let reason = 'Field no longer supported';\n      const deprecatedReason = directive.arguments[0];\n      if (deprecatedReason && deprecatedReason.value.kind === Kind.STRING) {\n        reason = deprecatedReason.value.value;\n      }\n      return reason;\n    }\n  }\n\n  protected wrapWithListType(str: string): string {\n    return `Array<${str}>`;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/base-visitor.ts",
    "content": "import autoBind from 'auto-bind';\nimport { ASTNode, FragmentDefinitionNode, OperationDefinitionNode } from 'graphql';\nimport { FragmentImport, ImportDeclaration } from './imports.js';\nimport { convertFactory } from './naming.js';\nimport {\n  ConvertFn,\n  ConvertOptions,\n  DeclarationKind,\n  LoadedFragment,\n  NamingConvention,\n  NormalizedScalarsMap,\n  ParsedScalarsMap,\n  ScalarsMap,\n} from './types.js';\nimport { DeclarationBlockConfig } from './utils.js';\nimport { normalizeImportExtension } from '@graphql-codegen/plugin-helpers';\n\nexport interface BaseVisitorConvertOptions {\n  useTypesPrefix?: boolean;\n  useTypesSuffix?: boolean;\n}\n\nexport type InlineFragmentTypeOptions = 'inline' | 'combine' | 'mask';\n\nexport interface ParsedConfig {\n  scalars: ParsedScalarsMap;\n  convert: ConvertFn;\n  typesPrefix: string;\n  typesSuffix: string;\n  addTypename: boolean;\n  nonOptionalTypename: boolean;\n  extractAllFieldsToTypes: boolean;\n  externalFragments: LoadedFragment[];\n  fragmentImports: ImportDeclaration<FragmentImport>[];\n  immutableTypes: boolean;\n  useTypeImports: boolean;\n  allowEnumStringTypes: boolean;\n  inlineFragmentTypes: InlineFragmentTypeOptions;\n  emitLegacyCommonJSImports?: boolean;\n  importExtension: '' | `.${string}`;\n  printFieldsOnNewLines: boolean;\n  includeExternalFragments: boolean;\n}\n\nexport interface RawConfig {\n  /**\n   * @description Makes scalars strict.\n   *\n   * If scalars are found in the schema that are not defined in `scalars`\n   * an error will be thrown during codegen.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          strictScalars: true,\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  strictScalars?: boolean;\n  /**\n   * @description Allows you to override the type that unknown scalars will have.\n   * @default any\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          defaultScalarType: 'unknown'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  defaultScalarType?: string;\n  /**\n   * @description Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          scalars: {\n   *            ID: {\n   *              input: 'string',\n   *              output: 'string | number'\n   *            }\n   *            DateTime: 'Date',\n   *            JSON: '{ [key: string]: any }',\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  scalars?: ScalarsMap;\n  /**\n   * @default change-case-all#pascalCase\n   * @description Allow you to override the naming convention of the output.\n   * You can either override all namings, or specify an object with specific custom naming convention per output.\n   * The format of the converter must be a valid `module#method`.\n   * Allowed values for specific output are: `typeNames`, `enumValues`.\n   * You can also use \"keep\" to keep all GraphQL names as-is.\n   * Additionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\n   * which is to preserve underscores.\n   *\n   * Available case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\n   * [See more](https://github.com/btxtiger/change-case-all)\n   *\n   * @exampleMarkdown\n   * ## Override All Names\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          namingConvention: 'change-case-all#lowerCase',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Upper-case enum values\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          namingConvention: {\n   *            typeNames: 'change-case-all#pascalCase',\n   *            enumValues: 'change-case-all#upperCase',\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Keep names as is\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *         namingConvention: 'keep',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Remove Underscores\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          namingConvention: {\n   *            typeNames: 'change-case-all#pascalCase',\n   *            transformUnderscore: true\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  namingConvention?: NamingConvention;\n  /**\n   * @default \"\"\n   * @description Prefixes all the generated types.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          typesPrefix: 'I',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  typesPrefix?: string;\n  /**\n   * @default \"\"\n   * @description Suffixes all the generated types.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          typesSuffix: 'I',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  typesSuffix?: string;\n  /**\n   * @default false\n   * @description Does not add `__typename` to the generated types, unless it was specified in the selection set.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          skipTypename: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  skipTypename?: boolean;\n  /**\n   * @default false\n   * @description Automatically adds `__typename` field to the generated types, even when they are not specified\n   * in the selection set, and makes it non-optional\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          nonOptionalTypename: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  nonOptionalTypename?: boolean;\n  /**\n   * @name useTypeImports\n   * @type boolean\n   * @default false\n   * @description Will use `import type {}` rather than `import {}` when importing only types. This gives\n   * compatibility with TypeScript's \"importsNotUsedAsValues\": \"error\" option\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          useTypeImports: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  useTypeImports?: boolean;\n\n  /* The following configuration are for preset configuration and should not be set manually (for most use cases...) */\n  /**\n   * @ignore\n   */\n  externalFragments?: LoadedFragment[];\n  /**\n   * @ignore\n   */\n  fragmentImports?: ImportDeclaration<FragmentImport>[];\n  /**\n   * @ignore\n   */\n  globalNamespace?: boolean;\n  /**\n   * @ignore\n   */\n  allowEnumStringTypes?: boolean;\n  /**\n   * @description Whether fragment types should be inlined into other operations.\n   * \"inline\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\n   * \"combine\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\n   * \"mask\" transforms the types for use with fragment masking. Useful when masked types are needed when not using the \"client\" preset e.g. such as combining it with Apollo Client's data masking feature.\n   *\n   * @type string\n   * @default inline\n   */\n  inlineFragmentTypes?: InlineFragmentTypeOptions;\n  /**\n   * @deprecated Please use `importExtension` instead.\n   * @default true\n   * @description Emit legacy common js imports.\n   * Default it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\n   */\n  emitLegacyCommonJSImports?: boolean;\n  /**\n   * @description Append this extension to all imports.\n   * Useful for ESM environments that require file extensions in import statements.\n   */\n  importExtension?: '' | `.${string}`;\n\n  /**\n   * @default false\n   * @description Extract all field types to their own types, instead of inlining them.\n   * This helps to reduce type duplication, and makes type errors more readable.\n   * It can also significantly reduce the size of the generated code, the generation time,\n   * and the typechecking time.\n   */\n  extractAllFieldsToTypes?: boolean;\n\n  /**\n   * @default false\n   * @description If you prefer to have each field in generated types printed on a new line, set this to true.\n   * This can be useful for improving readability of the resulting types,\n   * without resorting to running tools like Prettier on the output.\n   */\n  printFieldsOnNewLines?: boolean;\n\n  /**\n   * @default false\n   * @description Whether to include external fragments in the generated code. External fragments are not defined\n   * in the same location as the operation definition.\n   */\n  includeExternalFragments?: boolean;\n}\n\nexport class BaseVisitor<TRawConfig extends RawConfig = RawConfig, TPluginConfig extends ParsedConfig = ParsedConfig> {\n  protected _parsedConfig: TPluginConfig;\n  protected _declarationBlockConfig: DeclarationBlockConfig = {};\n  public readonly scalars: NormalizedScalarsMap;\n\n  constructor(rawConfig: TRawConfig, additionalConfig: Partial<TPluginConfig>) {\n    const importExtension = normalizeImportExtension({\n      emitLegacyCommonJSImports: rawConfig.emitLegacyCommonJSImports,\n      importExtension: rawConfig.importExtension,\n    });\n    this._parsedConfig = {\n      convert: convertFactory(rawConfig),\n      typesPrefix: rawConfig.typesPrefix || '',\n      typesSuffix: rawConfig.typesSuffix || '',\n      externalFragments: rawConfig.externalFragments || [],\n      fragmentImports: rawConfig.fragmentImports || [],\n      addTypename: !rawConfig.skipTypename,\n      nonOptionalTypename: !!rawConfig.nonOptionalTypename,\n      useTypeImports: !!rawConfig.useTypeImports,\n      allowEnumStringTypes: !!rawConfig.allowEnumStringTypes,\n      inlineFragmentTypes: rawConfig.inlineFragmentTypes ?? 'inline',\n      emitLegacyCommonJSImports: rawConfig.emitLegacyCommonJSImports ?? true,\n      importExtension,\n      extractAllFieldsToTypes: rawConfig.extractAllFieldsToTypes ?? false,\n      printFieldsOnNewLines: rawConfig.printFieldsOnNewLines ?? false,\n      includeExternalFragments: rawConfig.includeExternalFragments ?? false,\n      ...((additionalConfig || {}) as any),\n    };\n\n    this.scalars = {};\n    for (const key of Object.keys(this.config.scalars || {})) {\n      this.scalars[key] = {\n        input: this.config.scalars[key]?.input?.type,\n        output: this.config.scalars[key]?.output?.type,\n      };\n    }\n\n    autoBind(this);\n  }\n\n  protected getVisitorKindContextFromAncestors(ancestors: ASTNode[]): string[] {\n    if (!ancestors) {\n      return [];\n    }\n\n    return ancestors.map(t => t.kind).filter(Boolean);\n  }\n\n  get config(): TPluginConfig {\n    return this._parsedConfig;\n  }\n\n  public convertName(node: ASTNode | string, options?: BaseVisitorConvertOptions & ConvertOptions): string {\n    const useTypesPrefix = typeof options?.useTypesPrefix === 'boolean' ? options.useTypesPrefix : true;\n    const useTypesSuffix = typeof options?.useTypesSuffix === 'boolean' ? options.useTypesSuffix : true;\n\n    let convertedName = '';\n\n    if (useTypesPrefix) {\n      convertedName += this.config.typesPrefix;\n    }\n\n    convertedName += this.config.convert(node, options);\n\n    if (useTypesSuffix) {\n      convertedName += this.config.typesSuffix;\n    }\n\n    return convertedName;\n  }\n\n  public getOperationSuffix(\n    node: FragmentDefinitionNode | OperationDefinitionNode | string,\n    operationType: string\n  ): string {\n    const { omitOperationSuffix = false, dedupeOperationSuffix = false } = this.config as { [key: string]: any };\n    const operationName = typeof node === 'string' ? node : node.name ? node.name.value : '';\n    return omitOperationSuffix\n      ? ''\n      : dedupeOperationSuffix && operationName.toLowerCase().endsWith(operationType.toLowerCase())\n      ? ''\n      : operationType;\n  }\n\n  public getFragmentSuffix(node: FragmentDefinitionNode | string): string {\n    return this.getOperationSuffix(node, 'Fragment');\n  }\n\n  public getFragmentName(node: FragmentDefinitionNode | string): string {\n    return this.convertName(node, {\n      suffix: this.getFragmentSuffix(node),\n      useTypesPrefix: false,\n    });\n  }\n\n  public getFragmentVariableName(node: FragmentDefinitionNode | string): string {\n    const {\n      omitOperationSuffix = false,\n      dedupeOperationSuffix = false,\n      fragmentVariableSuffix = 'FragmentDoc',\n      fragmentVariablePrefix = '',\n    } = this.config as { [key: string]: any };\n\n    const fragmentName = typeof node === 'string' ? node : node.name.value;\n    const suffix = omitOperationSuffix\n      ? ''\n      : dedupeOperationSuffix &&\n        fragmentName.toLowerCase().endsWith('fragment') &&\n        fragmentVariableSuffix.toLowerCase().startsWith('fragment')\n      ? fragmentVariableSuffix.substring('fragment'.length)\n      : fragmentVariableSuffix;\n\n    return this.convertName(node, {\n      prefix: fragmentVariablePrefix,\n      suffix,\n      useTypesPrefix: false,\n    });\n  }\n\n  protected getPunctuation(_declarationKind: DeclarationKind): string {\n    return '';\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/client-side-base-visitor.ts",
    "content": "import { basename, extname } from 'path';\nimport { normalizeImportExtension, oldVisit, Types } from '@graphql-codegen/plugin-helpers';\nimport { optimizeDocumentNode } from '@graphql-tools/optimize';\nimport autoBind from 'auto-bind';\nimport { pascalCase } from 'change-case-all';\nimport { DepGraph } from 'dependency-graph';\nimport {\n  DefinitionNode,\n  DirectiveNode,\n  DocumentNode,\n  FragmentDefinitionNode,\n  FragmentSpreadNode,\n  GraphQLSchema,\n  Kind,\n  OperationDefinitionNode,\n  SelectionNode,\n  print,\n} from 'graphql';\nimport gqlTag from 'graphql-tag';\nimport { BaseVisitor, ParsedConfig, RawConfig } from './base-visitor.js';\nimport { LoadedFragment, ParsedImport } from './types.js';\nimport { buildScalarsFromConfig, unique, flatten, getConfigValue, groupBy } from './utils.js';\nimport { FragmentImport, ImportDeclaration, generateFragmentImportStatement } from './imports.js';\n\ngqlTag.enableExperimentalFragmentVariables();\n\nexport enum DocumentMode {\n  graphQLTag = 'graphQLTag',\n  documentNode = 'documentNode',\n  documentNodeImportFragments = 'documentNodeImportFragments',\n  external = 'external',\n  string = 'string',\n}\n\nconst EXTENSIONS_TO_REMOVE = ['.ts', '.tsx', '.js', '.jsx'];\n\nexport interface RawClientSideBasePluginConfig extends RawConfig {\n  /**\n   * @default graphql-tag#gql\n   * @description Customize from which module will `gql` be imported from.\n   * This is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\n   *\n   * @exampleMarkdown\n   * ## graphql.macro\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          gqlImport: 'graphql.macro#gql'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Gatsby\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          gqlImport: 'gatsby#graphql'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  gqlImport?: string;\n  /**\n   * @default graphql#DocumentNode\n   * @description Customize from which module will `DocumentNode` be imported from.\n   * This is useful if you want to use modules other than `graphql`, e.g. `@graphql-typed-document-node`.\n   */\n  documentNodeImport?: string;\n  /**\n   * @default false\n   * @description Set this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\n   */\n  noExport?: boolean;\n  /**\n   * @default false\n   * @description Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\n   */\n  dedupeOperationSuffix?: boolean;\n  /**\n   * @default false\n   * @description Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\n   */\n  omitOperationSuffix?: boolean;\n  /**\n   * @default \"\"\n   * @description Adds a suffix to generated operation result type names\n   */\n  operationResultSuffix?: string;\n  /**\n   * @default \"\"\n   * @description Changes the GraphQL operations variables prefix.\n   */\n  documentVariablePrefix?: string;\n  /**\n   * @default Document\n   * @description Changes the GraphQL operations variables suffix.\n   */\n  documentVariableSuffix?: string;\n  /**\n   * @default \"\"\n   * @description Changes the GraphQL fragments variables prefix.\n   */\n  fragmentVariablePrefix?: string;\n  /**\n   * @default FragmentDoc\n   * @description Changes the GraphQL fragments variables suffix.\n   */\n  fragmentVariableSuffix?: string;\n  /**\n   * @default graphQLTag\n   * @description Declares how DocumentNode are created:\n   *\n   * - `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\n   * - `documentNode`: document nodes will be generated as objects when we generate the templates.\n   * - `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\n   * - `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\n   *\n   * Note that some plugins (like `typescript-graphql-request`) also supports `string` for this parameter.\n   *\n   */\n  documentMode?: DocumentMode;\n  /**\n   * @default true\n   * @description If you are using `documentMode: documentNode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\n   * This will remove all \"loc\" and \"description\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\n   */\n  optimizeDocumentNode?: boolean;\n  /**\n   * @default \"\"\n   * @description This config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\n   * This is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\n   */\n  importOperationTypesFrom?: string;\n  /**\n   * @default \"\"\n   * @description This config should be used if `documentMode` is `external`. This has 2 usage:\n   *\n   * - any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\n   * - 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          documentMode: 'external',\n   *          importDocumentNodeExternallyFrom: 'path/to/document-node-file',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          documentMode: 'external',\n   *          importDocumentNodeExternallyFrom: 'near-operation-file',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   */\n  importDocumentNodeExternallyFrom?: string;\n  /**\n   * @default false\n   * @description This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\n   */\n  pureMagicComment?: boolean;\n  /**\n   * @default false\n   * @description If set to true, it will enable support for parsing variables on fragments.\n   */\n  experimentalFragmentVariables?: boolean;\n}\n\nexport interface ClientSideBasePluginConfig extends ParsedConfig {\n  gqlImport: string;\n  documentNodeImport: string;\n  operationResultSuffix: string;\n  dedupeOperationSuffix: boolean;\n  omitOperationSuffix: boolean;\n  noExport: boolean;\n  documentVariablePrefix: string;\n  documentVariableSuffix: string;\n  fragmentVariablePrefix: string;\n  fragmentVariableSuffix: string;\n  documentMode?: DocumentMode;\n  importDocumentNodeExternallyFrom?: 'near-operation-file' | string;\n  importOperationTypesFrom?: string;\n  globalNamespace?: boolean;\n  pureMagicComment?: boolean;\n  optimizeDocumentNode: boolean;\n  experimentalFragmentVariables?: boolean;\n  unstable_onExecutableDocumentNode?: Unstable_OnExecutableDocumentNode;\n  unstable_omitDefinitions?: boolean;\n}\n\ntype ExecutableDocumentNodeMeta = Record<string, unknown>;\n\ntype Unstable_OnExecutableDocumentNode = (documentNode: DocumentNode) => void | ExecutableDocumentNodeMeta;\n\nexport class ClientSideBaseVisitor<\n  TRawConfig extends RawClientSideBasePluginConfig = RawClientSideBasePluginConfig,\n  TPluginConfig extends ClientSideBasePluginConfig = ClientSideBasePluginConfig\n> extends BaseVisitor<TRawConfig, TPluginConfig> {\n  protected _collectedOperations: OperationDefinitionNode[] = [];\n  protected _documents: Types.DocumentFile[] = [];\n  protected _additionalImports: string[] = [];\n  protected _imports = new Set<string>();\n\n  private _onExecutableDocumentNode?: Unstable_OnExecutableDocumentNode;\n  private _omitDefinitions?: boolean;\n  private readonly _fragments: ReadonlyMap<string, LoadedFragment>;\n  private readonly fragmentsGraph: DepGraph<LoadedFragment>;\n\n  constructor(\n    protected _schema: GraphQLSchema,\n    fragments: LoadedFragment[],\n    rawConfig: TRawConfig,\n    additionalConfig: Partial<TPluginConfig>,\n    documents?: Types.DocumentFile[]\n  ) {\n    super(rawConfig, {\n      scalars: buildScalarsFromConfig(_schema, rawConfig),\n      dedupeOperationSuffix: getConfigValue(rawConfig.dedupeOperationSuffix, false),\n      optimizeDocumentNode: getConfigValue(rawConfig.optimizeDocumentNode, true),\n      omitOperationSuffix: getConfigValue(rawConfig.omitOperationSuffix, false),\n      gqlImport: rawConfig.gqlImport || null,\n      documentNodeImport: rawConfig.documentNodeImport || null,\n      noExport: !!rawConfig.noExport,\n      importOperationTypesFrom: getConfigValue(rawConfig.importOperationTypesFrom, null),\n      operationResultSuffix: getConfigValue(rawConfig.operationResultSuffix, ''),\n      documentVariablePrefix: getConfigValue(rawConfig.documentVariablePrefix, ''),\n      documentVariableSuffix: getConfigValue(rawConfig.documentVariableSuffix, 'Document'),\n      fragmentVariablePrefix: getConfigValue(rawConfig.fragmentVariablePrefix, ''),\n      fragmentVariableSuffix: getConfigValue(rawConfig.fragmentVariableSuffix, 'FragmentDoc'),\n      documentMode: getConfigValue(rawConfig.documentMode, DocumentMode.graphQLTag),\n      importDocumentNodeExternallyFrom: getConfigValue(rawConfig.importDocumentNodeExternallyFrom, ''),\n      pureMagicComment: getConfigValue(rawConfig.pureMagicComment, false),\n      experimentalFragmentVariables: getConfigValue(rawConfig.experimentalFragmentVariables, false),\n      ...additionalConfig,\n    } as any);\n    this._documents = documents;\n    this._onExecutableDocumentNode = (rawConfig as any).unstable_onExecutableDocumentNode;\n    this._omitDefinitions = (rawConfig as any).unstable_omitDefinitions;\n    this._fragments = new Map(fragments.map(fragment => [fragment.name, fragment]));\n    this.fragmentsGraph = this._getFragmentsGraph();\n    autoBind(this);\n  }\n\n  protected _extractFragments(\n    document: FragmentDefinitionNode | OperationDefinitionNode,\n    withNested = false\n  ): string[] {\n    if (!document) {\n      return [];\n    }\n\n    const names: Set<string> = new Set();\n\n    oldVisit(document, {\n      enter: {\n        FragmentSpread: (node: FragmentSpreadNode) => {\n          names.add(node.name.value);\n\n          if (withNested) {\n            const foundFragment = this._fragments.get(node.name.value);\n\n            if (foundFragment) {\n              const childItems = this._extractFragments(foundFragment.node, true);\n\n              if (childItems && childItems.length > 0) {\n                for (const item of childItems) {\n                  names.add(item);\n                }\n              }\n            }\n          }\n        },\n      },\n    });\n\n    return Array.from(names);\n  }\n\n  protected _transformFragments(fragmentNames: Array<string>): string[] {\n    return fragmentNames.map(document => this.getFragmentVariableName(document));\n  }\n\n  protected _includeFragments(fragments: string[]): string {\n    if (fragments && fragments.length > 0) {\n      if (this.config.documentMode === DocumentMode.documentNode || this.config.documentMode === DocumentMode.string) {\n        return Array.from(this._fragments.values())\n          .filter(f => fragments.includes(this.getFragmentVariableName(f.name)))\n          .map(fragment => print(fragment.node))\n          .join('\\n');\n      }\n      if (this.config.documentMode === DocumentMode.documentNodeImportFragments) {\n        return '';\n      }\n      return String(fragments.map(name => '${' + name + '}').join('\\n'));\n    }\n\n    return '';\n  }\n\n  protected _prepareDocument(documentStr: string): string {\n    return documentStr;\n  }\n\n  protected _gql(node: FragmentDefinitionNode | OperationDefinitionNode): string {\n    const includeNestedFragments =\n      this.config.documentMode === DocumentMode.documentNode || this.config.documentMode === DocumentMode.string;\n    const fragmentNames = this._extractFragments(node, includeNestedFragments);\n    const fragments = this._transformFragments(fragmentNames);\n\n    const doc = this._prepareDocument(`\n    ${print(node).split('\\\\').join('\\\\\\\\') /* Re-escape escaped values in GraphQL syntax */}\n    ${this._includeFragments(fragments)}`);\n\n    if (this.config.documentMode === DocumentMode.documentNode) {\n      let gqlObj = gqlTag([doc]);\n\n      if (this.config.optimizeDocumentNode) {\n        gqlObj = optimizeDocumentNode(gqlObj);\n      }\n\n      return JSON.stringify(gqlObj);\n    }\n    if (this.config.documentMode === DocumentMode.documentNodeImportFragments) {\n      const gqlObj = gqlTag([doc]);\n\n      // We need to inline all fragments that are used in this document\n      // Otherwise we might encounter the following issues:\n      // 1. missing fragments\n      // 2. duplicated fragments\n\n      const fragmentDependencyNames = new Set(\n        fragmentNames.map(name => this.fragmentsGraph.dependenciesOf(name)).flatMap(item => item)\n      );\n\n      for (const fragmentName of fragmentNames) {\n        fragmentDependencyNames.add(fragmentName);\n      }\n\n      const jsonStringify = (json: unknown) =>\n        JSON.stringify(json, (key, value) => (key === 'loc' ? undefined : value));\n\n      let definitions = [...gqlObj.definitions];\n\n      for (const fragmentName of fragmentDependencyNames) {\n        definitions.push(this.fragmentsGraph.getNodeData(fragmentName).node);\n      }\n\n      if (this.config.optimizeDocumentNode) {\n        definitions = [\n          ...optimizeDocumentNode({\n            kind: Kind.DOCUMENT,\n            definitions,\n          }).definitions,\n        ];\n      }\n\n      let metaString = '';\n      if (this._onExecutableDocumentNode) {\n        const meta = this._getGraphQLCodegenMetadata(node, definitions);\n\n        if (meta) {\n          if (this._omitDefinitions === true) {\n            return `{${`\"__meta__\":${JSON.stringify(meta)},`.slice(0, -1)}}`;\n          }\n\n          metaString = `\"__meta__\":${JSON.stringify(meta)},`;\n        }\n      }\n\n      return `{${metaString}\"kind\":\"${Kind.DOCUMENT}\",\"definitions\":${jsonStringify(definitions)}}`;\n    }\n\n    if (this.config.documentMode === DocumentMode.string) {\n      if (node.kind === Kind.FRAGMENT_DEFINITION) {\n        const meta = this._getGraphQLCodegenMetadata(node, gqlTag([doc]).definitions);\n\n        return `new TypedDocumentString(\\`${doc}\\`, ${JSON.stringify({ fragmentName: node.name.value, ...meta })})`;\n      }\n\n      if (this._onExecutableDocumentNode && node.kind === Kind.OPERATION_DEFINITION) {\n        const meta = this._getGraphQLCodegenMetadata(node, gqlTag([doc]).definitions);\n\n        if (meta) {\n          if (this._omitDefinitions === true) {\n            return `{${`\"__meta__\":${JSON.stringify(meta)},`.slice(0, -1)}}`;\n          }\n          return `new TypedDocumentString(\\`${doc}\\`, ${JSON.stringify(meta)})`;\n        }\n      }\n\n      return `new TypedDocumentString(\\`${doc}\\`)`;\n    }\n\n    const gqlImport = this._parseImport(this.config.gqlImport || 'graphql-tag');\n\n    return (gqlImport.propName || 'gql') + '`' + doc + '`';\n  }\n\n  protected _getGraphQLCodegenMetadata(\n    node: OperationDefinitionNode | FragmentDefinitionNode,\n    definitions?: ReadonlyArray<DefinitionNode>\n  ): Record<string, any> | void | undefined {\n    let meta: Record<string, any> | void | undefined;\n\n    if (node.kind === Kind.OPERATION_DEFINITION) {\n      meta = this._onExecutableDocumentNode({\n        kind: Kind.DOCUMENT,\n        definitions,\n      });\n    }\n\n    const deferredFields = this._findDeferredFields(node);\n    if (Object.keys(deferredFields).length) {\n      meta = {\n        ...meta,\n        deferredFields,\n      };\n    }\n\n    return meta;\n  }\n\n  protected _findDeferredFields(node: OperationDefinitionNode | FragmentDefinitionNode): {\n    [fargmentName: string]: string[];\n  } {\n    const deferredFields: { [fargmentName: string]: string[] } = {};\n    const queue: SelectionNode[] = [...node.selectionSet.selections];\n    while (queue.length) {\n      const selection = queue.shift();\n      if (\n        selection.kind === Kind.FRAGMENT_SPREAD &&\n        selection.directives.some((d: DirectiveNode) => d.name.value === 'defer')\n      ) {\n        const fragmentName = selection.name.value;\n        const fragment = this.fragmentsGraph.getNodeData(fragmentName);\n        if (fragment) {\n          const fields = fragment.node.selectionSet.selections.reduce<string[]>((acc, selection) => {\n            if (selection.kind === Kind.FIELD) {\n              acc.push(selection.name.value);\n            }\n            return acc;\n          }, []);\n\n          deferredFields[fragmentName] = fields;\n        }\n      } else if (selection.kind === Kind.FIELD && selection.selectionSet) {\n        queue.push(...selection.selectionSet.selections);\n      }\n    }\n    return deferredFields;\n  }\n\n  protected _generateFragment(fragmentDocument: FragmentDefinitionNode): string | void {\n    const name = this.getFragmentVariableName(fragmentDocument);\n    const fragmentTypeSuffix = this.getFragmentSuffix(fragmentDocument);\n    return `export const ${name} =${this.config.pureMagicComment ? ' /*#__PURE__*/' : ''} ${this._gql(\n      fragmentDocument\n    )}${this.getDocumentNodeSignature(\n      this.convertName(fragmentDocument.name.value, {\n        useTypesPrefix: true,\n        suffix: fragmentTypeSuffix,\n      }),\n      this.config.experimentalFragmentVariables\n        ? this.convertName(fragmentDocument.name.value, {\n            suffix: fragmentTypeSuffix + 'Variables',\n          })\n        : 'unknown',\n      fragmentDocument\n    )};`;\n  }\n\n  private _getFragmentsGraph(): DepGraph<LoadedFragment> {\n    const graph = new DepGraph<LoadedFragment>({ circular: true });\n\n    for (const fragment of this._fragments.values()) {\n      if (graph.hasNode(fragment.name)) {\n        const cachedAsString = print(graph.getNodeData(fragment.name).node);\n        const asString = print(fragment.node);\n\n        if (cachedAsString !== asString) {\n          throw new Error(`Duplicated fragment called '${fragment.name}'!`);\n        }\n      }\n\n      graph.addNode(fragment.name, fragment);\n    }\n\n    for (const fragment of this._fragments.values()) {\n      const depends = this._extractFragments(fragment.node);\n\n      if (depends && depends.length > 0) {\n        for (const name of depends) {\n          graph.addDependency(fragment.name, name);\n        }\n      }\n    }\n\n    return graph;\n  }\n\n  public get fragments(): string {\n    if (this._fragments.size === 0 || this.config.documentMode === DocumentMode.external) {\n      return '';\n    }\n\n    const graph = this.fragmentsGraph;\n    const orderedDeps = graph.overallOrder();\n    const localFragments = orderedDeps\n      .filter(name => !graph.getNodeData(name).isExternal || this.config.includeExternalFragments)\n      .map(name => this._generateFragment(graph.getNodeData(name).node));\n\n    return localFragments.join('\\n');\n  }\n\n  protected _parseImport(importStr: string): ParsedImport {\n    // This is a special case when we want to ignore importing, and just use `gql` provided from somewhere else\n    // Plugins that uses that will need to ensure to add import/declaration for the gql identifier\n    if (importStr === 'gql') {\n      return {\n        moduleName: null,\n        propName: 'gql',\n      };\n    }\n\n    // This is a special use case, when we don't want this plugin to manage the import statement\n    // of the gql tag. In this case, we provide something like `Namespace.gql` and it will be used instead.\n    if (importStr.includes('.gql')) {\n      return {\n        moduleName: null,\n        propName: importStr,\n      };\n    }\n\n    const [moduleName, propName] = importStr.split('#');\n\n    return {\n      moduleName,\n      propName,\n    };\n  }\n\n  protected _generateImport(\n    { moduleName, propName }: ParsedImport,\n    varName: string,\n    isTypeImport: boolean\n  ): string | null {\n    const typeImport = isTypeImport && this.config.useTypeImports ? 'import type' : 'import';\n    const propAlias = propName === varName ? '' : ` as ${varName}`;\n\n    if (moduleName) {\n      return `${typeImport} ${propName ? `{ ${propName}${propAlias} }` : varName} from '${moduleName}';`;\n    }\n\n    return null;\n  }\n\n  private clearExtension(path: string): string {\n    const extension = extname(path);\n\n    const importExtension = normalizeImportExtension({\n      emitLegacyCommonJSImports: this.config.emitLegacyCommonJSImports,\n      importExtension: this.config.importExtension,\n    });\n\n    if (extension === importExtension) {\n      return path;\n    }\n\n    if (EXTENSIONS_TO_REMOVE.includes(extension)) {\n      return path.replace(/\\.[^/.]+$/, '');\n    }\n\n    return path;\n  }\n\n  public getImports(options: { excludeFragments?: boolean } = {}): string[] {\n    for (const i of this._additionalImports || []) {\n      this._imports.add(i);\n    }\n\n    switch (this.config.documentMode) {\n      case DocumentMode.documentNode:\n      case DocumentMode.documentNodeImportFragments: {\n        const documentNodeImport = this._parseImport(this.config.documentNodeImport || 'graphql#DocumentNode');\n        const tagImport = this._generateImport(documentNodeImport, 'DocumentNode', true);\n\n        if (tagImport) {\n          this._imports.add(tagImport);\n        }\n\n        break;\n      }\n      case DocumentMode.graphQLTag: {\n        const gqlImport = this._parseImport(this.config.gqlImport || 'graphql-tag');\n        const tagImport = this._generateImport(gqlImport, 'gql', false);\n\n        if (tagImport) {\n          this._imports.add(tagImport);\n        }\n\n        break;\n      }\n      case DocumentMode.external: {\n        if (this._collectedOperations.length > 0) {\n          if (this.config.importDocumentNodeExternallyFrom === 'near-operation-file' && this._documents.length === 1) {\n            let documentPath = `./${this.clearExtension(basename(this._documents[0].location))}`;\n            documentPath += normalizeImportExtension({\n              emitLegacyCommonJSImports: this.config.emitLegacyCommonJSImports,\n              importExtension: this.config.importExtension,\n            });\n\n            this._imports.add(`import * as Operations from '${documentPath}';`);\n          } else {\n            if (!this.config.importDocumentNodeExternallyFrom) {\n              // eslint-disable-next-line no-console\n              console.warn('importDocumentNodeExternallyFrom must be provided if documentMode=external');\n            }\n\n            this._imports.add(\n              `import * as Operations from '${this.clearExtension(this.config.importDocumentNodeExternallyFrom)}';`\n            );\n          }\n        }\n        break;\n      }\n      default:\n        break;\n    }\n\n    const excludeFragments =\n      options.excludeFragments || this.config.globalNamespace || this.config.documentMode !== DocumentMode.graphQLTag;\n\n    if (!excludeFragments) {\n      const importExtension = normalizeImportExtension({\n        emitLegacyCommonJSImports: this.config.emitLegacyCommonJSImports,\n        importExtension: this.config.importExtension,\n      });\n      const deduplicatedImports = Object.values(groupBy(this.config.fragmentImports, fi => fi.importSource.path))\n        .map(\n          (fragmentImports): ImportDeclaration<FragmentImport> => ({\n            ...fragmentImports[0],\n            importSource: {\n              ...fragmentImports[0].importSource,\n              identifiers: unique(\n                flatten(fragmentImports.map(fi => fi.importSource.identifiers)),\n                identifier => identifier.name\n              ),\n            },\n            emitLegacyCommonJSImports: this.config.emitLegacyCommonJSImports,\n            importExtension,\n          })\n        )\n        .filter(fragmentImport => fragmentImport.outputPath !== fragmentImport.importSource.path);\n\n      for (const fragmentImport of deduplicatedImports) {\n        this._imports.add(generateFragmentImportStatement(fragmentImport, 'document'));\n      }\n    }\n\n    return Array.from(this._imports);\n  }\n\n  protected buildOperation(\n    _node: OperationDefinitionNode,\n    _documentVariableName: string,\n    _operationType: string,\n    _operationResultType: string,\n    _operationVariablesTypes: string,\n    _hasRequiredVariables: boolean\n  ): string {\n    return null;\n  }\n\n  protected getDocumentNodeSignature(\n    _resultType: string,\n    _variablesTypes: string,\n    _node: FragmentDefinitionNode | OperationDefinitionNode\n  ): string {\n    if (\n      this.config.documentMode === DocumentMode.documentNode ||\n      this.config.documentMode === DocumentMode.documentNodeImportFragments\n    ) {\n      return ` as unknown as DocumentNode`;\n    }\n\n    return '';\n  }\n\n  /**\n   * Checks if the specific operation has variables that are non-null (required), and also doesn't have default.\n   * This is useful for deciding of `variables` should be optional or not.\n   * @param node\n   */\n  protected checkVariablesRequirements(node: OperationDefinitionNode): boolean {\n    const variables = node.variableDefinitions || [];\n\n    if (variables.length === 0) {\n      return false;\n    }\n\n    return variables.some(variableDef => variableDef.type.kind === Kind.NON_NULL_TYPE && !variableDef.defaultValue);\n  }\n\n  public getOperationVariableName(node: OperationDefinitionNode) {\n    return this.convertName(node, {\n      suffix: this.config.documentVariableSuffix,\n      prefix: this.config.documentVariablePrefix,\n      useTypesPrefix: false,\n    });\n  }\n\n  public OperationDefinition(node: OperationDefinitionNode): string {\n    this._collectedOperations.push(node);\n\n    const documentVariableName = this.getOperationVariableName(node);\n\n    const operationType: string = pascalCase(node.operation);\n    const operationTypeSuffix: string = this.getOperationSuffix(node, operationType);\n\n    const operationResultType: string = this.convertName(node, {\n      suffix: operationTypeSuffix + this._parsedConfig.operationResultSuffix,\n    });\n    const operationVariablesTypes: string = this.convertName(node, {\n      suffix: operationTypeSuffix + 'Variables',\n    });\n\n    let documentString = '';\n    if (\n      this.config.documentMode !== DocumentMode.external &&\n      documentVariableName !== '' // only generate exports for named queries\n    ) {\n      documentString = `${this.config.noExport ? '' : 'export'} const ${documentVariableName} =${\n        this.config.pureMagicComment ? ' /*#__PURE__*/' : ''\n      } ${this._gql(node)}${this.getDocumentNodeSignature(operationResultType, operationVariablesTypes, node)};`;\n    }\n\n    const hasRequiredVariables = this.checkVariablesRequirements(node);\n\n    const additional = this.buildOperation(\n      node,\n      documentVariableName,\n      operationType,\n      operationResultType,\n      operationVariablesTypes,\n      hasRequiredVariables\n    );\n\n    return [documentString, additional].filter(a => a).join('\\n');\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/declaration-kinds.ts",
    "content": "import { DeclarationKind, DeclarationKindConfig } from './types.js';\n\nexport const DEFAULT_DECLARATION_KINDS: DeclarationKindConfig = {\n  directive: 'type',\n  scalar: 'type',\n  input: 'type',\n  type: 'type',\n  interface: 'type',\n  arguments: 'type',\n};\n\nexport function normalizeDeclarationKind(\n  declarationKind?: DeclarationKind | DeclarationKindConfig\n): DeclarationKindConfig {\n  if (typeof declarationKind === 'string') {\n    return {\n      directive: declarationKind,\n      scalar: declarationKind,\n      input: declarationKind,\n      type: declarationKind,\n      interface: declarationKind,\n      arguments: declarationKind,\n    };\n  }\n\n  return {\n    ...DEFAULT_DECLARATION_KINDS,\n    ...declarationKind,\n  };\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/enum-values.ts",
    "content": "import { GraphQLEnumType, GraphQLSchema, isEnumType } from 'graphql';\nimport { parseMapper } from './mappers.js';\nimport { EnumValuesMap, ParsedEnumValuesMap } from './types.js';\n\nfunction escapeString(str: string) {\n  return str.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/'/g, \"\\\\'\");\n}\n\nexport function parseEnumValues({\n  schema,\n  mapOrStr = {},\n  ignoreEnumValuesFromSchema,\n}: {\n  schema: GraphQLSchema;\n  mapOrStr: EnumValuesMap;\n  ignoreEnumValuesFromSchema?: boolean;\n}): ParsedEnumValuesMap {\n  const allTypes = schema.getTypeMap();\n  const allEnums = Object.keys(allTypes).filter(t => isEnumType(allTypes[t]));\n\n  if (typeof mapOrStr === 'object') {\n    if (!ignoreEnumValuesFromSchema) {\n      for (const enumTypeName of allEnums) {\n        const enumType = schema.getType(enumTypeName) as GraphQLEnumType;\n        for (const { name, value } of enumType.getValues()) {\n          if (value !== name) {\n            mapOrStr[enumTypeName] ||= {};\n            if (typeof mapOrStr[enumTypeName] !== 'string' && !mapOrStr[enumTypeName][name]) {\n              mapOrStr[enumTypeName][name] = typeof value === 'string' ? escapeString(value) : value;\n            }\n          }\n        }\n      }\n    }\n\n    const invalidMappings = Object.keys(mapOrStr).filter(gqlName => !allEnums.includes(gqlName));\n\n    if (invalidMappings.length > 0) {\n      throw new Error(\n        `Invalid 'enumValues' mapping! \\n\n        The following types does not exist in your GraphQL schema: ${invalidMappings.join(', ')}`\n      );\n    }\n\n    return Object.keys(mapOrStr).reduce((prev, gqlIdentifier) => {\n      const pointer = mapOrStr[gqlIdentifier];\n\n      if (typeof pointer === 'string') {\n        const mapper = parseMapper(pointer, gqlIdentifier);\n\n        return {\n          ...prev,\n          [gqlIdentifier]: {\n            isDefault: mapper.isExternal && mapper.default,\n            typeIdentifier: gqlIdentifier,\n            sourceFile: mapper.isExternal ? mapper.source : null,\n            sourceIdentifier: mapper.type,\n            importIdentifier: mapper.isExternal ? mapper.import : null,\n            mappedValues: null,\n          },\n        };\n      }\n      if (typeof pointer === 'object') {\n        return {\n          ...prev,\n          [gqlIdentifier]: {\n            isDefault: false,\n            typeIdentifier: gqlIdentifier,\n            sourceFile: null,\n            sourceIdentifier: null,\n            importIdentifier: null,\n            mappedValues: pointer,\n          },\n        };\n      }\n      throw new Error(\n        `Invalid \"enumValues\" configuration \\n\n        Enum \"${gqlIdentifier}\": expected string or object (with enum values mapping)`\n      );\n    }, {} as ParsedEnumValuesMap);\n  }\n  if (typeof mapOrStr === 'string') {\n    return allEnums\n      .filter(enumName => !enumName.startsWith('__'))\n      .reduce((prev, enumName) => {\n        return {\n          ...prev,\n          [enumName]: {\n            isDefault: false,\n            typeIdentifier: enumName,\n            sourceFile: mapOrStr,\n            sourceIdentifier: enumName,\n            importIdentifier: enumName,\n            mappedValues: null,\n          },\n        };\n      }, {} as ParsedEnumValuesMap);\n  }\n\n  return {};\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/imports.ts",
    "content": "import { dirname, isAbsolute, join, relative, resolve } from 'path';\nimport parse from 'parse-filepath';\nimport { normalizeImportExtension } from '@graphql-codegen/plugin-helpers';\n\nexport type ImportDeclaration<T = string> = {\n  outputPath: string;\n  importSource: ImportSource<T>;\n  baseOutputDir: string;\n  baseDir: string;\n  typesImport: boolean;\n  emitLegacyCommonJSImports?: boolean;\n  importExtension: '' | `.${string}`;\n};\n\nexport type ImportSource<T = string> = {\n  /**\n   * Source path, relative to the `baseOutputDir`\n   */\n  path: string;\n  /**\n   * Namespace to import source as\n   */\n  namespace?: string;\n  /**\n   * Entity names to import\n   */\n  identifiers?: T[];\n};\n\nexport type FragmentImport = {\n  name: string;\n  kind: 'type' | 'document';\n};\n\nexport function generateFragmentImportStatement(\n  statement: ImportDeclaration<FragmentImport>,\n  kind: 'type' | 'document' | 'both'\n): string {\n  const { importSource: fragmentImportSource, ...rest } = statement;\n  const { identifiers, path, namespace } = fragmentImportSource;\n  const importSource: ImportSource<string> = {\n    identifiers: identifiers\n      .filter(fragmentImport => kind === 'both' || kind === fragmentImport.kind)\n      .map(({ name }) => name),\n    path,\n    namespace,\n  };\n  return generateImportStatement({\n    importSource,\n    ...rest,\n    typesImport: kind === 'type' ? statement.typesImport : false,\n  });\n}\n\nexport function generateImportStatement(statement: ImportDeclaration): string {\n  const { baseDir, importSource, outputPath, typesImport } = statement;\n  const importPath = resolveImportPath(baseDir, outputPath, importSource.path);\n  const importNames = importSource.identifiers?.length\n    ? `{ ${Array.from(new Set(importSource.identifiers)).join(', ')} }`\n    : '*';\n  const importExtension =\n    importPath.startsWith('/') || importPath.startsWith('.')\n      ? normalizeImportExtension({\n          emitLegacyCommonJSImports: statement.emitLegacyCommonJSImports,\n          importExtension: statement.importExtension,\n        })\n      : '';\n  const importAlias = importSource.namespace ? ` as ${importSource.namespace}` : '';\n  const importStatement = typesImport ? 'import type' : 'import';\n  return `${importStatement} ${importNames}${importAlias} from '${importPath}${importExtension}';${\n    importAlias ? '\\n' : ''\n  }`;\n  // return `${importStatement} ${importNames}${importAlias} from '${importPath}';${importAlias ? '\\n' : ''}`;\n}\n\nfunction resolveImportPath(baseDir: string, outputPath: string, sourcePath: string) {\n  const shouldAbsolute = !sourcePath.startsWith('~');\n  if (shouldAbsolute) {\n    const absGeneratedFilePath = resolve(baseDir, outputPath);\n    const absImportFilePath = resolve(baseDir, sourcePath);\n    return resolveRelativeImport(absGeneratedFilePath, absImportFilePath);\n  }\n  return sourcePath.replace(`~`, '');\n}\n\nexport function resolveRelativeImport(from: string, to: string): string {\n  if (!isAbsolute(from)) {\n    throw new Error(`Argument 'from' must be an absolute path, '${from}' given.`);\n  }\n  if (!isAbsolute(to)) {\n    throw new Error(`Argument 'to' must be an absolute path, '${to}' given.`);\n  }\n  return fixLocalFilePath(clearExtension(relative(dirname(from), to)));\n}\n\nexport function resolveImportSource<T>(source: string | ImportSource<T>): ImportSource<T> {\n  return typeof source === 'string' ? { path: source } : source;\n}\n\nexport function clearExtension(path: string): string {\n  const parsedPath = parse(path);\n  return join(parsedPath.dir, parsedPath.name).replace(/\\\\/g, '/');\n}\n\nexport function fixLocalFilePath(path: string): string {\n  return path.startsWith('..') ? path : `./${path}`;\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/index.ts",
    "content": "export * from './avoid-optionals.js';\nexport * from './base-documents-visitor.js';\nexport * from './base-resolvers-visitor.js';\nexport * from './base-types-visitor.js';\nexport * from './base-visitor.js';\nexport * from './client-side-base-visitor.js';\nexport * from './declaration-kinds.js';\nexport * from './enum-values.js';\nexport * from './imports.js';\nexport * from './mappers.js';\nexport * from './naming.js';\nexport * from './optimize-operations.js';\nexport * from './scalars.js';\nexport * from './selection-set-processor/base.js';\nexport * from './selection-set-processor/pre-resolve-types.js';\nexport * from './selection-set-to-object.js';\nexport * from './types.js';\nexport * from './utils.js';\nexport * from './variables-to-object.js';\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/mappers.ts",
    "content": "import { ParsedResolversConfig, RawResolversConfig } from './base-resolvers-visitor.js';\nimport { DirectiveArgumentAndInputFieldMappings, ParsedDirectiveArgumentAndInputFieldMappings } from './types.js';\n\nexport type ParsedMapper = InternalParsedMapper | ExternalParsedMapper;\nexport interface InternalParsedMapper {\n  isExternal: false;\n  type: string;\n}\nexport interface ExternalParsedMapper {\n  isExternal: true;\n  type: string;\n  import: string;\n  source: string;\n  default: boolean;\n}\n\nexport function isExternalMapperType(m: ParsedMapper): m is ExternalParsedMapper {\n  return !!(m as ExternalParsedMapper).import;\n}\n\nenum MapperKind {\n  Namespace,\n  Default,\n  Regular,\n}\n\ninterface Helpers {\n  items: string[];\n  isNamespace: boolean;\n  isDefault: boolean;\n  hasAlias: boolean;\n}\n\nfunction prepareLegacy(mapper: string): Helpers {\n  const isScoped = mapper.includes('\\\\#');\n  if (mapper.includes('\\\\#')) {\n    mapper = mapper.replace('\\\\#', '');\n  }\n  const items = mapper.split('#');\n  const isNamespace = items.length === 3;\n  const isDefault = items[1].trim() === 'default' || items[1].startsWith('default ');\n  const hasAlias = items[1].includes(' as ');\n  const source = isScoped ? `#${items[0]}` : items[0];\n  items[0] = source;\n\n  return {\n    items,\n    isDefault,\n    isNamespace,\n    hasAlias,\n  };\n}\n\nfunction prepare(mapper: string): Helpers {\n  const isScoped = mapper.includes('\\\\#');\n  if (mapper.includes('\\\\#')) {\n    mapper = mapper.replace('\\\\#', '');\n  }\n  let [source, path] = mapper.split('#');\n  const isNamespace = path.includes('.');\n  const isDefault = path.trim() === 'default' || path.startsWith('default ');\n  const hasAlias = path.includes(' as ');\n  source = isScoped ? `#${source}` : source;\n\n  return {\n    items: isNamespace ? [source, ...path.split('.')] : [source, path],\n    isDefault,\n    isNamespace,\n    hasAlias,\n  };\n}\n\nfunction isLegacyMode(mapper: string) {\n  if (mapper.includes('\\\\#')) {\n    mapper = mapper.replace('\\\\#', '');\n  }\n  return mapper.split('#').length === 3;\n}\n\nexport function parseMapper(mapper: string, gqlTypeName: string | null = null, suffix?: string): ParsedMapper {\n  if (isExternalMapper(mapper)) {\n    const { isNamespace, isDefault, hasAlias, items } = isLegacyMode(mapper) ? prepareLegacy(mapper) : prepare(mapper);\n\n    const mapperKind: MapperKind = isNamespace\n      ? MapperKind.Namespace\n      : isDefault\n      ? MapperKind.Default\n      : MapperKind.Regular;\n\n    function handleAlias(isDefault = false) {\n      const [importedType, aliasType] = items[1].split(/\\s+as\\s+/);\n\n      const type = maybeSuffix(aliasType);\n\n      return {\n        importElement: isDefault ? type : `${importedType} as ${type}`,\n        type,\n      };\n    }\n\n    function maybeSuffix(type: string) {\n      if (suffix) {\n        return addSuffix(type, suffix);\n      }\n\n      return type;\n    }\n\n    function handle(): {\n      importElement: string;\n      type: string;\n    } {\n      switch (mapperKind) {\n        // ./my/module#Namespace#Identifier\n        case MapperKind.Namespace: {\n          const [, ns, identifier] = items;\n\n          return {\n            type: `${ns}.${identifier}`,\n            importElement: ns,\n          };\n        }\n\n        case MapperKind.Default: {\n          // ./my/module#default as alias\n          if (hasAlias) {\n            return handleAlias(true);\n          }\n\n          const type = maybeSuffix(String(gqlTypeName));\n\n          // ./my/module#default\n          return {\n            importElement: type,\n            type,\n          };\n        }\n\n        case MapperKind.Regular: {\n          // ./my/module#Identifier as alias\n          if (hasAlias) {\n            return handleAlias();\n          }\n\n          const identifier = items[1];\n\n          const type = maybeSuffix(identifier);\n\n          // ./my/module#Identifier\n          return {\n            type,\n            importElement: suffix ? `${identifier} as ${type}` : type,\n          };\n        }\n      }\n    }\n\n    const { type, importElement } = handle();\n\n    return {\n      default: isDefault,\n      isExternal: true,\n      source: items[0],\n      type,\n      import: importElement.replace(/<(.*?)>/g, ''),\n    };\n  }\n\n  return {\n    isExternal: false,\n    type: mapper,\n  };\n}\n\nfunction addSuffix(element: string, suffix: string): string {\n  const generic = element.indexOf('<');\n  if (generic === -1) {\n    return `${element}${suffix}`;\n  }\n  return `${element.slice(0, generic)}${suffix}${element.slice(generic)}`;\n}\n\nexport function isExternalMapper(value: string): boolean {\n  return value.includes('#');\n}\n\nexport function transformMappers(\n  rawMappers: RawResolversConfig['mappers'],\n  mapperTypeSuffix?: string\n): ParsedResolversConfig['mappers'] {\n  const result: ParsedResolversConfig['mappers'] = {};\n\n  for (const gqlTypeName of Object.keys(rawMappers)) {\n    const mapperDef = rawMappers[gqlTypeName];\n    const parsedMapper = parseMapper(mapperDef, gqlTypeName, mapperTypeSuffix);\n    result[gqlTypeName] = parsedMapper;\n  }\n\n  return result;\n}\n\nexport function transformDirectiveArgumentAndInputFieldMappings(\n  rawDirectiveArgumentAndInputFieldMappings: DirectiveArgumentAndInputFieldMappings,\n  directiveArgumentAndInputFieldMappingTypeSuffix?: string\n): ParsedDirectiveArgumentAndInputFieldMappings {\n  const result: ParsedDirectiveArgumentAndInputFieldMappings = {};\n\n  for (const directive of Object.keys(rawDirectiveArgumentAndInputFieldMappings)) {\n    const mapperDef = rawDirectiveArgumentAndInputFieldMappings[directive];\n    const parsedMapper = parseMapper(mapperDef, directive, directiveArgumentAndInputFieldMappingTypeSuffix);\n    result[directive] = parsedMapper;\n  }\n\n  return result;\n}\n\nexport function buildMapperImport(\n  source: string,\n  types: { identifier: string; asDefault?: boolean }[],\n  useTypeImports: boolean\n): string | null {\n  if (!types || types.length === 0) {\n    return null;\n  }\n\n  const defaultType = types.find(t => t.asDefault === true);\n  let namedTypes = types.filter(t => !t.asDefault);\n\n  if (useTypeImports) {\n    if (defaultType) {\n      // default as Baz\n      namedTypes = [{ identifier: `default as ${defaultType.identifier}` }, ...namedTypes];\n    }\n    // { Foo, Bar as BarModel }\n    const namedImports = namedTypes.length ? `{ ${namedTypes.map(t => t.identifier).join(', ')} }` : '';\n\n    // { default as Baz, Foo, Bar as BarModel }\n    return `import type ${[namedImports].filter(Boolean).join(', ')} from '${source}';`;\n  }\n\n  // { Foo, Bar as BarModel }\n  const namedImports = namedTypes.length ? `{ ${namedTypes.map(t => t.identifier).join(', ')} }` : '';\n  // Baz\n  const defaultImport = defaultType ? defaultType.identifier : '';\n\n  // Baz, { Foo, Bar as BarModel }\n  return `import ${[defaultImport, namedImports].filter(Boolean).join(', ')} from '${source}';`;\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/naming.ts",
    "content": "import { resolveExternalModuleAndFn } from '@graphql-codegen/plugin-helpers';\nimport { pascalCase } from 'change-case-all';\nimport { ASTNode } from 'graphql';\nimport { ConvertFn, ConvertOptions, NamingConvention, NamingConventionMap } from './types.js';\nimport { convertNameParts, getConfigValue } from './utils.js';\n\nfunction getKind(node: ASTNode | string): keyof NamingConventionMap {\n  if (typeof node === 'string') {\n    return 'typeNames';\n  }\n\n  if (['EnumValueDefinition', 'EnumValue'].includes(node.kind)) {\n    return 'enumValues';\n  }\n\n  return 'typeNames';\n}\n\nfunction getName(node: ASTNode | string): string | undefined {\n  if (node == null) {\n    return undefined;\n  }\n\n  if (typeof node === 'string') {\n    return node;\n  }\n\n  switch (node.kind) {\n    case 'OperationDefinition':\n    case 'Variable':\n    case 'Argument':\n    case 'FragmentSpread':\n    case 'FragmentDefinition':\n    case 'ObjectField':\n    case 'Directive':\n    case 'NamedType':\n    case 'ScalarTypeDefinition':\n    case 'ObjectTypeDefinition':\n    case 'FieldDefinition':\n    case 'InputValueDefinition':\n    case 'InterfaceTypeDefinition':\n    case 'UnionTypeDefinition':\n    case 'EnumTypeDefinition':\n    case 'EnumValueDefinition':\n    case 'InputObjectTypeDefinition':\n    case 'DirectiveDefinition': {\n      return getName(node.name);\n    }\n    case 'Name': {\n      return node.value;\n    }\n    case 'Field': {\n      return getName(node.alias || node.name);\n    }\n    case 'VariableDefinition': {\n      return getName(node.variable);\n    }\n  }\n\n  return undefined;\n}\n\nexport function convertFactory(config: { namingConvention?: NamingConvention }): ConvertFn {\n  function resolveConventionName(type: keyof NamingConventionMap): (str: string, opts?: ConvertOptions) => string {\n    if (!config.namingConvention) {\n      return (str: string, opts: ConvertOptions = {}) => {\n        return convertNameParts(str, pascalCase, getConfigValue(opts?.transformUnderscore, false));\n      };\n    }\n\n    if (typeof config.namingConvention === 'string') {\n      if (config.namingConvention === 'keep') {\n        return str => str;\n      }\n\n      return (str: string, opts: ConvertOptions = {}) => {\n        return convertNameParts(\n          str,\n          resolveExternalModuleAndFn(config.namingConvention),\n          getConfigValue(opts?.transformUnderscore, false)\n        );\n      };\n    }\n\n    if (typeof config.namingConvention === 'function') {\n      return (str: string, opts: ConvertOptions = {}) => {\n        return convertNameParts(\n          str,\n          config.namingConvention as (str: string) => string,\n          getConfigValue(opts?.transformUnderscore, false)\n        );\n      };\n    }\n\n    if (typeof config.namingConvention === 'object' && config.namingConvention[type] === 'keep') {\n      return str => str;\n    }\n\n    if (typeof config.namingConvention === 'object') {\n      if (!config.namingConvention[type]) {\n        return (str: string, opts: ConvertOptions = {}) => {\n          const transformUnderscore =\n            (config.namingConvention as NamingConventionMap).transformUnderscore || opts?.transformUnderscore;\n          return convertNameParts(str, pascalCase, getConfigValue(transformUnderscore, false));\n        };\n      }\n\n      return (str: string, opts: ConvertOptions = {}) => {\n        return convertNameParts(\n          str,\n          resolveExternalModuleAndFn(config.namingConvention[type]),\n          getConfigValue(opts?.transformUnderscore, true)\n        );\n      };\n    }\n\n    return config.namingConvention[type] as any;\n  }\n\n  return (node, opts) => {\n    const prefix = opts?.prefix;\n    const suffix = opts?.suffix;\n\n    const kind = getKind(node);\n    const str = [prefix || '', getName(node), suffix || ''].join('');\n\n    return resolveConventionName(kind)(str, opts);\n  };\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/optimize-operations.ts",
    "content": "import { Types } from '@graphql-codegen/plugin-helpers';\nimport { optimizeDocuments } from '@graphql-tools/relay-operation-optimizer';\nimport { GraphQLSchema } from 'graphql';\n\nexport function optimizeOperations(\n  schema: GraphQLSchema,\n  documents: Types.DocumentFile[],\n  options?: { includeFragments: boolean }\n): Types.DocumentFile[] {\n  const newDocuments = optimizeDocuments(\n    schema,\n    documents.map(s => s.document),\n    options\n  );\n\n  return newDocuments.map((document, index) => ({\n    location: documents[index]?.location || 'optimized by relay',\n    document,\n  }));\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/scalars.ts",
    "content": "import { NormalizedScalarsMap } from './types.js';\n\nexport const DEFAULT_SCALARS: NormalizedScalarsMap = {\n  ID: {\n    input: 'string',\n    output: 'string',\n  },\n  String: {\n    input: 'string',\n    output: 'string',\n  },\n  Boolean: {\n    input: 'boolean',\n    output: 'boolean',\n  },\n  Int: {\n    input: 'number',\n    output: 'number',\n  },\n  Float: {\n    input: 'number',\n    output: 'number',\n  },\n};\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/selection-set-processor/base.ts",
    "content": "import { GraphQLInterfaceType, GraphQLNamedType, GraphQLObjectType, GraphQLOutputType, Location } from 'graphql';\nimport { AvoidOptionalsConfig, ConvertNameFn, NormalizedScalarsMap } from '../types.js';\n\nexport type PrimitiveField = { isConditional: boolean; fieldName: string };\nexport type PrimitiveAliasedFields = { isConditional: boolean; alias: string; fieldName: string };\nexport type LinkField = { alias: string; name: string; type: string; selectionSet: string };\nexport type NameAndType = { name: string; type: string };\nexport type ProcessResult = null | Array<NameAndType | string>;\n\nexport type SelectionSetProcessorConfig = {\n  namespacedImportName: string | null;\n  convertName: ConvertNameFn<any>;\n  enumPrefix: boolean | null;\n  enumSuffix: boolean | null;\n  scalars: NormalizedScalarsMap;\n  formatNamedField(\n    name: string,\n    type?: GraphQLOutputType | GraphQLNamedType | null,\n    isConditional?: boolean,\n    isOptional?: boolean\n  ): string;\n  wrapTypeWithModifiers(baseType: string, type: GraphQLOutputType | GraphQLNamedType): string;\n  avoidOptionals?: AvoidOptionalsConfig | boolean;\n  printFieldsOnNewLines?: boolean;\n};\n\nexport class BaseSelectionSetProcessor<Config extends SelectionSetProcessorConfig> {\n  typeCache = new Map<Location, Map<string, [string, string]>>();\n\n  constructor(public config: Config) {}\n\n  buildFieldsIntoObject(allObjectsMerged: string[]): string {\n    if (this.config.printFieldsOnNewLines) {\n      return `{\\n  ${allObjectsMerged.join(',\\n  ')}\\n}`;\n    }\n    return `{ ${allObjectsMerged.join(', ')} }`;\n  }\n\n  buildSelectionSetFromStrings(pieces: string[]): string {\n    if (pieces.length === 0) {\n      return null;\n    }\n    if (pieces.length === 1) {\n      return pieces[0];\n    }\n    return `(\\n  ${pieces.join(`\\n  & `)}\\n)`;\n  }\n\n  transformPrimitiveFields(\n    _schemaType: GraphQLObjectType | GraphQLInterfaceType,\n    _fields: PrimitiveField[],\n    _unsetTypes?: boolean\n  ): ProcessResult {\n    throw new Error(\n      `Please override \"transformPrimitiveFields\" as part of your BaseSelectionSetProcessor implementation!`\n    );\n  }\n\n  transformAliasesPrimitiveFields(\n    _schemaType: GraphQLObjectType | GraphQLInterfaceType,\n    _fields: PrimitiveAliasedFields[],\n    _unsetTypes?: boolean\n  ): ProcessResult {\n    throw new Error(\n      `Please override \"transformAliasesPrimitiveFields\" as part of your BaseSelectionSetProcessor implementation!`\n    );\n  }\n\n  transformLinkFields(_fields: LinkField[], _unsetTypes?: boolean): ProcessResult {\n    throw new Error(`Please override \"transformLinkFields\" as part of your BaseSelectionSetProcessor implementation!`);\n  }\n\n  transformTypenameField(_type: string, _name: string): ProcessResult {\n    throw new Error(\n      `Please override \"transformTypenameField\" as part of your BaseSelectionSetProcessor implementation!`\n    );\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/selection-set-processor/pre-resolve-types.ts",
    "content": "import { getBaseType, removeNonNullWrapper } from '@graphql-codegen/plugin-helpers';\nimport { GraphQLInterfaceType, GraphQLObjectType, isEnumType, isNonNullType } from 'graphql';\nimport {\n  BaseSelectionSetProcessor,\n  LinkField,\n  PrimitiveAliasedFields,\n  PrimitiveField,\n  ProcessResult,\n  SelectionSetProcessorConfig,\n} from './base.js';\n\nexport class PreResolveTypesProcessor extends BaseSelectionSetProcessor<SelectionSetProcessorConfig> {\n  transformTypenameField(type: string, name: string): ProcessResult {\n    return [\n      {\n        type,\n        name,\n      },\n    ];\n  }\n\n  transformPrimitiveFields(\n    schemaType: GraphQLObjectType | GraphQLInterfaceType,\n    fields: PrimitiveField[],\n    unsetTypes?: boolean\n  ): ProcessResult {\n    if (fields.length === 0) {\n      return [];\n    }\n\n    return fields.map(field => {\n      const fieldObj = schemaType.getFields()[field.fieldName];\n\n      const baseType = getBaseType(fieldObj.type);\n      let typeToUse = baseType.name;\n\n      const useInnerType = field.isConditional && isNonNullType(fieldObj.type);\n      const innerType = useInnerType ? removeNonNullWrapper(fieldObj.type) : undefined;\n\n      const name = this.config.formatNamedField(\n        field.fieldName,\n        useInnerType ? innerType : fieldObj.type,\n        field.isConditional,\n        unsetTypes\n      );\n\n      if (unsetTypes) {\n        return {\n          name,\n          type: 'never',\n        };\n      }\n\n      if (isEnumType(baseType)) {\n        typeToUse =\n          (this.config.namespacedImportName ? `${this.config.namespacedImportName}.` : '') +\n          this.config.convertName(baseType.name, {\n            useTypesPrefix: this.config.enumPrefix,\n            useTypesSuffix: this.config.enumSuffix,\n          });\n      } else if (this.config.scalars[baseType.name]) {\n        typeToUse = this.config.scalars[baseType.name].output;\n      }\n\n      const wrappedType = this.config.wrapTypeWithModifiers(typeToUse, fieldObj.type);\n\n      return {\n        name,\n        type: wrappedType,\n      };\n    });\n  }\n\n  transformAliasesPrimitiveFields(\n    schemaType: GraphQLObjectType | GraphQLInterfaceType,\n    fields: PrimitiveAliasedFields[],\n    unsetTypes?: boolean\n  ): ProcessResult {\n    if (fields.length === 0) {\n      return [];\n    }\n\n    return fields.map(aliasedField => {\n      if (aliasedField.fieldName === '__typename') {\n        const name = this.config.formatNamedField(aliasedField.alias, null);\n        return {\n          name,\n          type: `'${schemaType.name}'`,\n        };\n      }\n      const fieldObj = schemaType.getFields()[aliasedField.fieldName];\n      const baseType = getBaseType(fieldObj.type);\n      let typeToUse = this.config.scalars[baseType.name]?.output || baseType.name;\n\n      if (isEnumType(baseType)) {\n        typeToUse =\n          (this.config.namespacedImportName ? `${this.config.namespacedImportName}.` : '') +\n          this.config.convertName(baseType.name, {\n            useTypesPrefix: this.config.enumPrefix,\n            useTypesSuffix: this.config.enumSuffix,\n          });\n      }\n\n      const name = this.config.formatNamedField(\n        aliasedField.alias,\n        fieldObj.type,\n        aliasedField.isConditional,\n        unsetTypes\n      );\n      if (unsetTypes) {\n        return {\n          type: 'never',\n          name,\n        };\n      }\n\n      const wrappedType = this.config.wrapTypeWithModifiers(typeToUse, fieldObj.type);\n\n      return {\n        name,\n        type: wrappedType,\n      };\n    });\n  }\n\n  transformLinkFields(fields: LinkField[], unsetTypes?: boolean): ProcessResult {\n    if (fields.length === 0) {\n      return [];\n    }\n\n    return fields.map(field => ({\n      name: field.alias || field.name,\n      type: unsetTypes ? 'never' : field.selectionSet,\n    }));\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/selection-set-to-object.ts",
    "content": "import { createHash } from 'crypto';\nimport { getBaseType } from '@graphql-codegen/plugin-helpers';\nimport { getRootTypes } from '@graphql-tools/utils';\nimport autoBind from 'auto-bind';\nimport {\n  DirectiveNode,\n  FieldNode,\n  FragmentSpreadNode,\n  GraphQLField,\n  GraphQLNamedType,\n  GraphQLObjectType,\n  GraphQLOutputType,\n  GraphQLSchema,\n  InlineFragmentNode,\n  isInterfaceType,\n  isListType,\n  isNonNullType,\n  isObjectType,\n  isTypeSubTypeOf,\n  isUnionType,\n  Kind,\n  SchemaMetaFieldDef,\n  SelectionNode,\n  SelectionSetNode,\n  TypeMetaFieldDef,\n} from 'graphql';\nimport { ParsedDocumentsConfig } from './base-documents-visitor.js';\nimport { BaseVisitorConvertOptions } from './base-visitor.js';\nimport {\n  BaseSelectionSetProcessor,\n  LinkField,\n  NameAndType,\n  PrimitiveAliasedFields,\n  PrimitiveField,\n  ProcessResult,\n} from './selection-set-processor/base.js';\nimport {\n  ConvertNameFn,\n  FragmentDirectives,\n  GetFragmentSuffixFn,\n  LoadedFragment,\n  NormalizedScalarsMap,\n} from './types.js';\nimport {\n  DeclarationBlock,\n  DeclarationBlockConfig,\n  getFieldNames,\n  getFieldNodeNameValue,\n  getPossibleTypes,\n  hasConditionalDirectives,\n  hasIncrementalDeliveryDirectives,\n  mergeSelectionSets,\n  separateSelectionSet,\n} from './utils.js';\n\ntype FragmentSpreadUsage = {\n  fragmentName: string;\n  typeName: string;\n  onType: string;\n  selectionNodes: Array<SelectionNode>;\n  fragmentDirectives?: DirectiveNode[];\n};\n\ninterface DependentType {\n  name: string;\n  content: string;\n  isUnionType?: boolean;\n}\n\ntype CollectedFragmentNode = (SelectionNode | FragmentSpreadUsage | DirectiveNode) & FragmentDirectives;\ntype GroupedStringifiedTypes = Record<string, Array<string | { union: string[] }>>;\n\nconst operationTypes: string[] = ['Query', 'Mutation', 'Subscription'];\n\nfunction isMetadataFieldName(name: string) {\n  return ['__schema', '__type'].includes(name);\n}\n\nconst metadataFieldMap: Record<string, GraphQLField<any, any>> = {\n  __schema: SchemaMetaFieldDef,\n  __type: TypeMetaFieldDef,\n};\n\nexport class SelectionSetToObject<Config extends ParsedDocumentsConfig = ParsedDocumentsConfig> {\n  protected _primitiveFields: PrimitiveField[] = [];\n  protected _primitiveAliasedFields: PrimitiveAliasedFields[] = [];\n  protected _linksFields: LinkField[] = [];\n  protected _queriedForTypename = false;\n\n  constructor(\n    protected _processor: BaseSelectionSetProcessor<any>,\n    protected _scalars: NormalizedScalarsMap,\n    protected _schema: GraphQLSchema,\n    protected _convertName: ConvertNameFn<BaseVisitorConvertOptions>,\n    protected _getFragmentSuffix: GetFragmentSuffixFn,\n    protected _loadedFragments: LoadedFragment[],\n    protected _config: Config,\n    protected _parentSchemaType?: GraphQLNamedType,\n    protected _selectionSet?: SelectionSetNode\n  ) {\n    autoBind(this);\n  }\n\n  public createNext(parentSchemaType: GraphQLNamedType, selectionSet: SelectionSetNode): SelectionSetToObject {\n    return new SelectionSetToObject(\n      this._processor,\n      this._scalars,\n      this._schema,\n      this._convertName.bind(this),\n      this._getFragmentSuffix.bind(this),\n      this._loadedFragments,\n      this._config,\n      parentSchemaType,\n      selectionSet\n    );\n  }\n\n  /**\n   * traverse the inline fragment nodes recursively for collecting the selectionSets on each type\n   */\n  _collectInlineFragments(\n    parentType: GraphQLNamedType,\n    nodes: Array<InlineFragmentNode & FragmentDirectives>,\n    types: Map<string, Array<CollectedFragmentNode>>\n  ) {\n    if (isListType(parentType) || isNonNullType(parentType)) {\n      return this._collectInlineFragments(parentType.ofType as GraphQLNamedType, nodes, types);\n    }\n    if (isObjectType(parentType)) {\n      for (const node of nodes) {\n        const typeOnSchema = node.typeCondition ? this._schema.getType(node.typeCondition.name.value) : parentType;\n        const { fields, inlines, spreads } = separateSelectionSet(node.selectionSet.selections);\n        const spreadsUsage = this.buildFragmentSpreadsUsage(spreads);\n        const directives = (node.directives as DirectiveNode[]) || undefined;\n\n        // When we collect the selection sets of inline fragments we need to\n        // make sure directives on the inline fragments are stored in a way\n        // that can be associated back to the fields in the fragment, to\n        // support things like making those fields optional when deferring a\n        // fragment (using @defer).\n        const fieldsWithFragmentDirectives: CollectedFragmentNode[] = fields.map(field => ({\n          ...field,\n          fragmentDirectives: field.fragmentDirectives || directives,\n        }));\n\n        if (isObjectType(typeOnSchema)) {\n          this._appendToTypeMap(types, typeOnSchema.name, fieldsWithFragmentDirectives);\n          this._appendToTypeMap(types, typeOnSchema.name, spreadsUsage[typeOnSchema.name]);\n          this._appendToTypeMap(types, typeOnSchema.name, directives);\n          this._collectInlineFragments(typeOnSchema, inlines, types);\n        } else if (isInterfaceType(typeOnSchema) && parentType.getInterfaces().includes(typeOnSchema)) {\n          this._appendToTypeMap(types, parentType.name, fields);\n          this._appendToTypeMap(types, parentType.name, spreadsUsage[parentType.name]);\n          this._collectInlineFragments(typeOnSchema, inlines, types);\n        }\n      }\n    } else if (isInterfaceType(parentType)) {\n      const possibleTypes = getPossibleTypes(this._schema, parentType);\n\n      for (const node of nodes) {\n        const schemaType = node.typeCondition ? this._schema.getType(node.typeCondition.name.value) : parentType;\n        const { fields, inlines, spreads } = separateSelectionSet(node.selectionSet.selections);\n        const spreadsUsage = this.buildFragmentSpreadsUsage(spreads);\n\n        if (isObjectType(schemaType) && possibleTypes.find(possibleType => possibleType.name === schemaType.name)) {\n          this._appendToTypeMap(types, schemaType.name, fields);\n          this._appendToTypeMap(types, schemaType.name, spreadsUsage[schemaType.name]);\n          this._collectInlineFragments(schemaType, inlines, types);\n        } else if (isInterfaceType(schemaType) && schemaType.name === parentType.name) {\n          for (const possibleType of possibleTypes) {\n            this._appendToTypeMap(types, possibleType.name, fields);\n            this._appendToTypeMap(types, possibleType.name, spreadsUsage[possibleType.name]);\n            this._collectInlineFragments(schemaType, inlines, types);\n          }\n        } else {\n          // it must be an interface type that is spread on an interface field\n          for (const possibleType of possibleTypes) {\n            if (!node.typeCondition) {\n              throw new Error('Invalid state. Expected type condition for interface spread on a interface field.');\n            }\n            const fragmentSpreadType = this._schema.getType(node.typeCondition.name.value);\n            // the field should only be added to the valid selections\n            // in case the possible type actually implements the given interface\n            if (isTypeSubTypeOf(this._schema, possibleType, fragmentSpreadType)) {\n              this._appendToTypeMap(types, possibleType.name, fields);\n              this._appendToTypeMap(types, possibleType.name, spreadsUsage[possibleType.name]);\n            }\n          }\n        }\n      }\n    } else if (isUnionType(parentType)) {\n      const possibleTypes = parentType.getTypes();\n\n      for (const node of nodes) {\n        const schemaType = node.typeCondition ? this._schema.getType(node.typeCondition.name.value) : parentType;\n        const { fields, inlines, spreads } = separateSelectionSet(node.selectionSet.selections);\n        const spreadsUsage = this.buildFragmentSpreadsUsage(spreads);\n\n        if (isObjectType(schemaType) && possibleTypes.find(possibleType => possibleType.name === schemaType.name)) {\n          this._appendToTypeMap(types, schemaType.name, fields);\n          this._appendToTypeMap(types, schemaType.name, spreadsUsage[schemaType.name]);\n          this._collectInlineFragments(schemaType, inlines, types);\n        } else if (isInterfaceType(schemaType)) {\n          const possibleInterfaceTypes = getPossibleTypes(this._schema, schemaType);\n\n          for (const possibleType of possibleTypes) {\n            if (\n              possibleInterfaceTypes.find(possibleInterfaceType => possibleInterfaceType.name === possibleType.name)\n            ) {\n              this._appendToTypeMap(types, possibleType.name, fields);\n              this._appendToTypeMap(types, possibleType.name, spreadsUsage[possibleType.name]);\n              this._collectInlineFragments(schemaType, inlines, types);\n            }\n          }\n        } else {\n          for (const possibleType of possibleTypes) {\n            this._appendToTypeMap(types, possibleType.name, fields);\n            this._appendToTypeMap(types, possibleType.name, spreadsUsage[possibleType.name]);\n          }\n        }\n      }\n    }\n  }\n\n  protected _createInlineFragmentForFieldNodes(\n    parentType: GraphQLNamedType,\n    fieldNodes: FieldNode[]\n  ): InlineFragmentNode {\n    return {\n      kind: Kind.INLINE_FRAGMENT,\n      typeCondition: {\n        kind: Kind.NAMED_TYPE,\n        name: {\n          kind: Kind.NAME,\n          value: parentType.name,\n        },\n      },\n      directives: [],\n      selectionSet: {\n        kind: Kind.SELECTION_SET,\n        selections: fieldNodes,\n      },\n    };\n  }\n\n  /**\n   * The `buildFragmentSpreadsUsage` method is used to collect fields from fragment spreads in the selection set.\n   * It creates a record of fragment spread usages, which includes the fragment name, type name, and the selection nodes\n   * inside the fragment.\n   */\n  protected buildFragmentSpreadsUsage(spreads: FragmentSpreadNode[]): Record<string, FragmentSpreadUsage[]> {\n    const selectionNodesByTypeName: Record<string, FragmentSpreadUsage[]> = {};\n\n    for (const spread of spreads) {\n      const fragmentSpreadObject = this._loadedFragments.find(lf => lf.name === spread.name.value);\n\n      if (fragmentSpreadObject) {\n        const schemaType = this._schema.getType(fragmentSpreadObject.onType);\n        const possibleTypesForFragment = getPossibleTypes(this._schema, schemaType);\n\n        for (const possibleType of possibleTypesForFragment) {\n          const fragmentSuffix = this._getFragmentSuffix(spread.name.value);\n          const usage = this.buildFragmentTypeName(\n            spread.name.value,\n            fragmentSuffix,\n            possibleTypesForFragment.length === 1 ? null : possibleType.name\n          );\n\n          selectionNodesByTypeName[possibleType.name] ||= [];\n\n          selectionNodesByTypeName[possibleType.name].push({\n            fragmentName: spread.name.value,\n            typeName: usage,\n            onType: fragmentSpreadObject.onType,\n            selectionNodes: [...fragmentSpreadObject.node.selectionSet.selections],\n            fragmentDirectives: [...spread.directives],\n          });\n        }\n      }\n    }\n\n    return selectionNodesByTypeName;\n  }\n\n  protected flattenSelectionSet(\n    selections: ReadonlyArray<SelectionNode>,\n    parentSchemaType?: GraphQLObjectType<any, any>\n  ): Map<string, Array<SelectionNode | FragmentSpreadUsage>> {\n    const selectionNodesByTypeName = new Map<string, Array<SelectionNode | FragmentSpreadUsage>>();\n    const inlineFragmentSelections: InlineFragmentNode[] = [];\n    const fieldNodes: FieldNode[] = [];\n    const fragmentSpreads: FragmentSpreadNode[] = [];\n    for (const selection of selections) {\n      switch (selection.kind) {\n        case Kind.FIELD:\n          fieldNodes.push(selection);\n          break;\n        case Kind.INLINE_FRAGMENT:\n          inlineFragmentSelections.push(selection);\n          break;\n        case Kind.FRAGMENT_SPREAD:\n          fragmentSpreads.push(selection);\n          break;\n      }\n    }\n\n    if (fieldNodes.length) {\n      inlineFragmentSelections.push(\n        this._createInlineFragmentForFieldNodes(parentSchemaType ?? this._parentSchemaType, fieldNodes)\n      );\n    }\n\n    this._collectInlineFragments(\n      parentSchemaType ?? this._parentSchemaType,\n      inlineFragmentSelections,\n      selectionNodesByTypeName\n    );\n    const fragmentsUsage = this.buildFragmentSpreadsUsage(fragmentSpreads);\n\n    for (const [typeName, records] of Object.entries(fragmentsUsage)) {\n      this._appendToTypeMap(selectionNodesByTypeName, typeName, records);\n    }\n\n    return selectionNodesByTypeName;\n  }\n\n  private _appendToTypeMap<T = CollectedFragmentNode>(\n    types: Map<string, Array<T>>,\n    typeName: string,\n    nodes: Array<T>\n  ): void {\n    if (!types.has(typeName)) {\n      types.set(typeName, []);\n    }\n\n    if (nodes && nodes.length > 0) {\n      types.get(typeName).push(...nodes);\n    }\n  }\n\n  protected _buildGroupedSelections(parentName: string): {\n    grouped: GroupedStringifiedTypes;\n    dependentTypes: DependentType[];\n    mustAddEmptyObject: boolean;\n  } {\n    if (!this._selectionSet?.selections || this._selectionSet.selections.length === 0) {\n      return { grouped: {}, mustAddEmptyObject: true, dependentTypes: [] };\n    }\n\n    const selectionNodesByTypeName = this.flattenSelectionSet(this._selectionSet.selections);\n\n    // in case there is not a selection for each type, we need to add a empty type.\n    let mustAddEmptyObject = false;\n\n    const possibleTypes = getPossibleTypes(this._schema, this._parentSchemaType);\n\n    const dependentTypes: DependentType[] = [];\n    if (!this._config.mergeFragmentTypes || this._config.inlineFragmentTypes === 'mask') {\n      const grouped = possibleTypes.reduce<GroupedStringifiedTypes>((prev, type) => {\n        const typeName = type.name;\n        const schemaType = this._schema.getType(typeName);\n\n        if (!isObjectType(schemaType)) {\n          throw new TypeError(`Invalid state! Schema type ${typeName} is not a valid GraphQL object!`);\n        }\n\n        const allNodes = selectionNodesByTypeName.get(typeName) || [];\n\n        prev[typeName] ||= [];\n\n        // incrementalNodes are the ones flagged with @defer, meaning they become nullable\n        const { incrementalNodes, selectionNodes, fragmentSpreads } = allNodes.reduce<{\n          selectionNodes: (SelectionNode | FragmentSpreadUsage)[];\n          incrementalNodes: FragmentSpreadUsage[];\n          fragmentSpreads: string[];\n        }>(\n          (acc, node) => {\n            if ('fragmentDirectives' in node && hasIncrementalDeliveryDirectives(node.fragmentDirectives)) {\n              acc.incrementalNodes.push(node);\n            } else {\n              acc.selectionNodes.push(node);\n            }\n            return acc;\n          },\n          { selectionNodes: [], incrementalNodes: [], fragmentSpreads: [] }\n        );\n\n        const { fields, dependentTypes: subDependentTypes } = this.buildSelectionSet(schemaType, selectionNodes, {\n          parentFieldName: this.buildParentFieldName(typeName, parentName),\n        });\n        const transformedSet = this.selectionSetStringFromFields(fields);\n\n        if (transformedSet) {\n          prev[typeName].push(transformedSet);\n        }\n        dependentTypes.push(...subDependentTypes);\n        if (!transformedSet && !fragmentSpreads.length) {\n          mustAddEmptyObject = true;\n        }\n\n        for (const incrementalNode of incrementalNodes) {\n          if (this._config.inlineFragmentTypes === 'mask' && 'fragmentName' in incrementalNode) {\n            const { fields: incrementalFields, dependentTypes: incrementalDependentTypes } = this.buildSelectionSet(\n              schemaType,\n              [incrementalNode],\n              { unsetTypes: true, parentFieldName: parentName }\n            );\n            const incrementalSet = this.selectionSetStringFromFields(incrementalFields);\n            prev[typeName].push(incrementalSet);\n            dependentTypes.push(...incrementalDependentTypes);\n\n            continue;\n          }\n          const { fields: initialFields, dependentTypes: initialDependentTypes } = this.buildSelectionSet(\n            schemaType,\n            [incrementalNode],\n            { parentFieldName: parentName }\n          );\n\n          const { fields: subsequentFields, dependentTypes: subsequentDependentTypes } = this.buildSelectionSet(\n            schemaType,\n            [incrementalNode],\n            { unsetTypes: true, parentFieldName: parentName }\n          );\n\n          const initialSet = this.selectionSetStringFromFields(initialFields);\n          const subsequentSet = this.selectionSetStringFromFields(subsequentFields);\n          dependentTypes.push(...initialDependentTypes, ...subsequentDependentTypes);\n          prev[typeName].push({ union: [initialSet, subsequentSet] });\n        }\n\n        return prev;\n      }, {});\n\n      return { grouped, mustAddEmptyObject, dependentTypes };\n    }\n    // Accumulate a map of selected fields to the typenames that\n    // share the exact same selected fields. When we find multiple\n    // typenames with the same set of fields, we can collapse the\n    // generated type to the selected fields and a string literal\n    // union of the typenames.\n    //\n    // E.g. {\n    //        __typename: \"foo\" | \"bar\";\n    //        shared: string;\n    //      }\n    const grouped = possibleTypes.reduce<\n      Record<string, { fields: (string | NameAndType)[]; types: { name: string; type: string }[] }>\n    >((prev, type) => {\n      const typeName = type.name;\n      const schemaType = this._schema.getType(typeName);\n\n      if (!isObjectType(schemaType)) {\n        throw new TypeError(`Invalid state! Schema type ${typeName} is not a valid GraphQL object!`);\n      }\n\n      const selectionNodes = selectionNodesByTypeName.get(typeName) || [];\n\n      const {\n        typeInfo,\n        fields,\n        dependentTypes: subDependentTypes,\n      } = this.buildSelectionSet(schemaType, selectionNodes, {\n        parentFieldName: this.buildParentFieldName(typeName, parentName),\n      });\n      dependentTypes.push(...subDependentTypes);\n\n      const key = this.selectionSetStringFromFields(fields);\n      prev[key] = {\n        fields,\n        types: [...(prev[key]?.types ?? []), typeInfo || { name: '', type: type.name }].filter(Boolean),\n      };\n\n      return prev;\n    }, {});\n\n    // For every distinct set of fields, create the corresponding\n    // string literal union of typenames.\n    const compacted = Object.keys(grouped).reduce<Record<string, string[]>>((acc, key) => {\n      const typeNames = grouped[key].types.map(t => t.type);\n      // Don't create very large string literal unions. TypeScript\n      // will stop comparing some nested union types types when\n      // they contain props with more than some number of string\n      // literal union members (testing with TS 4.5 stops working\n      // at 25 for a naive test case:\n      // https://www.typescriptlang.org/play?ts=4.5.4&ssl=29&ssc=10&pln=29&pc=1#code/C4TwDgpgBAKg9nAMgQwE4HNoF4BQV9QA+UA3ngRQJYB21EqAXDsQEQCMLzULATJ6wGZ+3ACzCWAVnEA2cQHZxADnEBOcWwAM6jl3Z9dbIQbEGpB2QYUHlBtbp5b7O1j30ujLky7Os4wABb0nAC+ODigkFAAQlBYUOT4xGQUVLT0TKzO3G7cHqLiPtwWrFasNqx2mY6ZWXrqeexe3GyF7MXNpc3lzZXZ1dm1ruI8DTxNvGahFEkJKTR0jLMpRNx+gaicy6E4APQ7AALAAM4AtJTo1HCoEDgANhDAUMgMsAgoGNikwQDcdw9QACMXjE4shfmEItAAGI0bCzGbLfDzdIGYbiBrjVrtFidFjdFi9dj9di1Ng5dgNNjjFrqbFsXFsfFsQkOYaDckjYbjNZBHDbPaHU7nS7XP6PZBsF4wuixL6-e6PAGS6KyiXfIA\n      const max_types = 20;\n      for (let i = 0; i < typeNames.length; i += max_types) {\n        const selectedTypes = typeNames.slice(i, i + max_types);\n        const typenameUnion = grouped[key].types[0].name\n          ? this._processor.transformTypenameField(selectedTypes.join(' | '), grouped[key].types[0].name)\n          : [];\n        const transformedSet = this.selectionSetStringFromFields([...typenameUnion, ...grouped[key].fields]);\n\n        // The keys here will be used to generate intermediary\n        // fragment names. To avoid blowing up the type name on large\n        // unions, calculate a stable hash here instead.\n        //\n        // Also use fragment hashing if skipTypename is true, since we\n        // then don't have a typename for naming the fragment.\n        acc[\n          selectedTypes.length <= 3\n            ? // Remove quote marks to produce a valid type name\n              selectedTypes.map(t => t.replace(/'/g, '')).join('_')\n            : createHash('sha256')\n                .update(selectedTypes.join() || transformedSet || '')\n                // Remove invalid characters to produce a valid type name\n                .digest('base64')\n                .replace(/[=+/]/g, '')\n        ] = [transformedSet];\n      }\n      return acc;\n    }, {});\n\n    return { grouped: compacted, mustAddEmptyObject, dependentTypes };\n  }\n\n  protected selectionSetStringFromFields(fields: (string | NameAndType)[]): string | null {\n    const allStrings = fields.filter((f: string | NameAndType): f is string => typeof f === 'string');\n    const allObjects = fields\n      .filter((f: string | NameAndType): f is NameAndType => typeof f !== 'string')\n      .map(t => `${t.name}: ${t.type}`);\n    const mergedObjects = allObjects.length ? this._processor.buildFieldsIntoObject(allObjects) : null;\n    const transformedSet = this._processor.buildSelectionSetFromStrings([...allStrings, mergedObjects].filter(Boolean));\n    return transformedSet;\n  }\n\n  protected buildSelectionSet(\n    parentSchemaType: GraphQLObjectType,\n    selectionNodes: Array<SelectionNode | FragmentSpreadUsage | DirectiveNode>,\n    options: { unsetTypes?: boolean; parentFieldName?: string }\n  ) {\n    const primitiveFields = new Map<string, FieldNode>();\n    const primitiveAliasFields = new Map<string, FieldNode>();\n    const linkFieldSelectionSets = new Map<\n      string,\n      {\n        selectedFieldType: GraphQLOutputType;\n        field: FieldNode;\n      }\n    >();\n    let requireTypename = false;\n\n    // usages via fragment typescript type\n    const fragmentsSpreadUsages: string[] = [];\n\n    // ensure we mutate no function params\n    selectionNodes = [...selectionNodes];\n    let inlineFragmentConditional = false;\n    for (const selectionNode of selectionNodes) {\n      // 1. Handle Field or Directtives selection nodes\n      if ('kind' in selectionNode) {\n        if (selectionNode.kind === 'Field') {\n          if (selectionNode.selectionSet) {\n            let selectedField: GraphQLField<any, any, any> = null;\n\n            const fields = parentSchemaType.getFields();\n            selectedField = fields[selectionNode.name.value];\n\n            if (isMetadataFieldName(selectionNode.name.value)) {\n              selectedField = metadataFieldMap[selectionNode.name.value];\n            }\n\n            if (!selectedField) {\n              continue;\n            }\n\n            const fieldName = getFieldNodeNameValue(selectionNode);\n            let linkFieldNode = linkFieldSelectionSets.get(fieldName);\n            if (linkFieldNode) {\n              linkFieldNode = {\n                ...linkFieldNode,\n                field: {\n                  ...linkFieldNode.field,\n                  selectionSet: mergeSelectionSets(linkFieldNode.field.selectionSet, selectionNode.selectionSet),\n                },\n              };\n            } else {\n              linkFieldNode = {\n                selectedFieldType: selectedField.type,\n                field: selectionNode,\n              };\n            }\n            linkFieldSelectionSets.set(fieldName, linkFieldNode);\n          } else if (selectionNode.alias) {\n            primitiveAliasFields.set(selectionNode.alias.value, selectionNode);\n          } else if (selectionNode.name.value === '__typename') {\n            requireTypename = true;\n          } else {\n            primitiveFields.set(selectionNode.name.value, selectionNode);\n          }\n        } else if (selectionNode.kind === 'Directive') {\n          if (['skip', 'include'].includes(selectionNode?.name?.value)) {\n            inlineFragmentConditional = true;\n          }\n        } else {\n          throw new TypeError('Unexpected type.');\n        }\n        continue;\n      }\n\n      // 2. Handle Fragment Spread nodes\n      // A Fragment Spread can be:\n      // - masked: the fields declared in the Fragment do not appear in the operation types\n      // - inline: the fields declared in the Fragment appear in the operation types\n\n      // 2a. If `inlineFragmentTypes` is 'combine' or 'mask', the Fragment Spread is masked by default\n      // In some cases, a masked node could be unmasked (i.e. treated as inline):\n      // - Fragment spread node is marked with Apollo `@unmask`, e.g. `...User @unmask`\n      if (this._config.inlineFragmentTypes === 'combine' || this._config.inlineFragmentTypes === 'mask') {\n        let isMasked = true;\n\n        if (\n          this._config.customDirectives.apolloUnmask &&\n          selectionNode.fragmentDirectives.some(d => d.name.value === 'unmask')\n        ) {\n          isMasked = false;\n        }\n\n        if (isMasked) {\n          fragmentsSpreadUsages.push(selectionNode.typeName);\n          continue;\n        }\n      }\n\n      // 2b. If the Fragment Spread is not masked, generate inline types.\n      const fragmentType = this._schema.getType(selectionNode.onType);\n\n      if (fragmentType == null) {\n        throw new TypeError(`Unexpected error: Type ${selectionNode.onType} does not exist within schema.`);\n      }\n\n      if (\n        parentSchemaType.name === selectionNode.onType ||\n        parentSchemaType.getInterfaces().find(iinterface => iinterface.name === selectionNode.onType) != null ||\n        (isUnionType(fragmentType) &&\n          fragmentType.getTypes().find(objectType => objectType.name === parentSchemaType.name))\n      ) {\n        // also process fields from fragment that apply for this parentType\n        const flatten = this.flattenSelectionSet(selectionNode.selectionNodes, parentSchemaType);\n        const typeNodes = flatten.get(parentSchemaType.name) ?? [];\n        selectionNodes.push(...typeNodes);\n        for (const iinterface of parentSchemaType.getInterfaces()) {\n          const typeNodes = flatten.get(iinterface.name) ?? [];\n          selectionNodes.push(...typeNodes);\n        }\n      }\n    }\n\n    const linkFields: LinkField[] = [];\n    const linkFieldsInterfaces: DependentType[] = [];\n    for (const { field, selectedFieldType } of linkFieldSelectionSets.values()) {\n      const realSelectedFieldType = getBaseType(selectedFieldType as any);\n      const selectionSet = this.createNext(realSelectedFieldType, field.selectionSet);\n      const fieldName = field.alias?.value ?? field.name.value;\n      const selectionSetObjects = selectionSet.transformSelectionSet(\n        options.parentFieldName ? `${options.parentFieldName}_${fieldName}` : fieldName\n      );\n\n      linkFieldsInterfaces.push(...selectionSetObjects.dependentTypes);\n      const isConditional = hasConditionalDirectives(field) || inlineFragmentConditional;\n      const isOptional = options.unsetTypes;\n      linkFields.push({\n        alias: field.alias\n          ? this._processor.config.formatNamedField(field.alias.value, selectedFieldType, isConditional, isOptional)\n          : undefined,\n        name: this._processor.config.formatNamedField(field.name.value, selectedFieldType, isConditional, isOptional),\n        type: realSelectedFieldType.name,\n        selectionSet: this._processor.config.wrapTypeWithModifiers(\n          selectionSetObjects.mergedTypeString.split(`\\n`).join(`\\n  `),\n          selectedFieldType\n        ),\n      });\n    }\n\n    const typeInfoField = this.buildTypeNameField(\n      parentSchemaType,\n      this._config.nonOptionalTypename,\n      this._config.addTypename,\n      requireTypename,\n      this._config.skipTypeNameForRoot\n    );\n    const transformed: ProcessResult = [\n      // Only add the typename field if we're not merging fragment\n      // types. If we are merging, we need to wait until we know all\n      // the involved typenames.\n      ...(typeInfoField && (!this._config.mergeFragmentTypes || this._config.inlineFragmentTypes === 'mask')\n        ? this._processor.transformTypenameField(typeInfoField.type, typeInfoField.name)\n        : []),\n      ...this._processor.transformPrimitiveFields(\n        parentSchemaType,\n        Array.from(primitiveFields.values()).map(field => ({\n          isConditional: hasConditionalDirectives(field),\n          fieldName: field.name.value,\n        })),\n        options.unsetTypes\n      ),\n      ...this._processor.transformAliasesPrimitiveFields(\n        parentSchemaType,\n        Array.from(primitiveAliasFields.values()).map(field => ({\n          alias: field.alias.value,\n          fieldName: field.name.value,\n          isConditional: hasConditionalDirectives(field),\n        })),\n        options.unsetTypes\n      ),\n      ...this._processor.transformLinkFields(linkFields, options.unsetTypes),\n    ].filter(Boolean);\n\n    const allStrings: string[] = transformed.filter(t => typeof t === 'string') as string[];\n\n    const allObjectsMerged: string[] = transformed\n      .filter(t => typeof t !== 'string')\n      .map((t: NameAndType) => `${t.name}: ${t.type}`);\n\n    let mergedObjectsAsString: string = null;\n\n    if (allObjectsMerged.length > 0) {\n      mergedObjectsAsString = this._processor.buildFieldsIntoObject(allObjectsMerged);\n    }\n\n    const fields = [...allStrings, mergedObjectsAsString].filter(Boolean);\n\n    if (fragmentsSpreadUsages.length) {\n      if (this._config.inlineFragmentTypes === 'combine') {\n        fields.push(...fragmentsSpreadUsages);\n      } else if (this._config.inlineFragmentTypes === 'mask') {\n        fields.push(\n          `{ ' $fragmentRefs'?: { ${fragmentsSpreadUsages\n            .map(name => `'${name}': ${options.unsetTypes ? `Incremental<${name}>` : name}`)\n            .join(`;`)} } }`\n        );\n      }\n    }\n\n    return { typeInfo: typeInfoField, fields, dependentTypes: linkFieldsInterfaces };\n  }\n\n  protected buildTypeNameField(\n    type: GraphQLObjectType,\n    nonOptionalTypename: boolean = this._config.nonOptionalTypename,\n    addTypename: boolean = this._config.addTypename,\n    queriedForTypename: boolean = this._queriedForTypename,\n    skipTypeNameForRoot: boolean = this._config.skipTypeNameForRoot\n  ): { name: string; type: string } {\n    const rootTypes = getRootTypes(this._schema);\n    if (rootTypes.has(type) && skipTypeNameForRoot && !queriedForTypename) {\n      return null;\n    }\n\n    if (nonOptionalTypename || addTypename || queriedForTypename) {\n      const optionalTypename = !queriedForTypename && !nonOptionalTypename;\n      return {\n        name: `${this._processor.config.formatNamedField('__typename')}${optionalTypename ? '?' : ''}`,\n        type: `'${type.name}'`,\n      };\n    }\n\n    return null;\n  }\n\n  protected getUnknownType(): string {\n    return 'never';\n  }\n\n  protected getEmptyObjectType(): string {\n    return 'Record<PropertyKey, never>';\n  }\n\n  private getEmptyObjectTypeString(mustAddEmptyObject: boolean): string {\n    return mustAddEmptyObject ? this.getEmptyObjectType() : ``;\n  }\n\n  public transformSelectionSet(fieldName: string) {\n    const possibleTypesList = getPossibleTypes(this._schema, this._parentSchemaType);\n    const possibleTypes = possibleTypesList.map(v => v.name).sort();\n    const fieldSelections = [\n      ...getFieldNames({ selections: this._selectionSet.selections, loadedFragments: this._loadedFragments }),\n    ].sort();\n\n    // Optimization: Do not create new dependentTypes if fragment typename exists in cache\n    // 2-layer cache: LOC => Field Selection Type Combination => cachedTypeString\n    const objMap = this._processor.typeCache.get(this._selectionSet.loc) ?? new Map<string, [string, string]>();\n    this._processor.typeCache.set(this._selectionSet.loc, objMap);\n\n    const cacheHashKey = `${fieldSelections.join(',')} @ ${possibleTypes.join('|')}`;\n    const [cachedTypeString] = objMap.get(cacheHashKey) ?? [];\n    if (cachedTypeString) {\n      // reuse previously generated type, as it is identical\n      return {\n        mergedTypeString: cachedTypeString,\n        // there are no new dependent types, as this is a nth use of the same type\n        dependentTypes: [],\n      };\n    }\n    const result = this.transformSelectionSetUncached(fieldName);\n    objMap.set(cacheHashKey, [result.mergedTypeString, fieldName]);\n    if (this._selectionSet.loc) {\n      this._processor.typeCache.set(this._selectionSet.loc, objMap);\n    }\n    return result;\n  }\n\n  private transformSelectionSetUncached(fieldName: string): {\n    mergedTypeString: string;\n    dependentTypes: DependentType[];\n    isUnionType?: boolean;\n  } {\n    const { grouped, mustAddEmptyObject, dependentTypes: subDependentTypes } = this._buildGroupedSelections(fieldName);\n\n    // This might happen in case we have an interface, that is being queries, without any GraphQL\n    // \"type\" that implements it. It will lead to a runtime error, but we aim to try to reflect that in\n    // build time as well.\n    if (Object.keys(grouped).length === 0) {\n      return {\n        mergedTypeString: this.getUnknownType(),\n        dependentTypes: subDependentTypes,\n      };\n    }\n\n    const dependentTypes = Object.keys(grouped)\n      .map(typeName => {\n        const relevant = grouped[typeName].filter(Boolean);\n        return relevant.map(objDefinition => {\n          const name = fieldName ? `${fieldName}_${typeName}` : typeName;\n          return {\n            name,\n            content: typeof objDefinition === 'string' ? objDefinition : objDefinition.union.join(' | '),\n            isUnionType: !!(typeof objDefinition !== 'string' && objDefinition.union.length > 1),\n          };\n        });\n      })\n      .filter(pairs => pairs.length > 0);\n\n    const typeParts = [\n      ...dependentTypes.map(pair =>\n        pair\n          .map(({ name, content, isUnionType }) =>\n            // unions need to be wrapped, as intersections have higher precedence\n            this._config.extractAllFieldsToTypes ? name : isUnionType ? `(${content})` : content\n          )\n          .join(' & ')\n      ),\n      this.getEmptyObjectTypeString(mustAddEmptyObject),\n    ].filter(Boolean);\n\n    const content = formatUnion(typeParts);\n\n    if (typeParts.length > 1 && this._config.extractAllFieldsToTypes) {\n      return {\n        mergedTypeString: fieldName,\n        dependentTypes: [\n          ...subDependentTypes,\n          ...dependentTypes.flat(1),\n          { name: fieldName, content, isUnionType: true },\n        ],\n      };\n    }\n\n    return {\n      mergedTypeString: content,\n      dependentTypes: [...subDependentTypes, ...dependentTypes.flat(1)],\n      isUnionType: typeParts.length > 1,\n    };\n  }\n\n  public transformFragmentSelectionSetToTypes(\n    fragmentName: string,\n    fragmentSuffix: string,\n    declarationBlockConfig: DeclarationBlockConfig\n  ): string {\n    const mergedTypeString = this.buildFragmentTypeName(fragmentName, fragmentSuffix);\n    const { grouped, dependentTypes } = this._buildGroupedSelections(mergedTypeString);\n\n    const subTypes: DependentType[] = Object.keys(grouped).flatMap(typeName => {\n      const possibleFields = grouped[typeName].filter(Boolean);\n      const declarationName = this.buildFragmentTypeName(fragmentName, fragmentSuffix, typeName);\n\n      if (possibleFields.length === 0) {\n        if (!this._config.addTypename) {\n          return [{ name: declarationName, content: this.getEmptyObjectType() }];\n        }\n\n        return [];\n      }\n\n      const flatFields = possibleFields.map(selectionObject => {\n        if (typeof selectionObject === 'string') return { value: selectionObject };\n        return { value: selectionObject.union.join(' | '), isUnionType: true };\n      });\n\n      const content =\n        flatFields.length > 1\n          ? flatFields.map(({ value, isUnionType }) => (isUnionType ? `(${value})` : value)).join(' & ')\n          : flatFields.map(({ value }) => value).join(' & ');\n      return {\n        name: declarationName,\n        content,\n        isUnionType: false,\n      };\n    });\n\n    const fragmentMaskPartial =\n      this._config.inlineFragmentTypes === 'mask' ? ` & { ' $fragmentName'?: '${mergedTypeString}' }` : '';\n\n    // TODO: unify with line 308 from base-documents-visitor\n    const dependentTypesContent = this._config.extractAllFieldsToTypes\n      ? dependentTypes.map(\n          i =>\n            new DeclarationBlock(declarationBlockConfig)\n              .export(true)\n              .asKind('type')\n              .withName(i.name)\n              .withContent(i.content).string\n        )\n      : [];\n\n    if (subTypes.length === 1) {\n      return [\n        ...dependentTypesContent,\n        new DeclarationBlock(declarationBlockConfig)\n          .export()\n          .asKind('type')\n          .withName(mergedTypeString)\n          .withContent(subTypes[0].content + fragmentMaskPartial).string,\n      ].join('\\n');\n    }\n\n    return [\n      ...dependentTypesContent,\n      ...subTypes.map(\n        t =>\n          new DeclarationBlock(declarationBlockConfig)\n            .export(this._config.exportFragmentSpreadSubTypes)\n            .asKind('type')\n            .withName(t.name)\n            .withContent(\n              `${t.content}${\n                this._config.inlineFragmentTypes === 'mask' ? ` & { ' $fragmentName'?: '${t.name}' }` : ''\n              }`\n            ).string\n      ),\n      new DeclarationBlock(declarationBlockConfig)\n        .export()\n        .asKind('type')\n        .withName(mergedTypeString)\n        .withContent(formatUnion(subTypes.map(t => t.name))).string,\n    ].join('\\n');\n  }\n\n  protected buildFragmentTypeName(name: string, suffix: string, typeName = ''): string {\n    return this._convertName(name, {\n      useTypesPrefix: true,\n      suffix: typeName && suffix ? `_${typeName}_${suffix}` : typeName ? `_${typeName}` : suffix,\n    });\n  }\n\n  protected buildParentFieldName(typeName: string, parentName: string): string {\n    // queries/mutations/fragments are guaranteed to be unique type names,\n    // so we can skip affixing the field names with typeName\n    if (operationTypes.includes(typeName)) {\n      return parentName;\n    }\n\n    const schemaType = this._schema.getType(typeName);\n\n    // Check if current selection set has type-narrowing fragments.\n    // - Inline fragments are always type-narrowing\n    // - Fragment spreads are only type-narrowing if they are on a different type than the current parent schema type\n    //   (e.g. spreading `fragment Foo on Pet` while processing `Pet` is not type-narrowing).\n    const hasTypeNarrowingFragments =\n      this._selectionSet?.selections?.some(selection => {\n        if (selection.kind === Kind.INLINE_FRAGMENT) {\n          return true;\n        }\n\n        if (selection.kind === Kind.FRAGMENT_SPREAD) {\n          const spreadFragment = this._loadedFragments.find(lf => lf.name === selection.name.value);\n          // If we can't resolve fragment metadata (or the current parent type), treat it as type-narrowing.\n          // This avoids incorrectly using interface-rooted names in cases that are actually concrete-targeting.\n          return !spreadFragment || !this._parentSchemaType || spreadFragment.onType !== this._parentSchemaType.name;\n        }\n\n        return false;\n      }) ?? false;\n\n    // When the parent schema type is an interface:\n    // - If we're processing inline fragments, use the concrete type name\n    // - If we're processing the interface directly, use the interface name\n    // - If we're in a named fragment, always use the concrete type name\n    if (\n      isObjectType(schemaType) &&\n      this._parentSchemaType &&\n      isInterfaceType(this._parentSchemaType) &&\n      !hasTypeNarrowingFragments\n    ) {\n      return `${parentName}_${this._parentSchemaType.name}`;\n    }\n\n    return `${parentName}_${typeName}`;\n  }\n}\n\nfunction formatUnion(members: string[]): string {\n  if (members.length > 1) {\n    return `\\n  | ${members.map(m => m.replace(/\\n/g, '\\n  ')).join('\\n  | ')}\\n`;\n  }\n  return members.join(' | ');\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/types.ts",
    "content": "/* eslint-disable @typescript-eslint/no-empty-object-type */\nimport { ASTNode, FragmentDefinitionNode, DirectiveNode } from 'graphql';\nimport { ParsedMapper } from './mappers.js';\n\n/**\n * A map between the GraphQL directive name and the identifier that should be used\n */\nexport type DirectiveArgumentAndInputFieldMappings = { [name: string]: string };\n\n/**\n * Parsed directives map - a mapping between GraphQL directive name and the parsed mapper object,\n * including all required information for generating code for that mapping.\n */\nexport type ParsedDirectiveArgumentAndInputFieldMappings = { [name: string]: ParsedMapper };\n\n/**\n * Scalars map or a string, a map between the GraphQL scalar name and the identifier that should be used\n */\nexport type ScalarsMap = string | { [name: string]: string | { input: string; output: string } };\n/**\n * A normalized map between GraphQL scalar name and the identifier name\n */\nexport type NormalizedScalarsMap = {\n  [name: string]: {\n    input: string;\n    output: string;\n  };\n};\n/**\n * Parsed scalars map - a mapping between GraphQL scalar name and the parsed mapper object,\n * including all required information for generting code for that mapping.\n */\nexport type ParsedScalarsMap = {\n  [name: string]: {\n    input: ParsedMapper;\n    output: ParsedMapper;\n  };\n};\n/**\n * A raw configuration for enumValues map - can be represented with a single string value for a file path,\n * a map between enum name and a file path, or a map between enum name and an object with explicit enum values.\n */\nexport type EnumValuesMap<AdditionalProps = {}> =\n  | string\n  | { [enumName: string]: string | ({ [key: string]: string | number } & AdditionalProps) };\nexport type ParsedEnumValuesMap = {\n  [enumName: string]: {\n    // If values are explictly set, this will include the mapped values\n    mappedValues?: { [valueName: string]: string | number };\n    // The GraphQL enum name\n    typeIdentifier: string;\n    // The actual identifier that you should use in the code (original or aliased)\n    sourceIdentifier?: string;\n    // In case of external enum, this will contain the source file path\n    sourceFile?: string;\n    // If the identifier is external (imported) - this will contain the imported expression (including alias), otherwise null\n    importIdentifier?: string;\n    // Is defualt import is used to import the enum\n    isDefault?: boolean;\n  };\n};\nexport type ConvertNameFn<T = {}> = ConvertFn<T>;\nexport type GetFragmentSuffixFn = (node: FragmentDefinitionNode | string) => string;\n\nexport interface ConvertOptions {\n  prefix?: string;\n  suffix?: string;\n  transformUnderscore?: boolean;\n}\n\nexport type ConvertFn<T = {}> = (node: ASTNode | string, options?: ConvertOptions & T) => string;\nexport type NamingConventionFn = (str: string) => string;\nexport type NamingConventionResolvePath = string;\nexport type NamingConvention = string | NamingConventionFn | NamingConventionMap;\n\n/**\n * @additionalProperties false\n */\nexport interface NamingConventionMap {\n  enumValues?: 'keep' | NamingConventionResolvePath | NamingConventionFn;\n  typeNames?: 'keep' | NamingConventionResolvePath | NamingConventionFn;\n  transformUnderscore?: boolean;\n}\n\nexport type LoadedFragment<AdditionalFields = {}> = {\n  name: string;\n  onType: string;\n  node: FragmentDefinitionNode;\n  isExternal: boolean;\n  importFrom?: string | null;\n} & AdditionalFields;\n\nexport type DeclarationKind = 'type' | 'interface' | 'class' | 'abstract class';\n\nexport interface DeclarationKindConfig {\n  directive?: DeclarationKind;\n  scalar?: DeclarationKind;\n  input?: DeclarationKind;\n  type?: DeclarationKind;\n  interface?: DeclarationKind;\n  arguments?: DeclarationKind;\n}\n\nexport interface AvoidOptionalsConfig {\n  field?: boolean;\n  object?: boolean;\n  inputValue?: boolean;\n  defaultValue?: boolean;\n  resolvers?: boolean;\n  query?: boolean;\n  mutation?: boolean;\n  subscription?: boolean;\n}\n\nexport type NormalizedAvoidOptionalsConfig = Required<AvoidOptionalsConfig>;\n\nexport interface ParsedImport {\n  moduleName: string | null;\n  propName: string;\n}\n\nexport type FragmentDirectives = {\n  fragmentDirectives?: Array<DirectiveNode>;\n};\n\nexport interface ResolversNonOptionalTypenameConfig {\n  unionMember?: boolean;\n  interfaceImplementingType?: boolean;\n  excludeTypes?: string[];\n}\n\nexport interface CustomDirectivesConfig {\n  /**\n   * @description Adds integration with Apollo Client's `@unmask` directive\n   * when using Apollo Client's data masking feature. `@unmask` ensures fields\n   * marked by `@unmask` are available in the type definition.\n   * @default false\n   */\n  apolloUnmask?: boolean;\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/utils.ts",
    "content": "import {\n  FieldNode,\n  FragmentSpreadNode,\n  GraphQLInputObjectType,\n  GraphQLNamedType,\n  GraphQLObjectType,\n  GraphQLOutputType,\n  GraphQLScalarType,\n  GraphQLSchema,\n  InlineFragmentNode,\n  isAbstractType,\n  isInputObjectType,\n  isListType,\n  isNonNullType,\n  isObjectType,\n  isScalarType,\n  Kind,\n  NamedTypeNode,\n  NameNode,\n  SelectionNode,\n  SelectionSetNode,\n  StringValueNode,\n  TypeNode,\n  DirectiveNode,\n} from 'graphql';\nimport { RawConfig } from './base-visitor.js';\nimport { parseMapper } from './mappers.js';\nimport { DEFAULT_SCALARS } from './scalars.js';\nimport { NormalizedScalarsMap, ParsedScalarsMap, ScalarsMap, FragmentDirectives, LoadedFragment } from './types.js';\n\nexport const getConfigValue = <T = any>(value: T, defaultValue: T): T => {\n  if (value === null || value === undefined) {\n    return defaultValue;\n  }\n\n  return value;\n};\n\nexport function quoteIfNeeded(array: string[], joinWith = ' & '): string {\n  if (array.length === 0) {\n    return '';\n  }\n  if (array.length === 1) {\n    return array[0];\n  }\n  return `(${array.join(joinWith)})`;\n}\n\nexport function block(array) {\n  return array && array.length !== 0 ? '{\\n' + array.join('\\n') + '\\n}' : '';\n}\n\nexport function wrapWithSingleQuotes(value: string | number | NameNode, skipNumericCheck = false): string {\n  if (skipNumericCheck) {\n    if (typeof value === 'number') {\n      return String(value);\n    }\n    return `'${value}'`;\n  }\n\n  if (\n    typeof value === 'number' ||\n    (typeof value === 'string' && !Number.isNaN(parseInt(value)) && parseFloat(value).toString() === value)\n  ) {\n    return String(value);\n  }\n\n  return `'${value}'`;\n}\n\nexport function breakLine(str: string): string {\n  return str + '\\n';\n}\n\nexport function indent(str: string, count = 1): string {\n  return new Array(count).fill('  ').join('') + str;\n}\n\nexport function indentMultiline(str: string, count = 1): string {\n  const indentation = new Array(count).fill('  ').join('');\n  const replaceWith = '\\n' + indentation;\n\n  return indentation + str.replace(/\\n/g, replaceWith);\n}\n\nexport interface DeclarationBlockConfig {\n  blockWrapper?: string;\n  blockTransformer?: (block: string) => string;\n  enumNameValueSeparator?: string;\n  ignoreExport?: boolean;\n}\n\nexport function transformComment(comment: string | StringValueNode, indentLevel = 0, disabled = false): string {\n  if (!comment || comment === '' || disabled) {\n    return '';\n  }\n\n  if (isStringValueNode(comment)) {\n    comment = comment.value;\n  }\n\n  comment = comment.split('*/').join('*\\\\/');\n  let lines = comment.split('\\n');\n  if (lines.length === 1) {\n    return indent(`/** ${lines[0]} */\\n`, indentLevel);\n  }\n  lines = ['/**', ...lines.map(line => ` * ${line}`), ' */\\n'];\n  return stripTrailingSpaces(lines.map(line => indent(line, indentLevel)).join('\\n'));\n}\n\nexport class DeclarationBlock {\n  _decorator = null;\n  _export = false;\n  _name = null;\n  _kind = null;\n  _methodName = null;\n  _content = null;\n  _block = null;\n  _nameGenerics = null;\n  _comment = null;\n  _ignoreBlockWrapper = false;\n\n  constructor(private _config: DeclarationBlockConfig) {\n    this._config = {\n      blockWrapper: '',\n      blockTransformer: block => block,\n      enumNameValueSeparator: ':',\n      ...this._config,\n    };\n  }\n\n  withDecorator(decorator: string): DeclarationBlock {\n    this._decorator = decorator;\n\n    return this;\n  }\n\n  export(exp = true): DeclarationBlock {\n    if (!this._config.ignoreExport) {\n      this._export = exp;\n    }\n\n    return this;\n  }\n\n  asKind(kind: string): DeclarationBlock {\n    this._kind = kind;\n\n    return this;\n  }\n\n  withComment(comment: string | StringValueNode | null, disabled = false): DeclarationBlock {\n    const nonEmptyComment = !!(isStringValueNode(comment) ? comment.value : comment);\n\n    if (nonEmptyComment && !disabled) {\n      this._comment = transformComment(comment, 0);\n    }\n\n    return this;\n  }\n\n  withMethodCall(methodName: string, ignoreBlockWrapper = false): DeclarationBlock {\n    this._methodName = methodName;\n    this._ignoreBlockWrapper = ignoreBlockWrapper;\n\n    return this;\n  }\n\n  withBlock(block: string): DeclarationBlock {\n    this._block = block;\n\n    return this;\n  }\n\n  withContent(content: string): DeclarationBlock {\n    this._content = content;\n\n    return this;\n  }\n\n  withName(name: string | NameNode, generics: string | null = null): DeclarationBlock {\n    this._name = name;\n    this._nameGenerics = generics;\n\n    return this;\n  }\n\n  public get string(): string {\n    let result = '';\n\n    if (this._decorator) {\n      result += this._decorator + '\\n';\n    }\n\n    if (this._export) {\n      result += 'export ';\n    }\n\n    if (this._kind) {\n      let extra = '';\n      let name = '';\n\n      if (['type', 'const', 'var', 'let'].includes(this._kind)) {\n        extra = '= ';\n      }\n\n      if (this._name) {\n        name = this._name + (this._nameGenerics || '') + ' ';\n      }\n\n      result += this._kind + ' ' + name + extra;\n    }\n\n    if (this._block) {\n      if (this._content) {\n        result += this._content;\n      }\n\n      const blockWrapper = this._ignoreBlockWrapper ? '' : this._config.blockWrapper;\n      const before = '{' + blockWrapper;\n      const after = blockWrapper + '}';\n      const block = [before, this._block, after].filter(val => !!val).join('\\n');\n\n      if (this._methodName) {\n        result += `${this._methodName}(${this._config.blockTransformer(block)})`;\n      } else {\n        result += this._config.blockTransformer(block);\n      }\n    } else if (this._content) {\n      result += this._content;\n    } else if (this._kind) {\n      result += this._config.blockTransformer('{}');\n    }\n\n    return stripTrailingSpaces(\n      (this._comment || '') +\n        result +\n        (this._kind === 'interface' || this._kind === 'enum' || this._kind === 'namespace' || this._kind === 'function'\n          ? ''\n          : ';') +\n        '\\n'\n    );\n  }\n}\n\nexport function getBaseTypeNode(typeNode: TypeNode): NamedTypeNode {\n  if (typeNode.kind === Kind.LIST_TYPE || typeNode.kind === Kind.NON_NULL_TYPE) {\n    return getBaseTypeNode(typeNode.type);\n  }\n\n  return typeNode;\n}\n\nexport function convertNameParts(str: string, func: (str: string) => string, removeUnderscore = false): string {\n  if (removeUnderscore) {\n    return func(str);\n  }\n\n  return str\n    .split('_')\n    .map(s => func(s))\n    .join('_');\n}\n\nexport function buildScalarsFromConfig(\n  schema: GraphQLSchema | undefined,\n  config: RawConfig,\n  defaultScalarsMapping: NormalizedScalarsMap = DEFAULT_SCALARS,\n  defaultScalarType = 'any'\n): ParsedScalarsMap {\n  return buildScalars(\n    schema,\n    config.scalars,\n    defaultScalarsMapping,\n    config.strictScalars ? null : config.defaultScalarType || defaultScalarType\n  );\n}\n\nexport function buildScalars(\n  schema: GraphQLSchema | undefined,\n  scalarsMapping: ScalarsMap,\n  defaultScalarsMapping: NormalizedScalarsMap = DEFAULT_SCALARS,\n  defaultScalarType: string | null = 'any'\n): ParsedScalarsMap {\n  const result: ParsedScalarsMap = {};\n\n  function normalizeScalarType(type: string | { input: string; output: string }): { input: string; output: string } {\n    if (typeof type === 'string') {\n      return {\n        input: type,\n        output: type,\n      };\n    }\n\n    return {\n      input: type.input,\n      output: type.output,\n    };\n  }\n\n  for (const name of Object.keys(defaultScalarsMapping)) {\n    result[name] = {\n      input: parseMapper(defaultScalarsMapping[name].input),\n      output: parseMapper(defaultScalarsMapping[name].output),\n    };\n  }\n\n  if (schema) {\n    const typeMap = schema.getTypeMap();\n\n    Object.keys(typeMap)\n      .map(typeName => typeMap[typeName])\n      .filter(type => isScalarType(type))\n      .map((scalarType: GraphQLScalarType) => {\n        const { name } = scalarType;\n        if (typeof scalarsMapping === 'string') {\n          const inputMapper = parseMapper(scalarsMapping + '#' + name, name);\n\n          if (inputMapper.isExternal) {\n            inputMapper.type += \"['input']\";\n          }\n\n          const outputMapper = parseMapper(scalarsMapping + '#' + name, name);\n          if (outputMapper.isExternal) {\n            outputMapper.type += \"['output']\";\n          }\n\n          result[name] = {\n            input: inputMapper,\n            output: outputMapper,\n          };\n        } else if (scalarsMapping?.[name]) {\n          const mappedScalar = scalarsMapping[name];\n          if (typeof mappedScalar === 'string') {\n            const normalizedScalar = normalizeScalarType(scalarsMapping[name]);\n            result[name] = {\n              input: parseMapper(normalizedScalar.input, name),\n              output: parseMapper(normalizedScalar.output, name),\n            };\n          } else if (typeof mappedScalar === 'object' && mappedScalar.input && mappedScalar.output) {\n            result[name] = {\n              input: parseMapper(mappedScalar.input, name),\n              output: parseMapper(mappedScalar.output, name),\n            };\n          } else {\n            result[name] = {\n              input: {\n                isExternal: false,\n                type: JSON.stringify(mappedScalar),\n              },\n              output: {\n                isExternal: false,\n                type: JSON.stringify(mappedScalar),\n              },\n            };\n          }\n        } else if (scalarType.extensions?.codegenScalarType) {\n          result[name] = {\n            input: {\n              isExternal: false,\n              type: scalarType.extensions.codegenScalarType as string,\n            },\n            output: {\n              isExternal: false,\n              type: scalarType.extensions.codegenScalarType as string,\n            },\n          };\n        } else if (!defaultScalarsMapping[name]) {\n          if (defaultScalarType === null) {\n            throw new Error(`Unknown scalar type ${name}. Please override it using the \"scalars\" configuration field!`);\n          }\n          result[name] = {\n            input: {\n              isExternal: false,\n              type: defaultScalarType,\n            },\n            output: {\n              isExternal: false,\n              type: defaultScalarType,\n            },\n          };\n        }\n      });\n  } else if (scalarsMapping) {\n    if (typeof scalarsMapping === 'string') {\n      throw new Error('Cannot use string scalars mapping when building without a schema');\n    }\n    for (const name of Object.keys(scalarsMapping)) {\n      if (typeof scalarsMapping[name] === 'string') {\n        const normalizedScalar = normalizeScalarType(scalarsMapping[name]);\n        result[name] = {\n          input: parseMapper(normalizedScalar.input, name),\n          output: parseMapper(normalizedScalar.output, name),\n        };\n      } else {\n        const normalizedScalar = normalizeScalarType(scalarsMapping[name]);\n        result[name] = {\n          input: {\n            isExternal: false,\n            type: JSON.stringify(normalizedScalar.input),\n          },\n          output: {\n            isExternal: false,\n            type: JSON.stringify(normalizedScalar.output),\n          },\n        };\n      }\n    }\n  }\n\n  return result;\n}\n\nfunction isStringValueNode(node: any): node is StringValueNode {\n  return node && typeof node === 'object' && node.kind === Kind.STRING;\n}\n\n// will be removed on next release because tools already has it\nexport function getRootTypeNames(schema: GraphQLSchema): string[] {\n  return [schema.getQueryType(), schema.getMutationType(), schema.getSubscriptionType()]\n    .filter(t => t)\n    .map(t => t.name);\n}\n\nexport function stripMapperTypeInterpolation(identifier: string): string {\n  return identifier.trim().replace(/<{.*}>/, '');\n}\n\nexport const OMIT_TYPE = 'export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;';\nexport const REQUIRE_FIELDS_TYPE = `export type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };`;\n\n/**\n * merge selection sets into a new selection set without mutating the inputs.\n */\nexport function mergeSelectionSets(selectionSet1: SelectionSetNode, selectionSet2: SelectionSetNode): SelectionSetNode {\n  const newSelections = [...selectionSet1.selections];\n\n  for (let selection2 of selectionSet2.selections) {\n    if (selection2.kind === 'FragmentSpread' || selection2.kind === 'InlineFragment') {\n      newSelections.push(selection2);\n      continue;\n    }\n\n    if (selection2.kind !== 'Field') {\n      throw new TypeError('Invalid state.');\n    }\n\n    const match = newSelections.find(\n      selection1 =>\n        selection1.kind === 'Field' &&\n        getFieldNodeNameValue(selection1) === getFieldNodeNameValue(selection2 as FieldNode)\n    );\n\n    if (\n      match &&\n      // recursively merge all selection sets\n      match.kind === 'Field' &&\n      match.selectionSet &&\n      selection2.selectionSet\n    ) {\n      selection2 = {\n        ...selection2,\n        selectionSet: mergeSelectionSets(match.selectionSet, selection2.selectionSet),\n      };\n    }\n\n    newSelections.push(selection2);\n  }\n\n  return {\n    kind: Kind.SELECTION_SET,\n    selections: newSelections,\n  };\n}\n\nexport const getFieldNodeNameValue = (node: FieldNode): string => {\n  return (node.alias || node.name).value;\n};\n\nexport function separateSelectionSet(selections: ReadonlyArray<SelectionNode>): {\n  fields: (FieldNode & FragmentDirectives)[];\n  spreads: FragmentSpreadNode[];\n  inlines: InlineFragmentNode[];\n} {\n  return {\n    fields: selections.filter(s => s.kind === Kind.FIELD) as FieldNode[],\n    inlines: selections.filter(s => s.kind === Kind.INLINE_FRAGMENT) as InlineFragmentNode[],\n    spreads: selections.filter(s => s.kind === Kind.FRAGMENT_SPREAD) as FragmentSpreadNode[],\n  };\n}\n\nexport function getPossibleTypes(schema: GraphQLSchema, type: GraphQLNamedType): GraphQLObjectType[] {\n  if (isListType(type) || isNonNullType(type)) {\n    return getPossibleTypes(schema, type.ofType as GraphQLNamedType);\n  }\n  if (isObjectType(type)) {\n    return [type];\n  }\n  if (isAbstractType(type)) {\n    return schema.getPossibleTypes(type) as Array<GraphQLObjectType>;\n  }\n\n  return [];\n}\n\nexport function hasConditionalDirectives(field: FieldNode): boolean {\n  const CONDITIONAL_DIRECTIVES = ['skip', 'include'];\n  return field.directives?.some(directive => CONDITIONAL_DIRECTIVES.includes(directive.name.value));\n}\n\nexport function hasIncrementalDeliveryDirectives(directives: DirectiveNode[]): boolean {\n  const INCREMENTAL_DELIVERY_DIRECTIVES = ['defer'];\n  return directives?.some(directive => INCREMENTAL_DELIVERY_DIRECTIVES.includes(directive.name.value));\n}\n\ntype WrapModifiersOptions = {\n  wrapOptional(type: string): string;\n  wrapArray(type: string): string;\n};\n\nexport function wrapTypeWithModifiers(\n  baseType: string,\n  type: GraphQLOutputType | GraphQLNamedType,\n  options: WrapModifiersOptions\n): string {\n  let currentType = type;\n  const modifiers: Array<(type: string) => string> = [];\n  while (currentType) {\n    if (isNonNullType(currentType)) {\n      currentType = currentType.ofType;\n    } else {\n      modifiers.push(options.wrapOptional);\n    }\n\n    if (isListType(currentType)) {\n      modifiers.push(options.wrapArray);\n      currentType = currentType.ofType;\n    } else {\n      break;\n    }\n  }\n\n  return modifiers.reduceRight((result, modifier) => modifier(result), baseType);\n}\n\nexport function removeDescription<T extends { description?: StringValueNode }>(nodes: readonly T[]) {\n  return nodes.map(node => ({ ...node, description: undefined }));\n}\n\nexport function wrapTypeNodeWithModifiers(baseType: string, typeNode: TypeNode): string {\n  switch (typeNode.kind) {\n    case Kind.NAMED_TYPE: {\n      return `Maybe<${baseType}>`;\n    }\n    case Kind.NON_NULL_TYPE: {\n      const innerType = wrapTypeNodeWithModifiers(baseType, typeNode.type);\n      return clearOptional(innerType);\n    }\n    case Kind.LIST_TYPE: {\n      const innerType = wrapTypeNodeWithModifiers(baseType, typeNode.type);\n      return `Maybe<Array<${innerType}>>`;\n    }\n  }\n}\n\nfunction clearOptional(str: string): string {\n  const rgx = new RegExp(`^Maybe<(.*?)>$`, 'i');\n\n  if (str.startsWith(`Maybe`)) {\n    return str.replace(rgx, '$1');\n  }\n\n  return str;\n}\n\nfunction stripTrailingSpaces(str: string): string {\n  return str.replace(/ +\\n/g, '\\n');\n}\n\nconst isOneOfTypeCache = new WeakMap<GraphQLNamedType, boolean>();\nexport function isOneOfInputObjectType(\n  namedType: GraphQLNamedType | null | undefined\n): namedType is GraphQLInputObjectType {\n  if (!namedType) {\n    return false;\n  }\n  let isOneOfType = isOneOfTypeCache.get(namedType);\n\n  if (isOneOfType !== undefined) {\n    return isOneOfType;\n  }\n\n  isOneOfType =\n    isInputObjectType(namedType) &&\n    ((namedType as unknown as Record<'isOneOf', boolean | undefined>).isOneOf ||\n      namedType.astNode?.directives?.some(d => d.name.value === 'oneOf'));\n\n  isOneOfTypeCache.set(namedType, isOneOfType);\n\n  return isOneOfType;\n}\n\nexport function groupBy<T>(array: Array<T>, key: (item: T) => string | number): { [key: string]: Array<T> } {\n  return array.reduce<{ [key: string]: Array<T> }>((acc, item) => {\n    const group = (acc[key(item)] ??= []);\n    group.push(item);\n    return acc;\n  }, {});\n}\n\nexport function flatten<T>(array: Array<Array<T>>): Array<T> {\n  return ([] as Array<T>).concat(...array);\n}\n\nexport function unique<T>(array: Array<T>, key: (item: T) => string | number = item => item.toString()): Array<T> {\n  return Object.values(array.reduce((acc, item) => ({ [key(item)]: item, ...acc }), {}));\n}\n\nfunction getFullPathFieldName(selection: FieldNode, parentName: string) {\n  const fullName =\n    'alias' in selection && selection.alias ? `${selection.alias.value}@${selection.name.value}` : selection.name.value;\n  return parentName ? `${parentName}.${fullName}` : fullName;\n}\n\nexport const getFieldNames = ({\n  selections,\n  fieldNames = new Set(),\n  parentName = '',\n  loadedFragments,\n}: {\n  selections: readonly SelectionNode[];\n  fieldNames?: Set<string>;\n  parentName?: string;\n  loadedFragments: LoadedFragment[];\n}) => {\n  for (const selection of selections) {\n    switch (selection.kind) {\n      case Kind.FIELD: {\n        const fieldName = getFullPathFieldName(selection, parentName);\n        fieldNames.add(fieldName);\n        if (selection.selectionSet) {\n          getFieldNames({\n            selections: selection.selectionSet.selections,\n            fieldNames,\n            parentName: fieldName,\n            loadedFragments,\n          });\n        }\n        break;\n      }\n      case Kind.FRAGMENT_SPREAD: {\n        getFieldNames({\n          selections: loadedFragments\n            .filter(def => def.name === selection.name.value)\n            .flatMap(s => s.node.selectionSet.selections),\n          fieldNames,\n          parentName,\n          loadedFragments,\n        });\n        break;\n      }\n      case Kind.INLINE_FRAGMENT: {\n        getFieldNames({ selections: selection.selectionSet.selections, fieldNames, parentName, loadedFragments });\n        break;\n      }\n    }\n  }\n  return fieldNames;\n};\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/src/variables-to-object.ts",
    "content": "import autoBind from 'auto-bind';\nimport { DirectiveNode, Kind, NameNode, TypeNode, ValueNode, VariableNode } from 'graphql';\nimport { BaseVisitorConvertOptions } from './base-visitor.js';\nimport {\n  ConvertNameFn,\n  NormalizedScalarsMap,\n  ParsedDirectiveArgumentAndInputFieldMappings,\n  ParsedEnumValuesMap,\n} from './types.js';\nimport { getBaseTypeNode, indent } from './utils.js';\n\nexport interface InterfaceOrVariable {\n  name?: NameNode;\n  variable?: VariableNode;\n  type: TypeNode;\n  defaultValue?: ValueNode;\n  directives?: ReadonlyArray<DirectiveNode>;\n}\n\nexport class OperationVariablesToObject {\n  constructor(\n    protected _scalars: NormalizedScalarsMap,\n    protected _convertName: ConvertNameFn<BaseVisitorConvertOptions>,\n    protected _namespacedImportName: string | null = null,\n    protected _enumNames: string[] = [],\n    protected _enumPrefix = true,\n    protected _enumSuffix = true,\n    protected _enumValues: ParsedEnumValuesMap = {},\n    protected _applyCoercion: boolean = false,\n    protected _directiveArgumentAndInputFieldMappings: ParsedDirectiveArgumentAndInputFieldMappings = {}\n  ) {\n    autoBind(this);\n  }\n\n  getName<TDefinitionType extends InterfaceOrVariable>(node: TDefinitionType): string {\n    if (node.name) {\n      if (typeof node.name === 'string') {\n        return node.name;\n      }\n\n      return node.name.value;\n    }\n    if (node.variable) {\n      return node.variable.name.value;\n    }\n\n    return null;\n  }\n\n  transform<TDefinitionType extends InterfaceOrVariable>(variablesNode: ReadonlyArray<TDefinitionType>): string {\n    if (!variablesNode || variablesNode.length === 0) {\n      return null;\n    }\n\n    return (\n      variablesNode.map(variable => indent(this.transformVariable(variable))).join(`${this.getPunctuation()}\\n`) +\n      this.getPunctuation()\n    );\n  }\n\n  protected getScalar(name: string): string {\n    const prefix = this._namespacedImportName ? `${this._namespacedImportName}.` : '';\n\n    return `${prefix}Scalars['${name}']['input']`;\n  }\n\n  protected getDirectiveMapping(name: string): string {\n    return `DirectiveArgumentAndInputFieldMappings['${name}']`;\n  }\n\n  protected getDirectiveOverrideType(directives: ReadonlyArray<DirectiveNode>): string | null {\n    if (!this._directiveArgumentAndInputFieldMappings) return null;\n\n    const type = directives\n      .map(directive => {\n        const directiveName = directive.name.value;\n        if (this._directiveArgumentAndInputFieldMappings[directiveName]) {\n          return this.getDirectiveMapping(directiveName);\n        }\n        return null;\n      })\n      .reverse()\n      .find(a => !!a);\n\n    return type || null;\n  }\n\n  protected transformVariable<TDefinitionType extends InterfaceOrVariable>(variable: TDefinitionType): string {\n    let typeValue = null;\n    const prefix = this._namespacedImportName ? `${this._namespacedImportName}.` : '';\n\n    if (typeof variable.type === 'string') {\n      typeValue = variable.type;\n    } else {\n      const baseType = getBaseTypeNode(variable.type);\n      const overrideType = variable.directives ? this.getDirectiveOverrideType(variable.directives) : null;\n      const typeName = baseType.name.value;\n\n      if (overrideType) {\n        typeValue = overrideType;\n      } else if (this._scalars[typeName]) {\n        typeValue = this.getScalar(typeName);\n      } else if (this._enumValues[typeName]?.sourceFile) {\n        typeValue = this._enumValues[typeName].typeIdentifier || this._enumValues[typeName].sourceIdentifier;\n      } else {\n        typeValue = `${prefix}${this._convertName(baseType, {\n          useTypesPrefix: this._enumNames.includes(typeName) ? this._enumPrefix : true,\n          useTypesSuffix: this._enumNames.includes(typeName) ? this._enumSuffix : true,\n        })}`;\n      }\n    }\n\n    const fieldName = this.getName(variable);\n    const fieldType = this.wrapAstTypeWithModifiers(typeValue, variable.type, this._applyCoercion);\n\n    const hasDefaultValue = variable.defaultValue != null && typeof variable.defaultValue !== 'undefined';\n    const isNonNullType = variable.type.kind === Kind.NON_NULL_TYPE;\n\n    const formattedFieldString = this.formatFieldString(fieldName, isNonNullType, hasDefaultValue);\n    const formattedTypeString = this.formatTypeString(fieldType, isNonNullType, hasDefaultValue);\n\n    return `${formattedFieldString}: ${formattedTypeString}`;\n  }\n\n  public wrapAstTypeWithModifiers(_baseType: string, _typeNode: TypeNode, _applyCoercion?: boolean): string {\n    throw new Error(`You must override \"wrapAstTypeWithModifiers\" of OperationVariablesToObject!`);\n  }\n\n  protected formatFieldString(fieldName: string, _isNonNullType: boolean, _hasDefaultValue: boolean): string {\n    return fieldName;\n  }\n\n  protected formatTypeString(fieldType: string, isNonNullType: boolean, hasDefaultValue: boolean): string {\n    const prefix = this._namespacedImportName ? `${this._namespacedImportName}.` : '';\n\n    if (hasDefaultValue) {\n      return `${prefix}Maybe<${fieldType}>`;\n    }\n\n    return fieldType;\n  }\n\n  protected getPunctuation(): string {\n    return ',';\n  }\n}\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/tests/client-side-base-visitor.spec.ts",
    "content": "import { buildSchema, FragmentDefinitionNode, OperationDefinitionNode, parse, Kind } from 'graphql';\nimport { ClientSideBaseVisitor, DocumentMode } from '../src/client-side-base-visitor.js';\n\ndescribe('getImports', () => {\n  describe('when documentMode \"external\", importDocumentNodeExternallyFrom is \"near-operation-file\"', () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type Query {\n        a: A\n      }\n\n      type A {\n        foo: String\n        bar: String\n      }\n    `);\n\n    describe('when emitLegacyCommonJSImports is true', () => {\n      it('does not append `.js` to Operations import path', () => {\n        const fileName = 'fooBarQuery';\n        const importPath = `src/queries/${fileName}`;\n\n        const document = parse(\n          `query fooBarQuery {\n            a {\n              foo\n              bar\n            }\n          }\n        `\n        );\n\n        const visitor = new ClientSideBaseVisitor(\n          schema,\n          [],\n          {\n            emitLegacyCommonJSImports: true,\n            importDocumentNodeExternallyFrom: 'near-operation-file',\n            documentMode: DocumentMode.external,\n          },\n          {},\n          [{ document, location: importPath }]\n        );\n\n        visitor.OperationDefinition(document.definitions[0] as OperationDefinitionNode);\n\n        const imports = visitor.getImports();\n        expect(imports[0]).toBe(`import * as Operations from './${fileName}';`);\n      });\n    });\n\n    describe('when emitLegacyCommonJSImports is false', () => {\n      it('appends `.js` to Operations import path', () => {\n        const fileName = 'fooBarQuery';\n        const importPath = `src/queries/${fileName}`;\n\n        const document = parse(\n          `query fooBarQuery {\n            a {\n              foo\n              bar\n            }\n          }\n        `\n        );\n\n        const visitor = new ClientSideBaseVisitor(\n          schema,\n          [],\n          {\n            emitLegacyCommonJSImports: false,\n            importDocumentNodeExternallyFrom: 'near-operation-file',\n            documentMode: DocumentMode.external,\n          },\n          {},\n          [{ document, location: importPath }]\n        );\n\n        visitor.OperationDefinition(document.definitions[0] as OperationDefinitionNode);\n\n        const imports = visitor.getImports();\n        expect(imports[0]).toBe(`import * as Operations from './${fileName}.js';`);\n      });\n    });\n\n    describe('when importExtension is set to .mjs', () => {\n      it('appends `.mjs` to Operations import path', () => {\n        const fileName = 'fooBarQuery';\n        const importPath = `src/queries/${fileName}`;\n\n        const document = parse(\n          `query fooBarQuery {\n            a {\n              foo\n              bar\n            }\n          }\n        `\n        );\n\n        const visitor = new ClientSideBaseVisitor(\n          schema,\n          [],\n          {\n            importExtension: '.mjs',\n            importDocumentNodeExternallyFrom: 'near-operation-file',\n            documentMode: DocumentMode.external,\n          },\n          {},\n          [{ document, location: importPath }]\n        );\n\n        visitor.OperationDefinition(document.definitions[0] as OperationDefinitionNode);\n\n        const imports = visitor.getImports();\n        expect(imports[0]).toBe(`import * as Operations from './${fileName}.mjs';`);\n      });\n    });\n\n    describe('when importExtension is set to empty string', () => {\n      it('does not append extension to Operations import path', () => {\n        const fileName = 'fooBarQuery';\n        const importPath = `src/queries/${fileName}`;\n\n        const document = parse(\n          `query fooBarQuery {\n            a {\n              foo\n              bar\n            }\n          }\n        `\n        );\n\n        const visitor = new ClientSideBaseVisitor(\n          schema,\n          [],\n          {\n            importExtension: '',\n            importDocumentNodeExternallyFrom: 'near-operation-file',\n            documentMode: DocumentMode.external,\n          },\n          {},\n          [{ document, location: importPath }]\n        );\n\n        visitor.OperationDefinition(document.definitions[0] as OperationDefinitionNode);\n\n        const imports = visitor.getImports();\n        expect(imports[0]).toBe(`import * as Operations from './${fileName}';`);\n      });\n    });\n\n    describe('when both importExtension and emitLegacyCommonJSImports are set', () => {\n      it('uses importExtension over emitLegacyCommonJSImports', () => {\n        const fileName = 'fooBarQuery';\n        const importPath = `src/queries/${fileName}`;\n\n        const document = parse(\n          `query fooBarQuery {\n            a {\n              foo\n              bar\n            }\n          }\n        `\n        );\n\n        const visitor = new ClientSideBaseVisitor(\n          schema,\n          [],\n          {\n            importExtension: '.mjs',\n            emitLegacyCommonJSImports: false,\n            importDocumentNodeExternallyFrom: 'near-operation-file',\n            documentMode: DocumentMode.external,\n          },\n          {},\n          [{ document, location: importPath }]\n        );\n\n        visitor.OperationDefinition(document.definitions[0] as OperationDefinitionNode);\n\n        const imports = visitor.getImports();\n        expect(imports[0]).toBe(`import * as Operations from './${fileName}.mjs';`);\n      });\n\n      it('uses importExtension set to empty string even when emitLegacyCommonJSImports is false', () => {\n        const fileName = 'fooBarQuery';\n        const importPath = `src/queries/${fileName}`;\n\n        const document = parse(\n          `query fooBarQuery {\n            a {\n              foo\n              bar\n            }\n          }\n        `\n        );\n\n        const visitor = new ClientSideBaseVisitor(\n          schema,\n          [],\n          {\n            importExtension: '',\n            emitLegacyCommonJSImports: false,\n            importDocumentNodeExternallyFrom: 'near-operation-file',\n            documentMode: DocumentMode.external,\n          },\n          {},\n          [{ document, location: importPath }]\n        );\n\n        visitor.OperationDefinition(document.definitions[0] as OperationDefinitionNode);\n\n        const imports = visitor.getImports();\n        expect(imports[0]).toBe(`import * as Operations from './${fileName}';`);\n      });\n    });\n  });\n\n  describe('when documentMode \"external\", importDocumentNodeExternallyFrom is relative path', () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type Query {\n        a: A\n      }\n\n      type A {\n        foo: String\n        bar: String\n      }\n    `);\n\n    describe('when emitLegacyCommonJSImports is false', () => {\n      it('preserves `.js` on Operations import path', () => {\n        const fileName = 'fooBarQuery';\n        const importPath = `./src/queries/${fileName}.js`;\n\n        const document = parse(\n          `query fooBarQuery {\n            a {\n              foo\n              bar\n            }\n          }\n        `\n        );\n\n        const visitor = new ClientSideBaseVisitor(\n          schema,\n          [],\n          {\n            emitLegacyCommonJSImports: false,\n            importDocumentNodeExternallyFrom: importPath,\n            documentMode: DocumentMode.external,\n          },\n          {},\n          [{ document, location: importPath }]\n        );\n\n        visitor.OperationDefinition(document.definitions[0] as OperationDefinitionNode);\n\n        const imports = visitor.getImports();\n        expect(imports[0]).toBe(`import * as Operations from '${importPath}';`);\n      });\n    });\n  });\n\n  describe('when documentMode \"documentNodeImportFragments\"', () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type Query {\n        a: A\n      }\n\n      type A {\n        foo: String\n        bar: String\n      }\n    `);\n\n    it('does not import FragmentDocs', () => {\n      const fileName = 'fooBarQuery';\n      const importPath = `src/queries/${fileName}`;\n\n      const document = parse(\n        `query fooBarQuery {\n          a {\n            ...fields\n          }\n        }\n        fragment fields on A {\n          foo\n          bar\n        }\n      `\n      );\n\n      const visitor = new ClientSideBaseVisitor(\n        schema,\n        (document.definitions.filter(d => d.kind === Kind.FRAGMENT_DEFINITION) as FragmentDefinitionNode[]).map(\n          fragmentDef => ({\n            node: fragmentDef,\n            name: fragmentDef.name.value,\n            onType: fragmentDef.typeCondition.name.value,\n            isExternal: false,\n          })\n        ),\n        {\n          emitLegacyCommonJSImports: true,\n          importDocumentNodeExternallyFrom: 'near-operation-file',\n          documentMode: DocumentMode.documentNodeImportFragments,\n          fragmentImports: [\n            {\n              baseDir: '/',\n              baseOutputDir: '',\n              outputPath: '',\n              importSource: {\n                path: '~types',\n                identifiers: [\n                  { name: 'FieldsFragmentDoc', kind: 'document' },\n                  { name: 'FieldsFragment', kind: 'type' },\n                ],\n              },\n              importExtension: '',\n              typesImport: false,\n            },\n          ],\n        },\n        {},\n        [{ document, location: importPath }]\n      );\n\n      visitor.OperationDefinition(document.definitions[0] as OperationDefinitionNode);\n\n      const imports = visitor.getImports();\n      for (const i of imports) {\n        expect(i).not.toContain('FragmentDoc');\n      }\n    });\n  });\n\n  describe('when documentMode \"graphQLTag\"', () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type Query {\n        a: A\n      }\n\n      type A {\n        foo: String\n        bar: String\n      }\n    `);\n\n    it('imports FragmentDocs', () => {\n      const fileName = 'fooBarQuery';\n      const importPath = `src/queries/${fileName}`;\n\n      const document = parse(\n        `query fooBarQuery {\n          a {\n            ...fields\n          }\n        }\n        fragment fields on A {\n          foo\n          bar\n        }\n      `\n      );\n\n      const visitor = new ClientSideBaseVisitor(\n        schema,\n        (document.definitions.filter(d => d.kind === Kind.FRAGMENT_DEFINITION) as FragmentDefinitionNode[]).map(\n          fragmentDef => ({\n            node: fragmentDef,\n            name: fragmentDef.name.value,\n            onType: fragmentDef.typeCondition.name.value,\n            isExternal: false,\n          })\n        ),\n        {\n          emitLegacyCommonJSImports: true,\n          importDocumentNodeExternallyFrom: 'near-operation-file',\n          documentMode: DocumentMode.graphQLTag,\n          fragmentImports: [\n            {\n              baseDir: '/',\n              baseOutputDir: '',\n              outputPath: '',\n              importSource: {\n                path: '~types',\n                identifiers: [\n                  { name: 'FieldsFragmentDoc', kind: 'document' },\n                  { name: 'FieldsFragment', kind: 'type' },\n                ],\n              },\n              importExtension: '',\n              typesImport: false,\n            },\n          ],\n        },\n        {},\n        [{ document, location: importPath }]\n      );\n\n      visitor.OperationDefinition(document.definitions[0] as OperationDefinitionNode);\n\n      const imports = visitor.getImports();\n      expect(imports.some(i => i.includes('FragmentDoc'))).toBeTruthy();\n    });\n  });\n});\n\ndescribe('includeExternalFragments', () => {\n  const schema = buildSchema(/* GraphQL */ `\n    type Query {\n      a: A\n    }\n\n    type A {\n      foo: String\n      bar: String\n    }\n  `);\n\n  const document = parse(`\n    query fooBarQuery {\n      a {\n        ...ExternalA\n      }\n    }\n    `);\n\n  const externalFragments = parse(`\n    fragment ExternalA on A {\n      foo\n      bar\n    }\n    `)\n    .definitions.filter(d => d.kind === Kind.FRAGMENT_DEFINITION)\n    .map(fragmentDef => ({\n      node: fragmentDef,\n      name: fragmentDef.name.value,\n      onType: fragmentDef.typeCondition.name.value,\n      isExternal: true,\n    }));\n\n  it('should not include external fragments', () => {\n    const visitor = new ClientSideBaseVisitor(schema, externalFragments, {}, {});\n\n    visitor.OperationDefinition(document.definitions[0] as OperationDefinitionNode);\n\n    expect(visitor.fragments).toBe('');\n  });\n\n  it('should include external fragments', () => {\n    const visitor = new ClientSideBaseVisitor(\n      schema,\n      externalFragments,\n      {\n        includeExternalFragments: true,\n      },\n      {}\n    );\n\n    expect(visitor.fragments).toContain('ExternalAFragment');\n  });\n});\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/tests/create-resolvers-fields.spec.ts",
    "content": "import { BaseResolversVisitor, ParsedResolversConfig } from '@graphql-codegen/visitor-plugin-common';\nimport { buildSchema } from 'graphql';\n\ndescribe('BaseResolversVisitor.createResolversFields', () => {\n  const schema = buildSchema(/* GraphQL */ `\n    type Query {\n      a: A\n    }\n\n    type A {\n      b: B\n    }\n\n    enum B {\n      C\n    }\n  `);\n\n  it('checks if types are actually included when Omit is applied', () => {\n    /**\n     * This makes sure that https://github.com/dotansimha/graphql-code-generator/issues/6709 doesn't occur again.\n     * The result looked like this without the fix:\n     * export type ResolversParentTypes = {\n     *   Query: {}\n     *   A: Omit<A, 'b'> & { b?: Maybe<ResolversParentTypes['B']> }\n     *   Boolean: Scalars['Boolean']['output']\n     *   String: Scalars['String']['output']\n     * };\n     */\n    const visitor = new BaseResolversVisitor(\n      {\n        mappers: {\n          B: './some-file#B',\n        },\n      },\n      {} as ParsedResolversConfig,\n      schema\n    );\n\n    expect(visitor.buildResolversParentTypes()).toEqual(\n      `/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = {\n  Query: Record<PropertyKey, never>\n  A: A\n  Boolean: Scalars['Boolean']['output']\n  String: Scalars['String']['output']\n};\n`\n    );\n  });\n\n  it('generates proper types when typesPrefix is used along with `enumPrefix: false`', () => {\n    /**\n     * This makes sure that https://github.com/dotansimha/graphql-code-generator/issues/6709 doesn't occur again.\n     * The result looked like this without the fix:\n     * export type ResolversParentTypes = {\n     *   Query: {}\n     *   A: Omit<A, 'b'> & { b?: Maybe<ResolversParentTypes['B']> }\n     *   Boolean: Scalars['Boolean']['output']\n     *   String: Scalars['String']['output']\n     * };\n     */\n    const visitor = new BaseResolversVisitor(\n      {\n        mappers: {\n          B: './some-file#B',\n        },\n        typesPrefix: 'I',\n        enumPrefix: false,\n      },\n      {} as ParsedResolversConfig,\n      schema\n    );\n\n    expect(visitor.buildResolversParentTypes()).toEqual(\n      `/** Mapping between all available schema types and the resolvers parents */\nexport type IResolversParentTypes = {\n  Query: Record<PropertyKey, never>\n  A: IA\n  Boolean: Scalars['Boolean']['output']\n  String: Scalars['String']['output']\n};\n`\n    );\n  });\n\n  it('generates proper types when typesSuffix is used along with `enumSuffix: false`', () => {\n    const visitor = new BaseResolversVisitor(\n      {\n        mappers: {\n          B: './some-file#B',\n        },\n        typesSuffix: 'I',\n        enumSuffix: false,\n      },\n      {} as ParsedResolversConfig,\n      schema\n    );\n\n    expect(visitor.buildResolversParentTypes()).toEqual(\n      `/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypesI = {\n  Query: Record<PropertyKey, never>\n  A: AI\n  Boolean: Scalars['Boolean']['output']\n  String: Scalars['String']['output']\n};\n`\n    );\n  });\n});\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/tests/enum-values.spec.ts",
    "content": "import { buildSchema, GraphQLEnumType, GraphQLObjectType, GraphQLSchema } from 'graphql';\nimport { parseEnumValues } from '../src/enum-values.js';\n\ndescribe('enumValues', () => {\n  const schema = buildSchema(/* GraphQL */ `\n    enum Test {\n      A\n      B\n      C\n    }\n\n    type Query {\n      test: Test\n    }\n  `);\n\n  it('should work with namespaces', () => {\n    const result = parseEnumValues({\n      schema,\n      mapOrStr: {\n        Test: `my-file#SomeNamespace.ETest`,\n      },\n    });\n\n    expect(result).toEqual({\n      Test: {\n        isDefault: false,\n        typeIdentifier: 'Test',\n        sourceFile: 'my-file',\n        sourceIdentifier: 'SomeNamespace.ETest',\n        importIdentifier: 'SomeNamespace',\n        mappedValues: null,\n      },\n    });\n  });\n\n  it('should work with regular type', () => {\n    const result = parseEnumValues({\n      schema,\n      mapOrStr: {\n        Test: `my-file#ETest`,\n      },\n    });\n\n    expect(result).toEqual({\n      Test: {\n        isDefault: false,\n        typeIdentifier: 'Test',\n        sourceFile: 'my-file',\n        sourceIdentifier: 'ETest',\n        importIdentifier: 'ETest',\n        mappedValues: null,\n      },\n    });\n  });\n\n  it('should work with aliased type', () => {\n    const result = parseEnumValues({\n      schema,\n      mapOrStr: {\n        Test: `my-file#ETest as Something`,\n      },\n    });\n\n    expect(result).toEqual({\n      Test: {\n        isDefault: false,\n        typeIdentifier: 'Test',\n        sourceFile: 'my-file',\n        sourceIdentifier: 'Something',\n        importIdentifier: 'ETest as Something',\n        mappedValues: null,\n      },\n    });\n  });\n\n  const schemaWithEnumValues = new GraphQLSchema({\n    query: new GraphQLObjectType({\n      name: 'Query',\n      fields: {\n        test: {\n          type: new GraphQLEnumType({\n            name: 'Test',\n            values: {\n              A: {\n                value: 'a',\n              },\n              B: {\n                value: 'b',\n              },\n              C: {\n                value: 'c',\n              },\n              D: {\n                value: `escape me '`,\n              },\n            },\n          }),\n        },\n      },\n    }),\n  });\n\n  it('should respect enum values from schema and escape it if needed', () => {\n    const result = parseEnumValues({\n      schema: schemaWithEnumValues,\n      mapOrStr: {},\n      ignoreEnumValuesFromSchema: false,\n    });\n\n    expect(result).toEqual({\n      Test: {\n        isDefault: false,\n        typeIdentifier: 'Test',\n        sourceFile: null,\n        importIdentifier: null,\n        sourceIdentifier: null,\n        mappedValues: {\n          A: 'a',\n          B: 'b',\n          C: 'c',\n          D: `escape me \\\\'`,\n        },\n      },\n    });\n  });\n\n  it('should ignore enum values from schema', () => {\n    const result = parseEnumValues({\n      schema: schemaWithEnumValues,\n      mapOrStr: {},\n      ignoreEnumValuesFromSchema: true,\n    });\n\n    expect(result).not.toEqual({\n      Test: {\n        isDefault: false,\n        typeIdentifier: 'Test',\n        sourceFile: null,\n        importIdentifier: null,\n        sourceIdentifier: null,\n        mappedValues: {\n          A: 'a',\n          B: 'b',\n          C: 'c',\n        },\n      },\n    });\n  });\n\n  const schemaWithNonStringEnumValues = new GraphQLSchema({\n    query: new GraphQLObjectType({\n      name: 'Query',\n      fields: {\n        test: {\n          type: new GraphQLEnumType({\n            name: 'Test',\n            values: {\n              A: {\n                value: 1,\n              },\n              B: {\n                value: true,\n              },\n              C: {\n                value: null,\n              },\n              D: {\n                value: undefined,\n              },\n            },\n          }),\n        },\n      },\n    }),\n  });\n\n  it('should respect non-string enum values', () => {\n    const result = parseEnumValues({\n      schema: schemaWithNonStringEnumValues,\n      mapOrStr: {},\n      ignoreEnumValuesFromSchema: false,\n    });\n\n    expect(result).not.toEqual({\n      Test: {\n        isDefault: false,\n        typeIdentifier: 'Test',\n        sourceFile: null,\n        importIdentifier: null,\n        sourceIdentifier: null,\n        mappedValues: {\n          A: '1',\n          B: 'true',\n          C: 'null',\n          D: 'undefined',\n        },\n      },\n    });\n  });\n});\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/tests/parse-mapper.spec.ts",
    "content": "import { parseMapper, transformMappers } from '../src/mappers.js';\n\ndescribe('parseMapper', () => {\n  it('Should return the correct values for a simple named mapper', () => {\n    const result = parseMapper('MyType');\n\n    expect(result).toEqual({\n      isExternal: false,\n      type: 'MyType',\n    });\n  });\n\n  it('Should support a custom mapper with no imports', () => {\n    const result = parseMapper('CustomMergeTypeMapper<SomeType, SomeOtherType>', 'SomeType');\n\n    expect(result).toEqual({\n      isExternal: false,\n      type: 'CustomMergeTypeMapper<SomeType, SomeOtherType>',\n    });\n  });\n\n  it('Should return the correct values for a external named mapper', () => {\n    const result = parseMapper('file#MyType');\n\n    expect(result).toEqual({\n      default: false,\n      isExternal: true,\n      import: 'MyType',\n      type: 'MyType',\n      source: 'file',\n    });\n  });\n\n  it('Should return the correct values for a external default mapper', () => {\n    const result = parseMapper('file#default', 'MyGqlType');\n\n    expect(result).toEqual({\n      default: true,\n      isExternal: true,\n      import: 'MyGqlType',\n      type: 'MyGqlType',\n      source: 'file',\n    });\n  });\n\n  it('Should support namespaces', () => {\n    const result = parseMapper('file#Namespace.Type', 'MyGqlType');\n\n    expect(result).toEqual({\n      default: false,\n      isExternal: true,\n      import: 'Namespace',\n      type: 'Namespace.Type',\n      source: 'file',\n    });\n\n    // legacy\n    const legacyResult = parseMapper('file#Namespace#Type', 'MyGqlType');\n\n    expect(legacyResult).toEqual({\n      default: false,\n      isExternal: true,\n      import: 'Namespace',\n      type: 'Namespace.Type',\n      source: 'file',\n    });\n  });\n\n  it('Should support aliases', () => {\n    const result = parseMapper('file#Type as SomeOtherType', 'SomeType');\n\n    expect(result).toEqual({\n      default: false,\n      isExternal: true,\n      import: 'Type as SomeOtherType',\n      type: 'SomeOtherType',\n      source: 'file',\n    });\n  });\n\n  it('Should support aliases (default)', () => {\n    const result = parseMapper('file#default as SomeOtherType', 'SomeType');\n\n    expect(result).toEqual({\n      default: true,\n      isExternal: true,\n      import: 'SomeOtherType',\n      type: 'SomeOtherType',\n      source: 'file',\n    });\n  });\n\n  it('should support generic with complex setup', () => {\n    const result = parseMapper(`@common-types#Edge<ResolversParentTypes['User']>`, 'SomeType');\n\n    expect(result).toEqual({\n      default: false,\n      isExternal: true,\n      import: 'Edge',\n      type: `Edge<ResolversParentTypes['User']>`,\n      source: '@common-types',\n    });\n  });\n\n  it('Should support generics', () => {\n    const result = parseMapper('file#Type<Generic>', 'SomeType');\n\n    expect(result).toEqual({\n      default: false,\n      isExternal: true,\n      import: 'Type',\n      type: 'Type<Generic>',\n      source: 'file',\n    });\n  });\n\n  describe('suffix', () => {\n    it('Should not add a suffix to a simple named mapper', () => {\n      const result = parseMapper('MyType', null, 'Model');\n\n      expect(result).toEqual({\n        isExternal: false,\n        type: 'MyType',\n      });\n    });\n\n    it('Should add a suffix to an external named mapper', () => {\n      const result = parseMapper('file#Type', null, 'Model');\n\n      expect(result).toEqual({\n        default: false,\n        isExternal: true,\n        import: 'Type as TypeModel',\n        type: 'TypeModel',\n        source: 'file',\n      });\n    });\n\n    it('Should add a suffix to an external default mapper', () => {\n      const result = parseMapper('file#default', 'MyGqlType', 'Model');\n\n      expect(result).toEqual({\n        default: true,\n        isExternal: true,\n        import: 'MyGqlTypeModel',\n        type: 'MyGqlTypeModel',\n        source: 'file',\n      });\n    });\n\n    it('Should add a suffix and support generics', () => {\n      const result = parseMapper('file#Type<Generic>', 'SomeType', 'Model');\n\n      expect(result).toEqual({\n        default: false,\n        isExternal: true,\n        import: 'Type as TypeModel',\n        type: 'TypeModel<Generic>',\n        source: 'file',\n      });\n    });\n\n    it('Should not add a suffix to a namespace', () => {\n      const result = parseMapper('file#Namespace.Type', 'MyGqlType', 'Model');\n\n      expect(result).toEqual({\n        default: false,\n        isExternal: true,\n        import: 'Namespace',\n        type: 'Namespace.Type',\n        source: 'file',\n      });\n\n      // legacy\n      const legacyResult = parseMapper('file#Namespace#Type', 'MyGqlType', 'Model');\n\n      expect(legacyResult).toEqual({\n        default: false,\n        isExternal: true,\n        import: 'Namespace',\n        type: 'Namespace.Type',\n        source: 'file',\n      });\n    });\n\n    it('Should add a suffix next to an alias', () => {\n      const result = parseMapper('file#Type as SomeOtherType', 'SomeType', 'Model');\n\n      expect(result).toEqual({\n        default: false,\n        isExternal: true,\n        import: 'Type as SomeOtherTypeModel',\n        type: 'SomeOtherTypeModel',\n        source: 'file',\n      });\n    });\n\n    it('transformMappers should apply a suffix to parseMapper', () => {\n      const mappers = transformMappers(\n        {\n          Type: 'file#Type as SomeOtherType',\n        },\n        'Suffix'\n      );\n\n      const result = mappers.Type;\n\n      expect(result).toEqual({\n        default: false,\n        isExternal: true,\n        import: 'Type as SomeOtherTypeSuffix',\n        type: 'SomeOtherTypeSuffix',\n        source: 'file',\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/tests/plugins-common.spec.ts",
    "content": "import { convertFactory } from '../src/naming.js';\n\ndescribe('convertFactory', () => {\n  it('Should use pascal case by default', () => {\n    const factory = convertFactory({\n      namingConvention: null,\n    });\n\n    expect(factory('MyName')).toBe('MyName');\n    expect(factory('myName')).toBe('MyName');\n    expect(factory('myname')).toBe('Myname');\n    expect(factory('MyNAME')).toBe('MyName');\n  });\n\n  it('Should allow to override underscore behaviour directly from configuration.', () => {\n    const factory = convertFactory({\n      namingConvention: {\n        transformUnderscore: true,\n      },\n    });\n\n    expect(factory('My_Name')).toBe('MyName');\n    expect(factory('_Myname')).toBe('Myname');\n    expect(factory('My_name')).toBe('MyName');\n  });\n\n  it('Should allow to use \"keep\" as root', () => {\n    const factory = convertFactory({\n      namingConvention: 'keep',\n    });\n\n    expect(factory('MyName')).toBe('MyName');\n    expect(factory('myName')).toBe('myName');\n    expect(factory('myname')).toBe('myname');\n    expect(factory('MyNAME')).toBe('MyNAME');\n  });\n\n  it('Should allow to use Function as root', () => {\n    const factory = convertFactory({\n      namingConvention: str => {\n        return 'something' + str;\n      },\n    });\n\n    expect(factory('MyName')).toBe('somethingMyName');\n  });\n\n  it('Should allow to use object of naming conventions', () => {\n    const factory = convertFactory({\n      namingConvention: {\n        typeNames: 'keep',\n        enumValues: 'keep',\n      },\n    });\n\n    expect(factory('MyName')).toBe('MyName');\n    expect(factory('Myname')).toBe('Myname');\n    expect(factory('NYNAME')).toBe('NYNAME');\n  });\n\n  it('Should allow to use function of naming conventions', () => {\n    const factory = convertFactory({\n      namingConvention: {\n        typeNames: str => 'a_' + str,\n        enumValues: 'keep',\n      },\n    });\n\n    expect(factory('MyName')).toBe('a_MyName');\n    expect(factory('Myname')).toBe('a_Myname');\n    expect(factory('NYNAME')).toBe('a_NYNAME');\n  });\n\n  it('Should allow to use function of naming conventions', () => {\n    const factory = convertFactory({\n      namingConvention: {\n        typeNames: str => 'a_' + str,\n        enumValues: 'keep',\n      },\n    });\n\n    expect(factory('MyName')).toBe('a_MyName');\n    expect(factory('Myname')).toBe('a_Myname');\n    expect(factory('NYNAME')).toBe('a_NYNAME');\n  });\n\n  it('Should keep underscore by default', () => {\n    const factory = convertFactory({\n      namingConvention: null,\n    });\n\n    expect(factory('My_Name')).toBe('My_Name');\n    expect(factory('_Myname')).toBe('_Myname');\n    expect(factory('My_name')).toBe('My_Name');\n  });\n\n  it('Should allow to override underscore behaviour', () => {\n    const factory = convertFactory({\n      namingConvention: null,\n    });\n\n    expect(factory('My_Name', { transformUnderscore: true })).toBe('MyName');\n    expect(factory('_Myname', { transformUnderscore: true })).toBe('Myname');\n    expect(factory('My_name', { transformUnderscore: true })).toBe('MyName');\n  });\n\n  it('Should allow to override transformUnderscore in config', () => {\n    const factory = convertFactory({\n      namingConvention: {\n        typeNames: str => str.replace('_', ''),\n        enumValues: 'keep',\n        transformUnderscore: true,\n      },\n    });\n\n    expect(factory('My_Name')).toBe('MyName');\n    expect(factory('_Myname')).toBe('Myname');\n    expect(factory('My_name')).toBe('Myname');\n  });\n});\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/tests/utils.spec.ts",
    "content": "import { flatten, groupBy, unique } from '../src/utils';\n\ndescribe('utils', () => {\n  describe('flatten', () => {\n    it('should flatten a nested array', () => {\n      const array = [\n        [1, 2, 3],\n        [4, 5, 6],\n        [7, 8, 9],\n      ];\n      const actual = flatten(array);\n      const expected = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n      expect(actual).toEqual(expected);\n    });\n  });\n\n  describe('groupBy', () => {\n    it('should group by a property', () => {\n      const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n      const actual = groupBy(array, i => i % 2);\n      const expected = { 0: [2, 4, 6, 8, 10], 1: [1, 3, 5, 7, 9] };\n      expect(actual).toEqual(expected);\n    });\n  });\n\n  describe('unique', () => {\n    it('should return unique items when no key selector is passed', () => {\n      const array = [1, 2, 3, 1, 2, 4];\n      const actual = unique(array);\n      const expected = [1, 2, 3, 4];\n      expect(actual).toEqual(expected);\n    });\n\n    it('should return unique items based on key selector', () => {\n      const array = [\n        { id: 1, name: 'Alice' },\n        { id: 2, name: 'Bob' },\n        { id: 1, name: 'Alice #2' },\n        { id: 3, name: 'Charlie' },\n      ];\n\n      const actual = unique(array, item => item.id);\n      const expected = [\n        { id: 1, name: 'Alice' },\n        { id: 2, name: 'Bob' },\n        { id: 3, name: 'Charlie' },\n      ];\n\n      expect(actual).toEqual(expected);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/plugins/other/visitor-plugin-common/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'visitor-plugin-common',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/plugins/typescript/document-nodes/CHANGELOG.md",
    "content": "# @graphql-codegen/typescript-document-nodes\n\n## 5.0.9\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-codegen/visitor-plugin-common@^6.2.3` ↗︎](https://www.npmjs.com/package/@graphql-codegen/visitor-plugin-common/v/6.2.3) (from `6.2.3`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/plugin-helpers@6.1.1\n  - @graphql-codegen/visitor-plugin-common@6.2.4\n\n## 5.0.8\n\n### Patch Changes\n\n- Updated dependencies [[`6038634`](https://github.com/dotansimha/graphql-code-generator/commit/60386344081917f2884db933309821603a2be2bf)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.3\n\n## 5.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`f588d91`](https://github.com/dotansimha/graphql-code-generator/commit/f588d91ac43ea0aa5931915ce980d2e6876bb59c)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.2\n\n## 5.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`b995ed1`](https://github.com/dotansimha/graphql-code-generator/commit/b995ed13a49379ea05e0e313fac68b557527523a)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.1\n\n## 5.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`f821e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f821e8ab9351f23a9f7e5d5e6fc69c8e8868cad8), [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.0\n  - @graphql-codegen/plugin-helpers@6.1.0\n\n## 5.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`51a1a72`](https://github.com/dotansimha/graphql-code-generator/commit/51a1a7280578d43681391df11d320a8416c0b41d)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.2\n\n## 5.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`6715330`](https://github.com/dotansimha/graphql-code-generator/commit/67153304646694d75aee24afd70c3fce12e9f1f2)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.1\n\n## 5.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`8258f1f`](https://github.com/dotansimha/graphql-code-generator/commit/8258f1f6012c106d02ef28bca9ec424f70c4aa26)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.0\n\n## 5.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`accdab6`](https://github.com/dotansimha/graphql-code-generator/commit/accdab69106605241933e9d66d64dc7077656f30)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.1\n\n## 5.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.0\n  - @graphql-codegen/plugin-helpers@6.0.0\n\n## 4.0.16\n\n### Patch Changes\n\n- Updated dependencies [[`f6909d1`](https://github.com/dotansimha/graphql-code-generator/commit/f6909d1797c15b79a0afb7ec089471763a485bfc)]:\n  - @graphql-codegen/visitor-plugin-common@5.8.0\n\n## 4.0.15\n\n### Patch Changes\n\n- Updated dependencies [[`d8566c0`](https://github.com/dotansimha/graphql-code-generator/commit/d8566c015943ea4dbcaeaf57d3d8406553ae230a)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.1\n\n## 4.0.14\n\n### Patch Changes\n\n- Updated dependencies [[`6d7c1d7`](https://github.com/dotansimha/graphql-code-generator/commit/6d7c1d7c0a4662acdc0efafd4234229ad0a8dd3c)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.0\n\n## 4.0.13\n\n### Patch Changes\n\n- Updated dependencies [[`60dd72f`](https://github.com/dotansimha/graphql-code-generator/commit/60dd72fb103fd7fd70b4e1def98da29588865517)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.1\n\n## 4.0.12\n\n### Patch Changes\n\n- Updated dependencies [[`1617e3c`](https://github.com/dotansimha/graphql-code-generator/commit/1617e3cf38f3059cc5ea88b540033f521f03725a), [`fa64fbf`](https://github.com/dotansimha/graphql-code-generator/commit/fa64fbf8a44e1cee7ae17806dcd178dc7350c4ba)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.0\n\n## 4.0.11\n\n### Patch Changes\n\n- Updated dependencies [[`55a1e9e`](https://github.com/dotansimha/graphql-code-generator/commit/55a1e9e63830df17ed40602ea7e322bbf48b17bc), [`a235051`](https://github.com/dotansimha/graphql-code-generator/commit/a23505180ac2f275a55ece27162ec9bfcdc52e03)]:\n  - @graphql-codegen/visitor-plugin-common@5.5.0\n  - @graphql-codegen/plugin-helpers@5.1.0\n\n## 4.0.10\n\n### Patch Changes\n\n- Updated dependencies [[`3f4f546`](https://github.com/dotansimha/graphql-code-generator/commit/3f4f5466ff168ad822b9a00d83d3779078e6d8c4)]:\n  - @graphql-codegen/visitor-plugin-common@5.4.0\n\n## 4.0.9\n\n### Patch Changes\n\n- Updated dependencies [[`79fee3c`](https://github.com/dotansimha/graphql-code-generator/commit/79fee3cada20d683d250aad5aa5fef9d6ed9f4d2)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.1\n\n## 4.0.8\n\n### Patch Changes\n\n- Updated dependencies [[`808ada5`](https://github.com/dotansimha/graphql-code-generator/commit/808ada595d83d39cad045da5824cac6378e9eca3), [`14ce39e`](https://github.com/dotansimha/graphql-code-generator/commit/14ce39e41dfee38c652be736664177fa2b1df421)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.0\n\n## 4.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`156cc2b`](https://github.com/dotansimha/graphql-code-generator/commit/156cc2b9a2a5129beba121cfa987b04e29899431), [`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`b49457b`](https://github.com/dotansimha/graphql-code-generator/commit/b49457b5f29328d2dc23c642788a2e697cb8966e)]:\n  - @graphql-codegen/plugin-helpers@5.0.4\n  - @graphql-codegen/visitor-plugin-common@5.2.0\n\n## 4.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`920b443`](https://github.com/dotansimha/graphql-code-generator/commit/920b443a401b8cc4811f64ec5b25fc7b4ae32b53), [`ed9c205`](https://github.com/dotansimha/graphql-code-generator/commit/ed9c205d15d7f14ed73e54aecf40e4fad5664e9d)]:\n  - @graphql-codegen/visitor-plugin-common@5.1.0\n\n## 4.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`53f270a`](https://github.com/dotansimha/graphql-code-generator/commit/53f270acfa1da992e0f9d2e50921bb588392f8a5)]:\n  - @graphql-codegen/visitor-plugin-common@5.0.0\n\n## 4.0.4\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.2\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 4.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`7718a8113`](https://github.com/dotansimha/graphql-code-generator/commit/7718a8113dc6282475cb738f1e28698b8221fa2f)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.1\n\n## 4.0.2\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n  - @graphql-codegen/visitor-plugin-common@4.1.0\n\n## 4.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a)]:\n  - @graphql-codegen/visitor-plugin-common@4.0.1\n\n## 4.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Patch Changes\n\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96), [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`50471e651`](https://github.com/dotansimha/graphql-code-generator/commit/50471e6514557db827cd26157262401c6c600a8c), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c), [`ca02ad172`](https://github.com/dotansimha/graphql-code-generator/commit/ca02ad172a0e8f52570fdef4271ec286d883236d), [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0), [`5950f5a68`](https://github.com/dotansimha/graphql-code-generator/commit/5950f5a6843cdd92b9d5b8ced3a97b68eadf9f30), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n  - @graphql-codegen/visitor-plugin-common@4.0.0\n\n## 3.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`386cf9044`](https://github.com/dotansimha/graphql-code-generator/commit/386cf9044a41d87ed45069b22d26b30f4b262a85), [`402cb8ac0`](https://github.com/dotansimha/graphql-code-generator/commit/402cb8ac0f0c347b186d295c4b69c19e25a65d00)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.1\n\n## 3.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`e56790104`](https://github.com/dotansimha/graphql-code-generator/commit/e56790104ae56d6c5b48ef71823345bd09d3b835), [`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29), [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087), [`acb647e4e`](https://github.com/dotansimha/graphql-code-generator/commit/acb647e4efbddecf732b6e55dc47ac40c9bdaf08), [`9f4d9c5a4`](https://github.com/dotansimha/graphql-code-generator/commit/9f4d9c5a479d34da25df8e060a8c2b3b162647dd)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.0\n  - @graphql-codegen/plugin-helpers@4.2.0\n\n## 3.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`ba0610bbd`](https://github.com/dotansimha/graphql-code-generator/commit/ba0610bbd4578d8a82078014766f56d8ae5fcf7a), [`4b49f6fbe`](https://github.com/dotansimha/graphql-code-generator/commit/4b49f6fbed802907b460bfb7b6e9a85f88c555bc), [`b343626c9`](https://github.com/dotansimha/graphql-code-generator/commit/b343626c978b9ee0f14e314cea6c01ae3dad057c)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.2\n\n## 3.0.1\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n  - @graphql-codegen/visitor-plugin-common@3.0.1\n\n## 3.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.0\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 2.3.13\n\n### Patch Changes\n\n- Updated dependencies [[`a98198524`](https://github.com/dotansimha/graphql-code-generator/commit/a9819852443884b43de7c15040ccffc205f9177a)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.8\n\n## 2.3.12\n\n### Patch Changes\n\n- Updated dependencies [[`eb454d06c`](https://github.com/dotansimha/graphql-code-generator/commit/eb454d06c977f11f7d4a7b0b07eb80f8fd590560)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.7\n\n## 2.3.11\n\n### Patch Changes\n\n- Updated dependencies [[`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`6c6b6f2df`](https://github.com/dotansimha/graphql-code-generator/commit/6c6b6f2df88a3a37b437a25320dab5590f033316)]:\n  - @graphql-codegen/plugin-helpers@3.1.2\n  - @graphql-codegen/visitor-plugin-common@2.13.6\n\n## 2.3.10\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81), [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n  - @graphql-codegen/visitor-plugin-common@2.13.5\n\n## 2.3.9\n\n### Patch Changes\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n  - @graphql-codegen/visitor-plugin-common@2.13.4\n\n## 2.3.8\n\n### Patch Changes\n\n- Updated dependencies [[`62f655452`](https://github.com/dotansimha/graphql-code-generator/commit/62f6554520955dd675e11c920f35ef9bf0aaeffe)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.3\n\n## 2.3.7\n\n### Patch Changes\n\n- Updated dependencies [[`ef4c2c9c2`](https://github.com/dotansimha/graphql-code-generator/commit/ef4c2c9c233c68830f10eb4c167c7cceead27122)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.2\n\n## 2.3.6\n\n### Patch Changes\n\n- Updated dependencies [[`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.1\n  - @graphql-codegen/plugin-helpers@2.7.2\n\n## 2.3.5\n\n### Patch Changes\n\n- Updated dependencies [[`a46b8d99c`](https://github.com/dotansimha/graphql-code-generator/commit/a46b8d99c797283d773ec14163c62be9c84d4c2b)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.0\n\n## 2.3.4\n\n### Patch Changes\n\n- Updated dependencies [[`1bd7f771c`](https://github.com/dotansimha/graphql-code-generator/commit/1bd7f771ccb949a5a37395c7c57cb41c19340714)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.2\n\n## 2.3.3\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f), [`47d0a57e2`](https://github.com/dotansimha/graphql-code-generator/commit/47d0a57e27dd0d2334670bfc6c81c45e00ff4e74)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.1\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 2.3.2\n\n### Patch Changes\n\n- Updated dependencies [2cbcbb371]\n  - @graphql-codegen/visitor-plugin-common@2.12.0\n  - @graphql-codegen/plugin-helpers@2.6.0\n\n## 2.3.1\n\n### Patch Changes\n\n- Updated dependencies [525ad580b]\n  - @graphql-codegen/visitor-plugin-common@2.11.1\n\n## 2.3.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [68bb30e19]\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/visitor-plugin-common@2.11.0\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 2.2.14\n\n### Patch Changes\n\n- Updated dependencies [aa1e6eafd]\n- Updated dependencies [a42fcbfe4]\n- Updated dependencies [8b10f22be]\n  - @graphql-codegen/visitor-plugin-common@2.10.0\n\n## 2.2.13\n\n### Patch Changes\n\n- Updated dependencies [d16bebacb]\n  - @graphql-codegen/visitor-plugin-common@2.9.1\n\n## 2.2.12\n\n### Patch Changes\n\n- Updated dependencies [c3d7b7226]\n  - @graphql-codegen/visitor-plugin-common@2.9.0\n\n## 2.2.11\n\n### Patch Changes\n\n- Updated dependencies [f1fb77bd4]\n  - @graphql-codegen/visitor-plugin-common@2.8.0\n\n## 2.2.10\n\n### Patch Changes\n\n- Updated dependencies [9a5f31cb6]\n  - @graphql-codegen/visitor-plugin-common@2.7.6\n\n## 2.2.9\n\n### Patch Changes\n\n- Updated dependencies [2966686e9]\n  - @graphql-codegen/visitor-plugin-common@2.7.5\n\n## 2.2.8\n\n### Patch Changes\n\n- Updated dependencies [337fd4f77]\n  - @graphql-codegen/visitor-plugin-common@2.7.4\n\n## 2.2.7\n\n### Patch Changes\n\n- Updated dependencies [54718c039]\n  - @graphql-codegen/visitor-plugin-common@2.7.3\n\n## 2.2.6\n\n### Patch Changes\n\n- Updated dependencies [11d05e361]\n  - @graphql-codegen/visitor-plugin-common@2.7.2\n\n## 2.2.5\n\n### Patch Changes\n\n- Updated dependencies [fd55e2039]\n  - @graphql-codegen/visitor-plugin-common@2.7.1\n\n## 2.2.4\n\n### Patch Changes\n\n- Updated dependencies [1479233df]\n  - @graphql-codegen/visitor-plugin-common@2.7.0\n\n## 2.2.3\n\n### Patch Changes\n\n- Updated dependencies [c8ef37ae0]\n- Updated dependencies [754a33715]\n- Updated dependencies [bef4376d5]\n- Updated dependencies [be7cb3a82]\n  - @graphql-codegen/visitor-plugin-common@2.6.0\n  - @graphql-codegen/plugin-helpers@2.4.0\n\n## 2.2.2\n\n### Patch Changes\n\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/visitor-plugin-common@2.5.2\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 2.2.1\n\n### Patch Changes\n\n- Updated dependencies [a9f1f1594]\n- Updated dependencies [9ea6621ec]\n  - @graphql-codegen/visitor-plugin-common@2.5.1\n\n## 2.2.0\n\n### Minor Changes\n\n- 97ddb487a: feat: GraphQL v16 compatibility\n\n### Patch Changes\n\n- Updated dependencies [97ddb487a]\n  - @graphql-codegen/visitor-plugin-common@2.5.0\n  - @graphql-codegen/plugin-helpers@2.3.0\n\n## 2.1.6\n\n### Patch Changes\n\n- Updated dependencies [ad02cb9b8]\n  - @graphql-codegen/visitor-plugin-common@2.4.0\n\n## 2.1.5\n\n### Patch Changes\n\n- Updated dependencies [b9e85adae]\n- Updated dependencies [7c60e5acc]\n- Updated dependencies [3c2c847be]\n  - @graphql-codegen/visitor-plugin-common@2.3.0\n  - @graphql-codegen/plugin-helpers@2.2.0\n\n## 2.1.4\n\n### Patch Changes\n\n- Updated dependencies [0b090e31a]\n  - @graphql-codegen/visitor-plugin-common@2.2.1\n\n## 2.1.3\n\n### Patch Changes\n\n- Updated dependencies [d6c2d4c09]\n- Updated dependencies [feeae1c66]\n- Updated dependencies [5086791ac]\n  - @graphql-codegen/visitor-plugin-common@2.2.0\n\n## 2.1.2\n\n### Patch Changes\n\n- Updated dependencies [6470e6cc9]\n- Updated dependencies [263570e50]\n- Updated dependencies [35199dedf]\n  - @graphql-codegen/visitor-plugin-common@2.1.2\n  - @graphql-codegen/plugin-helpers@2.1.1\n\n## 2.1.1\n\n### Patch Changes\n\n- Updated dependencies [aabeff181]\n  - @graphql-codegen/visitor-plugin-common@2.1.1\n\n## 2.1.0\n\n### Minor Changes\n\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- Updated dependencies [290170262]\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/visitor-plugin-common@2.1.0\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 2.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- Updated dependencies [d80efdec4]\n- Updated dependencies [d80efdec4]\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/visitor-plugin-common@2.0.0\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 1.17.16\n\n### Patch Changes\n\n- Updated dependencies [df19a4ed]\n- Updated dependencies [470336a1]\n- Updated dependencies [9005cc17]\n  - @graphql-codegen/visitor-plugin-common@1.22.0\n  - @graphql-codegen/plugin-helpers@1.18.8\n\n## 1.17.15\n\n### Patch Changes\n\n- Updated dependencies [6762aff5]\n  - @graphql-codegen/visitor-plugin-common@1.21.3\n\n## 1.17.14\n\n### Patch Changes\n\n- Updated dependencies [6aaecf1c]\n  - @graphql-codegen/visitor-plugin-common@1.21.2\n\n## 1.17.13\n\n### Patch Changes\n\n- Updated dependencies [cf1e5abc]\n  - @graphql-codegen/visitor-plugin-common@1.21.1\n\n## 1.17.12\n\n### Patch Changes\n\n- Updated dependencies [dfd25caf]\n- Updated dependencies [8da7dff6]\n  - @graphql-codegen/visitor-plugin-common@1.21.0\n  - @graphql-codegen/plugin-helpers@1.18.7\n\n## 1.17.11\n\n### Patch Changes\n\n- d9212aa0: fix(visitor-plugin-common): guard for a runtime type error\n- Updated dependencies [d9212aa0]\n- Updated dependencies [f0b5ea53]\n- Updated dependencies [097bea2f]\n  - @graphql-codegen/visitor-plugin-common@1.20.0\n  - @graphql-codegen/plugin-helpers@1.18.5\n\n## 1.17.10\n\n### Patch Changes\n\n- 29b75b1e: enhance(docs): improve docs for naming convention\n- 29b75b1e: enhance(namingConvention): use change-case-all instead of individual packages for naming convention\n- Updated dependencies [e947f8e3]\n- Updated dependencies [29b75b1e]\n- Updated dependencies [d4942d04]\n- Updated dependencies [1f6f3db6]\n- Updated dependencies [29b75b1e]\n  - @graphql-codegen/visitor-plugin-common@1.19.0\n  - @graphql-codegen/plugin-helpers@1.18.3\n\n## 1.17.9\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/visitor-plugin-common@1.17.20\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 1.17.8\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n  - @graphql-codegen/visitor-plugin-common@1.17.13\n  - @graphql-codegen/plugin-helpers@1.17.8\n"
  },
  {
    "path": "packages/plugins/typescript/document-nodes/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/typescript-document-nodes\",\n  \"version\": \"5.0.9\",\n  \"description\": \"GraphQL Code Generator plugin for generating TypeScript modules with embedded GraphQL document nodes\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/plugins/typescript/document-nodes\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"^6.1.1\",\n    \"@graphql-codegen/visitor-plugin-common\": \"^6.2.4\",\n    \"auto-bind\": \"~4.0.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/document-nodes/src/index.ts",
    "content": "import { oldVisit, PluginFunction, PluginValidateFn, Types } from '@graphql-codegen/plugin-helpers';\nimport {\n  LoadedFragment,\n  NamingConvention,\n  RawClientSideBasePluginConfig,\n} from '@graphql-codegen/visitor-plugin-common';\nimport { concatAST, FragmentDefinitionNode, GraphQLSchema, Kind } from 'graphql';\nimport { TypeScriptDocumentNodesVisitor } from './visitor.js';\n\n/**\n * @description This plugin generates TypeScript source `.ts` file from GraphQL files `.graphql`.\n */\nexport interface TypeScriptDocumentNodesRawPluginConfig extends RawClientSideBasePluginConfig {\n  /**\n   * @default change-case-all#pascalCase\n   * @description Allow you to override the naming convention of the output.\n   * You can either override all namings, or specify an object with specific custom naming convention per output.\n   * The format of the converter must be a valid `module#method`.\n   * Allowed values for specific output are: `typeNames`, `enumValues`.\n   * You can also use \"keep\" to keep all GraphQL names as-is.\n   * Additionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\n   * which is to preserve underscores.\n   *\n   * Available case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\n   * [See more](https://github.com/btxtiger/change-case-all)\n   *\n   * @exampleMarkdown\n   * ## Override All Names\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          namingConvention: 'change-case-all#lowerCase',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Upper-case enum values\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          namingConvention: {\n   *            typeNames: 'change-case-all#pascalCase',\n   *            enumValues: 'change-case-all#upperCase',\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Keep names as is\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *         namingConvention: 'keep',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Remove Underscores\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file': {\n   *        // plugins...\n   *        config: {\n   *          namingConvention: {\n   *            typeNames: 'change-case-all#pascalCase',\n   *            transformUnderscore: true\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  namingConvention?: NamingConvention;\n  /**\n   * @default \"\"\n   * @description Adds prefix to the name\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'src/api/user-service/queries.ts': {\n   *        plugins: ['typescript-document-nodes'],\n   *        config: {\n   *          namePrefix: 'gql',\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  namePrefix?: string;\n  /**\n   * @default \"\"\n   * @description Adds suffix to the name\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'src/api/user-service/queries.ts': {\n   *        plugins: ['typescript-document-nodes'],\n   *        config: {\n   *          nameSuffix: 'Query'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  nameSuffix?: string;\n  /**\n   * @default \"\"\n   * @description Adds prefix to the fragment variable\n   */\n  fragmentPrefix?: string;\n  /**\n   * @default \"\"\n   * @description Adds suffix to the fragment variable\n   */\n  fragmentSuffix?: string;\n}\n\nexport const plugin: PluginFunction<TypeScriptDocumentNodesRawPluginConfig> = (\n  schema: GraphQLSchema,\n  documents: Types.DocumentFile[],\n  config: TypeScriptDocumentNodesRawPluginConfig\n) => {\n  const allAst = concatAST(documents.map(v => v.document));\n\n  const allFragments: LoadedFragment[] = [\n    ...(allAst.definitions.filter(d => d.kind === Kind.FRAGMENT_DEFINITION) as FragmentDefinitionNode[]).map(\n      fragmentDef => ({\n        node: fragmentDef,\n        name: fragmentDef.name.value,\n        onType: fragmentDef.typeCondition.name.value,\n        isExternal: false,\n      })\n    ),\n    ...(config.externalFragments || []),\n  ];\n\n  const visitor = new TypeScriptDocumentNodesVisitor(schema, allFragments, config, documents);\n  const visitorResult = oldVisit(allAst, { leave: visitor });\n\n  return {\n    prepend: visitor.getImports(),\n    content: [visitor.fragments, ...visitorResult.definitions.filter(t => typeof t === 'string')].join('\\n'),\n  };\n};\n\nexport const validate: PluginValidateFn<any> = async (\n  schema: GraphQLSchema,\n  documents: Types.DocumentFile[],\n  config: any,\n  outputFile: string\n) => {\n  if (!outputFile.endsWith('.ts')) {\n    throw new Error(`Plugin \"typescript-document-nodes\" requires extension to be \".ts\"!`);\n  }\n};\n"
  },
  {
    "path": "packages/plugins/typescript/document-nodes/src/visitor.ts",
    "content": "import { Types } from '@graphql-codegen/plugin-helpers';\nimport {\n  ClientSideBasePluginConfig,\n  ClientSideBaseVisitor,\n  getConfigValue,\n  LoadedFragment,\n  NamingConvention,\n} from '@graphql-codegen/visitor-plugin-common';\nimport autoBind from 'auto-bind';\nimport { GraphQLSchema } from 'graphql';\nimport { TypeScriptDocumentNodesRawPluginConfig } from './index.js';\n\nexport interface TypeScriptDocumentNodesPluginConfig extends ClientSideBasePluginConfig {\n  namingConvention: NamingConvention;\n  transformUnderscore: boolean;\n}\n\nexport class TypeScriptDocumentNodesVisitor extends ClientSideBaseVisitor<\n  TypeScriptDocumentNodesRawPluginConfig,\n  TypeScriptDocumentNodesPluginConfig\n> {\n  constructor(\n    schema: GraphQLSchema,\n    fragments: LoadedFragment[],\n    rawConfig: TypeScriptDocumentNodesRawPluginConfig,\n    documents: Types.DocumentFile[]\n  ) {\n    const additionalConfig = {\n      documentVariablePrefix: getConfigValue(rawConfig.namePrefix, ''),\n      documentVariableSuffix: getConfigValue(rawConfig.nameSuffix, ''),\n      fragmentVariablePrefix: getConfigValue(rawConfig.fragmentPrefix, ''),\n      fragmentVariableSuffix: getConfigValue(rawConfig.fragmentSuffix, ''),\n    };\n    super(schema, fragments, rawConfig, additionalConfig, documents);\n    autoBind(this);\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/document-nodes/tests/graphql-document-nodes.spec.ts",
    "content": "import { mergeOutputs, Types } from '@graphql-codegen/plugin-helpers';\nimport { validateTs } from '@graphql-codegen/testing';\nimport { parse } from 'graphql';\nimport { plugin } from '../src/index.js';\n\ndescribe('graphql-codegen typescript-graphql-document-nodes', () => {\n  it('Should generate simple module with one file', async () => {\n    const result = plugin(\n      null,\n      [\n        {\n          location: 'some/file/my-query.graphql',\n          document: parse(/* GraphQL */ `\n            query MyQuery {\n              field\n            }\n          `),\n        },\n      ],\n      {},\n      { outputFile: '' }\n    ) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export const MyQuery = gql\\`\n        query MyQuery {\n          field\n        }\n      \\`;\n    `);\n    validateTs(mergeOutputs([result]));\n  });\n\n  it('Should generate correctly for mutiple files', async () => {\n    const result = (await plugin(\n      null,\n      [\n        {\n          location: 'some/file/my-query.graphql',\n          document: parse(/* GraphQL */ `\n            query MyQuery {\n              field\n            }\n          `),\n        },\n        {\n          location: 'some/file/my-other-query.graphql',\n          document: parse(/* GraphQL */ `\n            query OtherQuery {\n              field\n            }\n          `),\n        },\n      ],\n      {},\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export const MyQuery = gql\\`\n        query MyQuery {\n          field\n        }\n      \\`;\n\n      export const OtherQuery = gql\\`\n        query OtherQuery {\n          field\n        }\n      \\`;\n    `);\n    validateTs(mergeOutputs([result]));\n  });\n\n  it('Should ignore unnamed documents', async () => {\n    const result = (await plugin(\n      null,\n      [\n        {\n          location: 'some/file/my-query.graphql',\n          document: parse(/* GraphQL */ `\n            query {\n              field\n            }\n          `),\n        },\n      ],\n      {},\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo('');\n    validateTs(mergeOutputs([result]));\n  });\n\n  it('Should generate simple module with two documents in one file', async () => {\n    const result = (await plugin(\n      null,\n      [\n        {\n          location: 'some/file/my-query.graphql',\n          document: parse(/* GraphQL */ `\n            query MyQuery {\n              field\n            }\n\n            query OtherQuery {\n              field\n            }\n          `),\n        },\n      ],\n      {},\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export const MyQuery = gql\\`\n        query MyQuery {\n          field\n        }\n      \\`;\n\n      export const OtherQuery = gql\\`\n        query OtherQuery {\n          field\n        }\n      \\`;\n    `);\n    validateTs(mergeOutputs([result]));\n  });\n\n  it('Should generate module with a name as a camel case', async () => {\n    const result = plugin(\n      null,\n      [\n        {\n          location: 'some/file/my-query.graphql',\n          document: parse(/* GraphQL */ `\n            query MyQuery {\n              field\n            }\n          `),\n        },\n      ],\n      { namingConvention: 'change-case-all#camelCase' },\n      { outputFile: '' }\n    ) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export const myQuery = gql\\`\n        query MyQuery {\n          field\n        }\n      \\`;\n    `);\n    validateTs(mergeOutputs([result]));\n  });\n\n  it('Should generate module with a name as a pascal case with underscores', async () => {\n    const result = plugin(\n      null,\n      [\n        {\n          location: 'some/file/my-query.graphql',\n          document: parse(/* GraphQL */ `\n            query My_Query {\n              field\n            }\n          `),\n        },\n      ],\n      { namingConvention: 'change-case-all#pascalCase', transformUnderscore: false } as any,\n      { outputFile: '' }\n    ) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export const My_Query = gql\\`\n        query My_Query {\n          field\n        }\n      \\`;\n    `);\n    validateTs(mergeOutputs([result]));\n  });\n\n  it('Should generate module with a name as a pascal case without underscores', async () => {\n    const result = plugin(\n      null,\n      [\n        {\n          location: 'some/file/my-query.graphql',\n          document: parse(/* GraphQL */ `\n            query My_Query {\n              field\n            }\n          `),\n        },\n      ],\n      {\n        namingConvention: {\n          typeNames: 'change-case-all#pascalCase',\n          transformUnderscore: true,\n        },\n      },\n      { outputFile: '' }\n    ) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export const MyQuery = gql\\`\n        query My_Query {\n          field\n        }\n      \\`;\n    `);\n    validateTs(mergeOutputs([result]));\n  });\n\n  it('Should generate module with a name as a contant case', async () => {\n    const result = plugin(\n      null,\n      [\n        {\n          location: 'some/file/my-query.graphql',\n          document: parse(/* GraphQL */ `\n            query MyQuery {\n              field\n            }\n          `),\n        },\n      ],\n      { namingConvention: 'change-case-all#constantCase' },\n      { outputFile: '' }\n    ) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export const MY_QUERY = gql\\`\n        query MyQuery {\n          field\n        }\n      \\`;\n    `);\n    validateTs(mergeOutputs([result]));\n  });\n\n  it('Should generate module with prefix for a name', async () => {\n    const result = plugin(\n      null,\n      [\n        {\n          location: 'some/file/my-query.graphql',\n          document: parse(/* GraphQL */ `\n            query MyQuery {\n              field\n            }\n          `),\n        },\n      ],\n      { namePrefix: 'Graphql' },\n      { outputFile: '' }\n    ) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export const GraphqlMyQuery = gql\\`\n        query MyQuery {\n          field\n        }\n      \\`;\n    `);\n    validateTs(mergeOutputs([result]));\n  });\n\n  it('Should generate module with suffix for a name', async () => {\n    const result = plugin(\n      null,\n      [\n        {\n          location: 'some/file/my-query.graphql',\n          document: parse(/* GraphQL */ `\n            query MyQuery {\n              field\n            }\n          `),\n        },\n      ],\n      { nameSuffix: 'Query' },\n      { outputFile: '' }\n    ) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export const MyQueryQuery = gql\\`\n        query MyQuery {\n          field\n        }\n      \\`;\n    `);\n    validateTs(mergeOutputs([result]));\n  });\n\n  it('should contain fragment definitions', async () => {\n    const result = plugin(\n      null,\n      [\n        {\n          location: 'some/file/my-query.graphql',\n          document: parse(/* GraphQL */ `\n            # Put your operations here\n            fragment fragment1 on User {\n              id\n              username\n            }\n\n            query user {\n              user(id: 1) {\n                ...fragment1\n              }\n            }\n\n            query user2 {\n              user2: user(id: 1) {\n                ...fragment1\n                email\n              }\n            }\n          `),\n        },\n      ],\n      {},\n      { outputFile: '' }\n    ) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n    export const Fragment1 = gql\\`\n      fragment fragment1 on User {\n        id\n        username\n      }\n    \\`;\n    \n    export const User = gql\\`\n      query user {\n        user(id: 1) {\n          ...fragment1\n        }\n      }\n    \\${Fragment1}\\`;\n    \n    export const User2 = gql\\`\n      query user2 {\n        user2: user(id: 1) {\n          ...fragment1\n          email\n        }\n      }\n    \\${Fragment1}\\`;\n    `);\n    validateTs(mergeOutputs([result]));\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/document-nodes/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'typescript-document-nodes',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/plugins/typescript/gql-tag-operations/CHANGELOG.md",
    "content": "# @graphql-codegen/gql-tag-operations\n\n## 5.1.4\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^11.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/11.0.0) (from `^10.0.0`, in `dependencies`)\n  - Updated dependency [`@graphql-codegen/visitor-plugin-common@^6.2.3` ↗︎](https://www.npmjs.com/package/@graphql-codegen/visitor-plugin-common/v/6.2.3) (from `6.2.3`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/plugin-helpers@6.1.1\n  - @graphql-codegen/visitor-plugin-common@6.2.4\n\n## 5.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`6038634`](https://github.com/dotansimha/graphql-code-generator/commit/60386344081917f2884db933309821603a2be2bf)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.3\n\n## 5.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`f588d91`](https://github.com/dotansimha/graphql-code-generator/commit/f588d91ac43ea0aa5931915ce980d2e6876bb59c)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.2\n\n## 5.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`b995ed1`](https://github.com/dotansimha/graphql-code-generator/commit/b995ed13a49379ea05e0e313fac68b557527523a)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.1\n\n## 5.1.0\n\n### Minor Changes\n\n- [#10510](https://github.com/dotansimha/graphql-code-generator/pull/10510) [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670) Thanks [@nickmessing](https://github.com/nickmessing)! - add importExtension configuration option\n\n### Patch Changes\n\n- Updated dependencies [[`f821e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f821e8ab9351f23a9f7e5d5e6fc69c8e8868cad8), [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.0\n  - @graphql-codegen/plugin-helpers@6.1.0\n\n## 5.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`51a1a72`](https://github.com/dotansimha/graphql-code-generator/commit/51a1a7280578d43681391df11d320a8416c0b41d)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.2\n\n## 5.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`6715330`](https://github.com/dotansimha/graphql-code-generator/commit/67153304646694d75aee24afd70c3fce12e9f1f2)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.1\n\n## 5.0.3\n\n### Patch Changes\n\n- [#10032](https://github.com/dotansimha/graphql-code-generator/pull/10032) [`1debf51`](https://github.com/dotansimha/graphql-code-generator/commit/1debf51aa714e2a53256419c549f6770b6c894a6) Thanks [@shota-tech](https://github.com/shota-tech)! - Change map of operations from an empty array to an empty object when no operations are found\n\n## 5.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`8258f1f`](https://github.com/dotansimha/graphql-code-generator/commit/8258f1f6012c106d02ef28bca9ec424f70c4aa26)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.0\n\n## 5.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`accdab6`](https://github.com/dotansimha/graphql-code-generator/commit/accdab69106605241933e9d66d64dc7077656f30)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.1\n\n## 5.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.0\n  - @graphql-codegen/plugin-helpers@6.0.0\n\n## 4.0.17\n\n### Patch Changes\n\n- Updated dependencies [[`f6909d1`](https://github.com/dotansimha/graphql-code-generator/commit/f6909d1797c15b79a0afb7ec089471763a485bfc)]:\n  - @graphql-codegen/visitor-plugin-common@5.8.0\n\n## 4.0.16\n\n### Patch Changes\n\n- Updated dependencies [[`d8566c0`](https://github.com/dotansimha/graphql-code-generator/commit/d8566c015943ea4dbcaeaf57d3d8406553ae230a)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.1\n\n## 4.0.15\n\n### Patch Changes\n\n- Updated dependencies [[`6d7c1d7`](https://github.com/dotansimha/graphql-code-generator/commit/6d7c1d7c0a4662acdc0efafd4234229ad0a8dd3c)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.0\n\n## 4.0.14\n\n### Patch Changes\n\n- [#10192](https://github.com/dotansimha/graphql-code-generator/pull/10192) [`ec07018`](https://github.com/dotansimha/graphql-code-generator/commit/ec070189a1a3c4d41f2457b56a68b506c81f28ba) Thanks [@brianhuang822](https://github.com/brianhuang822)! - Have gql-tag-operations generate the type for document registry\n\n## 4.0.13\n\n### Patch Changes\n\n- Updated dependencies [[`60dd72f`](https://github.com/dotansimha/graphql-code-generator/commit/60dd72fb103fd7fd70b4e1def98da29588865517)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.1\n\n## 4.0.12\n\n### Patch Changes\n\n- Updated dependencies [[`1617e3c`](https://github.com/dotansimha/graphql-code-generator/commit/1617e3cf38f3059cc5ea88b540033f521f03725a), [`fa64fbf`](https://github.com/dotansimha/graphql-code-generator/commit/fa64fbf8a44e1cee7ae17806dcd178dc7350c4ba)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.0\n\n## 4.0.11\n\n### Patch Changes\n\n- Updated dependencies [[`55a1e9e`](https://github.com/dotansimha/graphql-code-generator/commit/55a1e9e63830df17ed40602ea7e322bbf48b17bc), [`a235051`](https://github.com/dotansimha/graphql-code-generator/commit/a23505180ac2f275a55ece27162ec9bfcdc52e03)]:\n  - @graphql-codegen/visitor-plugin-common@5.5.0\n  - @graphql-codegen/plugin-helpers@5.1.0\n\n## 4.0.10\n\n### Patch Changes\n\n- [#10075](https://github.com/dotansimha/graphql-code-generator/pull/10075) [`67e7556`](https://github.com/dotansimha/graphql-code-generator/commit/67e75561a3e862f26cfbb40e8ec5a08f821f9ddf) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Add note about enabling bundle size reduction for the generated `graphql` tag file.\n\n- Updated dependencies [[`3f4f546`](https://github.com/dotansimha/graphql-code-generator/commit/3f4f5466ff168ad822b9a00d83d3779078e6d8c4)]:\n  - @graphql-codegen/visitor-plugin-common@5.4.0\n\n## 4.0.9\n\n### Patch Changes\n\n- Updated dependencies [[`79fee3c`](https://github.com/dotansimha/graphql-code-generator/commit/79fee3cada20d683d250aad5aa5fef9d6ed9f4d2)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.1\n\n## 4.0.8\n\n### Patch Changes\n\n- Updated dependencies [[`808ada5`](https://github.com/dotansimha/graphql-code-generator/commit/808ada595d83d39cad045da5824cac6378e9eca3), [`14ce39e`](https://github.com/dotansimha/graphql-code-generator/commit/14ce39e41dfee38c652be736664177fa2b1df421)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.0\n\n## 4.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`156cc2b`](https://github.com/dotansimha/graphql-code-generator/commit/156cc2b9a2a5129beba121cfa987b04e29899431), [`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`b49457b`](https://github.com/dotansimha/graphql-code-generator/commit/b49457b5f29328d2dc23c642788a2e697cb8966e)]:\n  - @graphql-codegen/plugin-helpers@5.0.4\n  - @graphql-codegen/visitor-plugin-common@5.2.0\n\n## 4.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`920b443`](https://github.com/dotansimha/graphql-code-generator/commit/920b443a401b8cc4811f64ec5b25fc7b4ae32b53), [`ed9c205`](https://github.com/dotansimha/graphql-code-generator/commit/ed9c205d15d7f14ed73e54aecf40e4fad5664e9d)]:\n  - @graphql-codegen/visitor-plugin-common@5.1.0\n\n## 4.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`53f270a`](https://github.com/dotansimha/graphql-code-generator/commit/53f270acfa1da992e0f9d2e50921bb588392f8a5)]:\n  - @graphql-codegen/visitor-plugin-common@5.0.0\n\n## 4.0.4\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.2\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 4.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`7718a8113`](https://github.com/dotansimha/graphql-code-generator/commit/7718a8113dc6282475cb738f1e28698b8221fa2f)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.1\n\n## 4.0.2\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n  - @graphql-codegen/visitor-plugin-common@4.1.0\n\n## 4.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a)]:\n  - @graphql-codegen/visitor-plugin-common@4.0.1\n\n## 4.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Patch Changes\n\n- [#9449](https://github.com/dotansimha/graphql-code-generator/pull/9449) [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^10.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.0.0) (from `^9.0.0`, in `dependencies`)\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96), [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`50471e651`](https://github.com/dotansimha/graphql-code-generator/commit/50471e6514557db827cd26157262401c6c600a8c), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c), [`ca02ad172`](https://github.com/dotansimha/graphql-code-generator/commit/ca02ad172a0e8f52570fdef4271ec286d883236d), [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0), [`5950f5a68`](https://github.com/dotansimha/graphql-code-generator/commit/5950f5a6843cdd92b9d5b8ced3a97b68eadf9f30), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n  - @graphql-codegen/visitor-plugin-common@4.0.0\n\n## 3.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`386cf9044`](https://github.com/dotansimha/graphql-code-generator/commit/386cf9044a41d87ed45069b22d26b30f4b262a85), [`402cb8ac0`](https://github.com/dotansimha/graphql-code-generator/commit/402cb8ac0f0c347b186d295c4b69c19e25a65d00)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.1\n\n## 3.0.0\n\n### Major Changes\n\n- [#9137](https://github.com/dotansimha/graphql-code-generator/pull/9137) [`2256c8b5d`](https://github.com/dotansimha/graphql-code-generator/commit/2256c8b5d0e13057d35692bbeba3b7b8f94d8712) Thanks [@beerose](https://github.com/beerose)! - Add `TypedDocumentNode` string alternative that doesn't require GraphQL AST on the client. This change requires `@graphql-typed-document-node/core` in version `3.2.0` or higher.\n\n### Patch Changes\n\n- Updated dependencies [[`e56790104`](https://github.com/dotansimha/graphql-code-generator/commit/e56790104ae56d6c5b48ef71823345bd09d3b835), [`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29), [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087), [`acb647e4e`](https://github.com/dotansimha/graphql-code-generator/commit/acb647e4efbddecf732b6e55dc47ac40c9bdaf08), [`9f4d9c5a4`](https://github.com/dotansimha/graphql-code-generator/commit/9f4d9c5a479d34da25df8e060a8c2b3b162647dd)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.0\n  - @graphql-codegen/plugin-helpers@4.2.0\n\n## 2.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`ba0610bbd`](https://github.com/dotansimha/graphql-code-generator/commit/ba0610bbd4578d8a82078014766f56d8ae5fcf7a), [`4b49f6fbe`](https://github.com/dotansimha/graphql-code-generator/commit/4b49f6fbed802907b460bfb7b6e9a85f88c555bc), [`b343626c9`](https://github.com/dotansimha/graphql-code-generator/commit/b343626c978b9ee0f14e314cea6c01ae3dad057c)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.2\n\n## 2.0.1\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n\n- [#8995](https://github.com/dotansimha/graphql-code-generator/pull/8995) [`fe2e9c7a5`](https://github.com/dotansimha/graphql-code-generator/commit/fe2e9c7a5f2731e06dd285e391936608dfa3fb51) Thanks [@charpeni](https://github.com/charpeni)! - Use `gqlTagName` for generated examples\n\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n  - @graphql-codegen/visitor-plugin-common@3.0.1\n\n## 2.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.0\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 1.6.2\n\n### Patch Changes\n\n- Updated dependencies [[`a98198524`](https://github.com/dotansimha/graphql-code-generator/commit/a9819852443884b43de7c15040ccffc205f9177a)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.8\n\n## 1.6.1\n\n### Patch Changes\n\n- [#8796](https://github.com/dotansimha/graphql-code-generator/pull/8796) [`902451601`](https://github.com/dotansimha/graphql-code-generator/commit/902451601b5edf9cb7768e57f332fe6ade79c20a) Thanks [@shmax](https://github.com/shmax)! - remove extra asterisk and add missing semicolon in generated output\n\n## 1.6.0\n\n### Minor Changes\n\n- [#8763](https://github.com/dotansimha/graphql-code-generator/pull/8763) [`2a33fc774`](https://github.com/dotansimha/graphql-code-generator/commit/2a33fc7741f7a9532bef68606666d4e3db7785a3) Thanks [@ElvisUpUp](https://github.com/ElvisUpUp)! - change the client-preset generated template\n\n### Patch Changes\n\n- Updated dependencies [[`eb454d06c`](https://github.com/dotansimha/graphql-code-generator/commit/eb454d06c977f11f7d4a7b0b07eb80f8fd590560)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.7\n\n## 1.5.12\n\n### Patch Changes\n\n- [#8771](https://github.com/dotansimha/graphql-code-generator/pull/8771) [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/9.0.0) (from `^8.8.0`, in `dependencies`)\n- Updated dependencies [[`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`6c6b6f2df`](https://github.com/dotansimha/graphql-code-generator/commit/6c6b6f2df88a3a37b437a25320dab5590f033316)]:\n  - @graphql-codegen/plugin-helpers@3.1.2\n  - @graphql-codegen/visitor-plugin-common@2.13.6\n\n## 1.5.11\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81), [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n  - @graphql-codegen/visitor-plugin-common@2.13.5\n\n## 1.5.10\n\n### Patch Changes\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n  - @graphql-codegen/visitor-plugin-common@2.13.4\n\n## 1.5.9\n\n### Patch Changes\n\n- Updated dependencies [[`62f655452`](https://github.com/dotansimha/graphql-code-generator/commit/62f6554520955dd675e11c920f35ef9bf0aaeffe)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.3\n\n## 1.5.8\n\n### Patch Changes\n\n- [#8633](https://github.com/dotansimha/graphql-code-generator/pull/8633) [`00ddc9368`](https://github.com/dotansimha/graphql-code-generator/commit/00ddc9368211a4511b9f80d543d57c85fff840cb) Thanks [@jantimon](https://github.com/jantimon)! - provide jsdoc comments for better IDE support\n\n## 1.5.7\n\n### Patch Changes\n\n- Updated dependencies [[`ef4c2c9c2`](https://github.com/dotansimha/graphql-code-generator/commit/ef4c2c9c233c68830f10eb4c167c7cceead27122)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.2\n\n## 1.5.6\n\n### Patch Changes\n\n- Updated dependencies [[`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.1\n  - @graphql-codegen/plugin-helpers@2.7.2\n\n## 1.5.5\n\n### Patch Changes\n\n- Updated dependencies [[`a46b8d99c`](https://github.com/dotansimha/graphql-code-generator/commit/a46b8d99c797283d773ec14163c62be9c84d4c2b)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.0\n\n## 1.5.4\n\n### Patch Changes\n\n- Updated dependencies [[`1bd7f771c`](https://github.com/dotansimha/graphql-code-generator/commit/1bd7f771ccb949a5a37395c7c57cb41c19340714)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.2\n\n## 1.5.3\n\n### Patch Changes\n\n- [#8443](https://github.com/dotansimha/graphql-code-generator/pull/8443) [`e2d115146`](https://github.com/dotansimha/graphql-code-generator/commit/e2d11514695ca56674983e8b3b7549cd3b440a5d) Thanks [@charlypoly](https://github.com/charlypoly)! - fix(gql-tag-operations): issues with \"no documents\" scenario\n\n## 1.5.2\n\n### Patch Changes\n\n- [#8402](https://github.com/dotansimha/graphql-code-generator/pull/8402) [`a76c606e3`](https://github.com/dotansimha/graphql-code-generator/commit/a76c606e3b631ef903d4066e2643bc7f95457e30) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n  - Removed dependency [`graphql-tag@^2.0.0` ↗︎](https://www.npmjs.com/package/graphql-tag/v/2.0.0) (from `peerDependencies`)\n\n## 1.5.1\n\n### Patch Changes\n\n- [#8401](https://github.com/dotansimha/graphql-code-generator/pull/8401) [`4be3dc884`](https://github.com/dotansimha/graphql-code-generator/commit/4be3dc884bebe30e75b91560820d5604c816d9dd) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n\n  - Removed dependency [`graphql-tag@^2.0.0` ↗︎](https://www.npmjs.com/package/graphql-tag/v/2.0.0) (from `peerDependencies`)\n\n- [#8401](https://github.com/dotansimha/graphql-code-generator/pull/8401) [`4be3dc884`](https://github.com/dotansimha/graphql-code-generator/commit/4be3dc884bebe30e75b91560820d5604c816d9dd) Thanks [@charlypoly](https://github.com/charlypoly)! - Remove unused `graphql-tag` peer dependency\n\n## 1.5.0\n\n### Minor Changes\n\n- [#8302](https://github.com/dotansimha/graphql-code-generator/pull/8302) [`876844e76`](https://github.com/dotansimha/graphql-code-generator/commit/876844e7644a917172f09b3c4eb54a2f4c90e4c6) Thanks [@charlypoly](https://github.com/charlypoly)! - **`@graphql-codegen/gql-tag-operations` and `@graphql-codegen/gql-tag-operations-preset`**\n\n  Introduce a `gqlTagName` configuration option\n\n  ***\n\n  **`@graphql-codegen/client-preset`**\n\n  New preset for GraphQL Code Generator v3, more information on the RFC: https://github.com/dotansimha/graphql-code-generator/issues/8296\n\n  ***\n\n  **`@graphql-codegen/cli`**\n\n  Update init wizard with 3.0 recommendations (`codegen.ts`, `client` preset)\n\n## 1.4.1\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f), [`47d0a57e2`](https://github.com/dotansimha/graphql-code-generator/commit/47d0a57e27dd0d2334670bfc6c81c45e00ff4e74)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.1\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 1.4.0\n\n### Minor Changes\n\n- 2cbcbb371: Add new flag to emit legacy common js imports. Default it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\n\n  You can use the option in your config:\n\n  ```yaml\n  schema: 'schema.graphql'\n   documents:\n     - 'src/**/*.graphql'\n   emitLegacyCommonJSImports: true\n  ```\n\n  Alternative you can use the CLI to set this option:\n\n  ```bash\n  $ codegen --config-file=config.yml --emit-legacy-common-js-imports\n  ```\n\n### Patch Changes\n\n- Updated dependencies [2cbcbb371]\n  - @graphql-codegen/visitor-plugin-common@2.12.0\n  - @graphql-codegen/plugin-helpers@2.6.0\n\n## 1.3.1\n\n### Patch Changes\n\n- 525ad580b: Revert breaking change for Next.js applications that are incapable of resolving an import with a `.js` extension.\n- Updated dependencies [525ad580b]\n  - @graphql-codegen/visitor-plugin-common@2.11.1\n\n## 1.3.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [68bb30e19]\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/visitor-plugin-common@2.11.0\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 1.2.17\n\n### Patch Changes\n\n- Updated dependencies [aa1e6eafd]\n- Updated dependencies [a42fcbfe4]\n- Updated dependencies [8b10f22be]\n  - @graphql-codegen/visitor-plugin-common@2.10.0\n\n## 1.2.16\n\n### Patch Changes\n\n- Updated dependencies [d16bebacb]\n  - @graphql-codegen/visitor-plugin-common@2.9.1\n\n## 1.2.15\n\n### Patch Changes\n\n- Updated dependencies [c3d7b7226]\n  - @graphql-codegen/visitor-plugin-common@2.9.0\n\n## 1.2.14\n\n### Patch Changes\n\n- Updated dependencies [f1fb77bd4]\n  - @graphql-codegen/visitor-plugin-common@2.8.0\n\n## 1.2.13\n\n### Patch Changes\n\n- Updated dependencies [9a5f31cb6]\n  - @graphql-codegen/visitor-plugin-common@2.7.6\n\n## 1.2.12\n\n### Patch Changes\n\n- Updated dependencies [2966686e9]\n  - @graphql-codegen/visitor-plugin-common@2.7.5\n\n## 1.2.11\n\n### Patch Changes\n\n- Updated dependencies [337fd4f77]\n  - @graphql-codegen/visitor-plugin-common@2.7.4\n\n## 1.2.10\n\n### Patch Changes\n\n- Updated dependencies [54718c039]\n  - @graphql-codegen/visitor-plugin-common@2.7.3\n\n## 1.2.9\n\n### Patch Changes\n\n- Updated dependencies [11d05e361]\n  - @graphql-codegen/visitor-plugin-common@2.7.2\n\n## 1.2.8\n\n### Patch Changes\n\n- Updated dependencies [fd55e2039]\n  - @graphql-codegen/visitor-plugin-common@2.7.1\n\n## 1.2.7\n\n### Patch Changes\n\n- Updated dependencies [1479233df]\n  - @graphql-codegen/visitor-plugin-common@2.7.0\n\n## 1.2.6\n\n### Patch Changes\n\n- Updated dependencies [c8ef37ae0]\n- Updated dependencies [754a33715]\n- Updated dependencies [bef4376d5]\n- Updated dependencies [be7cb3a82]\n  - @graphql-codegen/visitor-plugin-common@2.6.0\n  - @graphql-codegen/plugin-helpers@2.4.0\n\n## 1.2.5\n\n### Patch Changes\n\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/visitor-plugin-common@2.5.2\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 1.2.4\n\n### Patch Changes\n\n- Updated dependencies [a9f1f1594]\n- Updated dependencies [9ea6621ec]\n  - @graphql-codegen/visitor-plugin-common@2.5.1\n\n## 1.2.3\n\n### Patch Changes\n\n- Updated dependencies [97ddb487a]\n  - @graphql-codegen/visitor-plugin-common@2.5.0\n  - @graphql-codegen/plugin-helpers@2.3.0\n\n## 1.2.2\n\n### Patch Changes\n\n- Updated dependencies [ad02cb9b8]\n  - @graphql-codegen/visitor-plugin-common@2.4.0\n\n## 1.2.1\n\n### Patch Changes\n\n- Updated dependencies [b9e85adae]\n- Updated dependencies [7c60e5acc]\n- Updated dependencies [3c2c847be]\n  - @graphql-codegen/visitor-plugin-common@2.3.0\n  - @graphql-codegen/plugin-helpers@2.2.0\n\n## 1.2.0\n\n### Minor Changes\n\n- 1e9a7e162: feat: support module augumentation for extending the types of gql functions from existing packages via the `augmentedModuleName` config option.\n\n## 1.1.5\n\n### Patch Changes\n\n- 06dfd3958: fix: follow \"useTypeImports\" configuration\n- 5394f19bb: prevent duplicate operations\n\n## 1.1.4\n\n### Patch Changes\n\n- Updated dependencies [0b090e31a]\n  - @graphql-codegen/visitor-plugin-common@2.2.1\n\n## 1.1.3\n\n### Patch Changes\n\n- Updated dependencies [d6c2d4c09]\n- Updated dependencies [feeae1c66]\n- Updated dependencies [5086791ac]\n  - @graphql-codegen/visitor-plugin-common@2.2.0\n\n## 1.1.2\n\n### Patch Changes\n\n- Updated dependencies [6470e6cc9]\n- Updated dependencies [263570e50]\n- Updated dependencies [35199dedf]\n  - @graphql-codegen/visitor-plugin-common@2.1.2\n  - @graphql-codegen/plugin-helpers@2.1.1\n\n## 1.1.1\n\n### Patch Changes\n\n- Updated dependencies [aabeff181]\n  - @graphql-codegen/visitor-plugin-common@2.1.1\n\n## 1.1.0\n\n### Minor Changes\n\n- 0c0c8a92b: export new utility type `DocumentType`, for accessing the document node type.\n\n  ```tsx\n  import { gql, DocumentType } from '../gql'\n\n  const TweetFragment = gql(/* GraphQL */ `\n    fragment TweetFragment on Tweet {\n      id\n      body\n    }\n  `)\n\n  const Tweet = (props: { tweet: DocumentType<typeof TweetFragment> }) => {\n    return <div data-id={props.id}>{props.body}</div>\n  }\n  ```\n\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- 24185985a: bump graphql-tools package versions\n- Updated dependencies [290170262]\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/visitor-plugin-common@2.1.0\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 1.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Minor Changes\n\n- b0cb13df4: new plugin/preset gql-tag-operations\n\n### Patch Changes\n\n- Updated dependencies [d80efdec4]\n- Updated dependencies [d80efdec4]\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/visitor-plugin-common@2.0.0\n  - @graphql-codegen/plugin-helpers@2.0.0\n"
  },
  {
    "path": "packages/plugins/typescript/gql-tag-operations/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/gql-tag-operations\",\n  \"version\": \"5.1.4\",\n  \"description\": \"GraphQL Code Generator plugin for generating a typed gql tag function\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/plugins/typescript/gql-tag-operations\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"dependencies\": {\n    \"@graphql-tools/utils\": \"^11.0.0\",\n    \"@graphql-codegen/plugin-helpers\": \"^6.1.1\",\n    \"@graphql-codegen/visitor-plugin-common\": \"^6.2.4\",\n    \"auto-bind\": \"~4.0.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/gql-tag-operations/src/index.ts",
    "content": "import { normalizeImportExtension, PluginFunction } from '@graphql-codegen/plugin-helpers';\nimport { DocumentMode } from '@graphql-codegen/visitor-plugin-common';\nimport { Source } from '@graphql-tools/utils';\nimport { FragmentDefinitionNode, OperationDefinitionNode } from 'graphql';\n\nexport type OperationOrFragment = {\n  initialName: string;\n  definition: OperationDefinitionNode | FragmentDefinitionNode;\n};\n\nexport type SourceWithOperations = {\n  source: Source;\n  operations: Array<OperationOrFragment>;\n};\n\nconst documentTypePartial = `\nexport type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<\n  infer TType,\n  any\n>\n  ? TType\n  : never;\n`.split(`\\n`);\n\nexport const plugin: PluginFunction<{\n  sourcesWithOperations: Array<SourceWithOperations>;\n  useTypeImports?: boolean;\n  augmentedModuleName?: string;\n  gqlTagName?: string;\n  emitLegacyCommonJSImports?: boolean;\n  importExtension?: '' | `.${string}`;\n  documentMode?: DocumentMode;\n}> = (\n  _,\n  __,\n  {\n    sourcesWithOperations,\n    useTypeImports,\n    augmentedModuleName,\n    gqlTagName = 'gql',\n    emitLegacyCommonJSImports,\n    importExtension,\n    documentMode,\n  },\n  _info\n) => {\n  const appendedImportExtension = normalizeImportExtension({\n    emitLegacyCommonJSImports,\n    importExtension,\n  });\n  if (documentMode === DocumentMode.string) {\n    const code = [`import * as types from './graphql${appendedImportExtension}';\\n`, `\\n`];\n\n    // We need the mapping from source as written to full document source to\n    // handle fragments. An identity function would not suffice.\n    if (sourcesWithOperations.length > 0) {\n      code.push([...getDocumentRegistryChunk(sourcesWithOperations)].join(''));\n    } else {\n      code.push('const documents = {}');\n    }\n\n    if (sourcesWithOperations.length > 0) {\n      code.push(\n        [...getGqlOverloadChunk(sourcesWithOperations, gqlTagName, 'augmented', appendedImportExtension), `\\n`].join('')\n      );\n    }\n\n    code.push(\n      [`export function ${gqlTagName}(source: string) {\\n`, `  return (documents as any)[source] ?? {};\\n`, `}\\n`].join(\n        ''\n      )\n    );\n\n    return code.join('\\n');\n  }\n\n  if (augmentedModuleName == null) {\n    const code = [\n      `import * as types from './graphql${appendedImportExtension}';\\n`,\n      `${\n        useTypeImports ? 'import type' : 'import'\n      } { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\\n`,\n      `\\n`,\n    ];\n\n    if (sourcesWithOperations.length > 0) {\n      code.push([...getDocumentRegistryChunk(sourcesWithOperations)].join(''));\n    } else {\n      code.push('const documents = {};');\n    }\n\n    code.push(\n      [\n        `\\n`,\n        `/**\\n * The ${gqlTagName} function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\\n *\\n`,\n        ` *\\n * @example\\n`,\n        ' * ```ts\\n',\n        ` * const query = ${gqlTagName}` + '(`query GetUser($id: ID!) { user(id: $id) { name } }`);\\n',\n        ' * ```\\n *\\n',\n        ` * The query argument is unknown!\\n`,\n        ` * Please regenerate the types.\\n`,\n        ` */\\n`,\n        `export function ${gqlTagName}(source: string): unknown;\\n`,\n        `\\n`,\n      ].join('')\n    );\n\n    if (sourcesWithOperations.length > 0) {\n      code.push(\n        [...getGqlOverloadChunk(sourcesWithOperations, gqlTagName, 'lookup', appendedImportExtension), `\\n`].join('')\n      );\n    }\n\n    code.push(\n      [\n        `export function ${gqlTagName}(source: string) {\\n`,\n        `  return (documents as any)[source] ?? {};\\n`,\n        `}\\n`,\n        `\\n`,\n        ...documentTypePartial,\n      ].join('')\n    );\n\n    return code.join('');\n  }\n\n  return [\n    `import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\\n`,\n    `declare module \"${augmentedModuleName}\" {`,\n    [\n      `\\n`,\n      ...(sourcesWithOperations.length > 0\n        ? getGqlOverloadChunk(sourcesWithOperations, gqlTagName, 'augmented', appendedImportExtension)\n        : []),\n      `export function ${gqlTagName}(source: string): unknown;\\n`,\n      `\\n`,\n      ...documentTypePartial,\n    ]\n      .map(line => (line === `\\n` ? line : `  ${line}`))\n      .join(``),\n    `}`,\n  ].join(`\\n`);\n};\n\nfunction getDocumentRegistryChunk(sourcesWithOperations: Array<SourceWithOperations> = []) {\n  const lines = new Array<string>();\n  // It's possible for there to be duplicate sourceOperations, this set will ensure we have unique records for our document registry\n  const linesDupCheck = new Set<string>();\n  lines.push(\n    `/**\\n * Map of all GraphQL operations in the project.\\n *\\n * This map has several performance disadvantages:\\n`,\n    ` * 1. It is not tree-shakeable, so it will include all operations in the project.\\n`,\n    ` * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\\n`,\n    ` * 3. It does not support dead code elimination, so it will add unused operations.\\n *\\n`,\n    ` * Therefore it is highly recommended to use the babel or swc plugin for production.\\n`,\n    ` * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\\n */\\n`,\n    `type Documents = {\\n`\n  );\n  for (const { operations, ...rest } of sourcesWithOperations) {\n    const originalString = rest.source.rawSDL;\n    const operation = operations[0];\n    const aboutToPushLine = `    ${JSON.stringify(originalString)}: typeof types.${operation.initialName},\\n`;\n    if (!linesDupCheck.has(aboutToPushLine)) {\n      lines.push(aboutToPushLine);\n      linesDupCheck.add(aboutToPushLine);\n    }\n  }\n  lines.push(`};\\n`, `const documents: Documents = {\\n`);\n  for (const { operations, ...rest } of sourcesWithOperations) {\n    const originalString = rest.source.rawSDL!;\n    const operation = operations[0];\n    const aboutToPushLine = `    ${JSON.stringify(originalString)}: types.${operation.initialName},\\n`;\n    if (!linesDupCheck.has(aboutToPushLine)) {\n      lines.push(aboutToPushLine);\n      linesDupCheck.add(aboutToPushLine);\n    }\n  }\n\n  lines.push(`};\\n`);\n\n  return lines;\n}\n\ntype Mode = 'lookup' | 'augmented';\n\nfunction getGqlOverloadChunk(\n  sourcesWithOperations: Array<SourceWithOperations>,\n  gqlTagName: string,\n  mode: Mode,\n  importExtension: '' | `.${string}`\n) {\n  const lines = new Set<string>();\n\n  // We intentionally don't use a <T extends keyof typeof documents> generic, because TS\n  // would print very long `gql` function signatures (duplicating the source).\n  for (const { operations, ...rest } of sourcesWithOperations) {\n    const originalString = rest.source.rawSDL!;\n    const returnType =\n      mode === 'lookup'\n        ? `(typeof documents)[${JSON.stringify(originalString)}]`\n        : `typeof import('./graphql${importExtension}').${operations[0].initialName}`;\n    lines.add(\n      `/**\\n * The ${gqlTagName} function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\\n */\\n` +\n        `export function ${gqlTagName}(source: ${JSON.stringify(originalString)}): ${returnType};\\n`\n    );\n  }\n\n  return lines;\n}\n"
  },
  {
    "path": "packages/plugins/typescript/gql-tag-operations/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'gql-tag-operations',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/plugins/typescript/operations/CHANGELOG.md",
    "content": "# @graphql-codegen/typescript-operations\n\n## 5.0.9\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-codegen/visitor-plugin-common@^6.2.3` ↗︎](https://www.npmjs.com/package/@graphql-codegen/visitor-plugin-common/v/6.2.3) (from `6.2.3`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/plugin-helpers@6.1.1\n  - @graphql-codegen/typescript@5.0.9\n  - @graphql-codegen/visitor-plugin-common@6.2.4\n\n## 5.0.8\n\n### Patch Changes\n\n- [#10580](https://github.com/dotansimha/graphql-code-generator/pull/10580) [`6038634`](https://github.com/dotansimha/graphql-code-generator/commit/60386344081917f2884db933309821603a2be2bf) Thanks [@Georgegriff](https://github.com/Georgegriff)! - fixed invalid extracted concrete type name on shared interface\n\n- Updated dependencies [[`6038634`](https://github.com/dotansimha/graphql-code-generator/commit/60386344081917f2884db933309821603a2be2bf)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.3\n  - @graphql-codegen/typescript@5.0.8\n\n## 5.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`f588d91`](https://github.com/dotansimha/graphql-code-generator/commit/f588d91ac43ea0aa5931915ce980d2e6876bb59c)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.2\n  - @graphql-codegen/typescript@5.0.7\n\n## 5.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`b995ed1`](https://github.com/dotansimha/graphql-code-generator/commit/b995ed13a49379ea05e0e313fac68b557527523a)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.1\n  - @graphql-codegen/typescript@5.0.6\n\n## 5.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`f821e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f821e8ab9351f23a9f7e5d5e6fc69c8e8868cad8), [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.0\n  - @graphql-codegen/plugin-helpers@6.1.0\n  - @graphql-codegen/typescript@5.0.5\n\n## 5.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`51a1a72`](https://github.com/dotansimha/graphql-code-generator/commit/51a1a7280578d43681391df11d320a8416c0b41d)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.2\n  - @graphql-codegen/typescript@5.0.4\n\n## 5.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`6715330`](https://github.com/dotansimha/graphql-code-generator/commit/67153304646694d75aee24afd70c3fce12e9f1f2)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.1\n  - @graphql-codegen/typescript@5.0.3\n\n## 5.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`8258f1f`](https://github.com/dotansimha/graphql-code-generator/commit/8258f1f6012c106d02ef28bca9ec424f70c4aa26)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.0\n  - @graphql-codegen/typescript@5.0.2\n\n## 5.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`accdab6`](https://github.com/dotansimha/graphql-code-generator/commit/accdab69106605241933e9d66d64dc7077656f30)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.1\n  - @graphql-codegen/typescript@5.0.1\n\n## 5.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - BREAKING CHANGE: Use Record<PropertyKey, never> instead of {} for empty object type\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.0\n  - @graphql-codegen/plugin-helpers@6.0.0\n  - @graphql-codegen/typescript@5.0.0\n\n## 4.6.1\n\n### Patch Changes\n\n- [#10330](https://github.com/dotansimha/graphql-code-generator/pull/10330) [`c5efba3`](https://github.com/dotansimha/graphql-code-generator/commit/c5efba34a7b422720be9ce32937dd19fb0784bae) Thanks [@jnoordsij](https://github.com/jnoordsij)! - Make graphql-sock optional peerDep\n\n## 4.6.0\n\n### Minor Changes\n\n- [#10323](https://github.com/dotansimha/graphql-code-generator/pull/10323) [`f3cf4df`](https://github.com/dotansimha/graphql-code-generator/commit/f3cf4df358a896c5df0a7d8909c2fbf192e10c01) Thanks [@eddeee888](https://github.com/eddeee888)! - Add support for `nullability.errorHandlingClient`. This allows clients to get stronger types with [semantic nullability](https://github.com/graphql/graphql-wg/blob/main/rfcs/SemanticNullability.md)-enabled schemas.\n\n### Patch Changes\n\n- Updated dependencies [[`f6909d1`](https://github.com/dotansimha/graphql-code-generator/commit/f6909d1797c15b79a0afb7ec089471763a485bfc)]:\n  - @graphql-codegen/visitor-plugin-common@5.8.0\n  - @graphql-codegen/typescript@4.1.6\n\n## 4.5.1\n\n### Patch Changes\n\n- [#10302](https://github.com/dotansimha/graphql-code-generator/pull/10302) [`d8566c0`](https://github.com/dotansimha/graphql-code-generator/commit/d8566c015943ea4dbcaeaf57d3d8406553ae230a) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix Apollo unmask directive incorrectly generating fragmentRefs\n\n- Updated dependencies [[`d8566c0`](https://github.com/dotansimha/graphql-code-generator/commit/d8566c015943ea4dbcaeaf57d3d8406553ae230a)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.1\n  - @graphql-codegen/typescript@4.1.5\n\n## 4.5.0\n\n### Minor Changes\n\n- [#10270](https://github.com/dotansimha/graphql-code-generator/pull/10270) [`6d7c1d7`](https://github.com/dotansimha/graphql-code-generator/commit/6d7c1d7c0a4662acdc0efafd4234229ad0a8dd3c) Thanks [@adapap](https://github.com/adapap)! - feat: implement `includeExternalFragments: boolean` option\n\n### Patch Changes\n\n- Updated dependencies [[`6d7c1d7`](https://github.com/dotansimha/graphql-code-generator/commit/6d7c1d7c0a4662acdc0efafd4234229ad0a8dd3c)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.0\n  - @graphql-codegen/typescript@4.1.4\n\n## 4.4.1\n\n### Patch Changes\n\n- Updated dependencies [[`60dd72f`](https://github.com/dotansimha/graphql-code-generator/commit/60dd72fb103fd7fd70b4e1def98da29588865517)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.1\n  - @graphql-codegen/typescript@4.1.3\n\n## 4.4.0\n\n### Minor Changes\n\n- [#10163](https://github.com/dotansimha/graphql-code-generator/pull/10163) [`fa64fbf`](https://github.com/dotansimha/graphql-code-generator/commit/fa64fbf8a44e1cee7ae17806dcd178dc7350c4ba) Thanks [@jerelmiller](https://github.com/jerelmiller)! - Add support for Apollo Client `@unmask` directive with fragment masking.\n\n### Patch Changes\n\n- Updated dependencies [[`1617e3c`](https://github.com/dotansimha/graphql-code-generator/commit/1617e3cf38f3059cc5ea88b540033f521f03725a), [`fa64fbf`](https://github.com/dotansimha/graphql-code-generator/commit/fa64fbf8a44e1cee7ae17806dcd178dc7350c4ba)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.0\n  - @graphql-codegen/typescript@4.1.2\n\n## 4.3.1\n\n### Patch Changes\n\n- Updated dependencies [[`55a1e9e`](https://github.com/dotansimha/graphql-code-generator/commit/55a1e9e63830df17ed40602ea7e322bbf48b17bc), [`a235051`](https://github.com/dotansimha/graphql-code-generator/commit/a23505180ac2f275a55ece27162ec9bfcdc52e03)]:\n  - @graphql-codegen/visitor-plugin-common@5.5.0\n  - @graphql-codegen/plugin-helpers@5.1.0\n  - @graphql-codegen/typescript@4.1.1\n\n## 4.3.0\n\n### Minor Changes\n\n- [#10077](https://github.com/dotansimha/graphql-code-generator/pull/10077) [`3f4f546`](https://github.com/dotansimha/graphql-code-generator/commit/3f4f5466ff168ad822b9a00d83d3779078e6d8c4) Thanks [@eddeee888](https://github.com/eddeee888)! - Extend `config.avoidOptions` to support query, mutation and subscription\n\n  Previously, `config.avoidOptions.resolvers` was being used to make query, mutation and subscription fields non-optional.\n  Now, `config.avoidOptions.query`, `config.avoidOptions.mutation` and `config.avoidOptions.subscription` can be used to target the respective types.\n\n### Patch Changes\n\n- Updated dependencies [[`3f4f546`](https://github.com/dotansimha/graphql-code-generator/commit/3f4f5466ff168ad822b9a00d83d3779078e6d8c4)]:\n  - @graphql-codegen/visitor-plugin-common@5.4.0\n  - @graphql-codegen/typescript@4.1.0\n\n## 4.2.3\n\n### Patch Changes\n\n- Updated dependencies [[`79fee3c`](https://github.com/dotansimha/graphql-code-generator/commit/79fee3cada20d683d250aad5aa5fef9d6ed9f4d2)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.1\n  - @graphql-codegen/typescript@4.0.9\n\n## 4.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`808ada5`](https://github.com/dotansimha/graphql-code-generator/commit/808ada595d83d39cad045da5824cac6378e9eca3), [`14ce39e`](https://github.com/dotansimha/graphql-code-generator/commit/14ce39e41dfee38c652be736664177fa2b1df421)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.0\n  - @graphql-codegen/typescript@4.0.8\n\n## 4.2.1\n\n### Patch Changes\n\n- Updated dependencies [[`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`156cc2b`](https://github.com/dotansimha/graphql-code-generator/commit/156cc2b9a2a5129beba121cfa987b04e29899431), [`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`b49457b`](https://github.com/dotansimha/graphql-code-generator/commit/b49457b5f29328d2dc23c642788a2e697cb8966e)]:\n  - @graphql-codegen/plugin-helpers@5.0.4\n  - @graphql-codegen/visitor-plugin-common@5.2.0\n  - @graphql-codegen/typescript@4.0.7\n\n## 4.2.0\n\n### Minor Changes\n\n- [#9652](https://github.com/dotansimha/graphql-code-generator/pull/9652) [`920b443`](https://github.com/dotansimha/graphql-code-generator/commit/920b443a401b8cc4811f64ec5b25fc7b4ae32b53) Thanks [@gmurphey](https://github.com/gmurphey)! - Added allowUndefinedQueryVariables as config option\n\n### Patch Changes\n\n- [#9842](https://github.com/dotansimha/graphql-code-generator/pull/9842) [`ed9c205`](https://github.com/dotansimha/graphql-code-generator/commit/ed9c205d15d7f14ed73e54aecf40e4fad5664e9d) Thanks [@henryqdineen](https://github.com/henryqdineen)! - properly handle aliased conditionals\n\n- Updated dependencies [[`920b443`](https://github.com/dotansimha/graphql-code-generator/commit/920b443a401b8cc4811f64ec5b25fc7b4ae32b53), [`ed9c205`](https://github.com/dotansimha/graphql-code-generator/commit/ed9c205d15d7f14ed73e54aecf40e4fad5664e9d)]:\n  - @graphql-codegen/visitor-plugin-common@5.1.0\n  - @graphql-codegen/typescript@4.0.6\n\n## 4.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`53f270a`](https://github.com/dotansimha/graphql-code-generator/commit/53f270acfa1da992e0f9d2e50921bb588392f8a5)]:\n  - @graphql-codegen/visitor-plugin-common@5.0.0\n  - @graphql-codegen/typescript@4.0.5\n\n## 4.1.2\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.2\n  - @graphql-codegen/typescript@4.0.4\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 4.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`7718a8113`](https://github.com/dotansimha/graphql-code-generator/commit/7718a8113dc6282475cb738f1e28698b8221fa2f)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.1\n  - @graphql-codegen/typescript@4.0.3\n\n## 4.1.0\n\n### Minor Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - fix: out-of-memory crash (fixes #7720)\n  perf: implement a caching mechanism that makes sure the type originating at the same location is never generated twice, as long as the combination of selected fields and possible types matches\n  feat: implement `extractAllFieldsToTypes: boolean`\n  feat: implement `printFieldsOnNewLines: boolean`\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n  - @graphql-codegen/typescript@4.0.2\n  - @graphql-codegen/visitor-plugin-common@4.1.0\n\n## 4.0.1\n\n### Patch Changes\n\n- [#9497](https://github.com/dotansimha/graphql-code-generator/pull/9497) [`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a) Thanks [@eddeee888](https://github.com/eddeee888)! - Revert default ID scalar input type to string\n\n  We changed the ID Scalar input type from `string` to `string | number` in the latest major version of `typescript` plugin. This causes issues for server plugins (e.g. typescript-resolvers) that depends on `typescript` plugin. This is because the scalar type needs to be manually inverted on setup which is confusing.\n\n- Updated dependencies [[`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a)]:\n  - @graphql-codegen/visitor-plugin-common@4.0.1\n  - @graphql-codegen/typescript@4.0.1\n\n## 4.0.0\n\n### Major Changes\n\n- [#9375](https://github.com/dotansimha/graphql-code-generator/pull/9375) [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929) Thanks [@eddeee888](https://github.com/eddeee888)! - Implement Scalars with input/output types\n\n  In GraphQL, Scalar types can be different for client and server. For example, given the native GraphQL ID:\n\n  - A client may send `string` or `number` in the input\n  - A client receives `string` in its selection set (i.e output)\n  - A server receives `string` in the resolver (GraphQL parses `string` or `number` received from the client to `string`)\n  - A server may return `string` or `number` (GraphQL serializes the value to `string` before sending it to the client )\n\n  Currently, we represent every Scalar with only one type. This is what codegen generates as base type:\n\n  ```ts\n  export type Scalars = {\n    ID: string\n  }\n  ```\n\n  Then, this is used in both input and output type e.g.\n\n  ```ts\n  export type Book = {\n    __typename?: 'Book'\n    id: Scalars['ID'] // Output's ID can be `string` 👍\n  }\n\n  export type QueryBookArgs = {\n    id: Scalars['ID'] // Input's ID can be `string` or `number`. However, the type is only `string` here 👎\n  }\n  ```\n\n  This PR extends each Scalar to have input and output:\n\n  ```ts\n  export type Scalars = {\n    ID: {\n      input: string | number\n      output: string\n    }\n  }\n  ```\n\n  Then, each input/output GraphQL type can correctly refer to the correct input/output scalar type:\n\n  ```ts\n  export type Book = {\n    __typename?: 'Book'\n    id: Scalars['ID']['output'] // Output's ID can be `string` 👍\n  }\n\n  export type QueryBookArgs = {\n    id: Scalars['ID']['input'] // Input's ID can be `string` or `number` 👍\n  }\n  ```\n\n  Note that for `typescript-resolvers`, the type of ID needs to be inverted. However, the referenced types in GraphQL input/output types should still work correctly:\n\n  ```ts\n  export type Scalars = {\n    ID: {\n      input: string;\n      output: string | number;\n    }\n  }\n\n  export type Book = {\n    __typename?: \"Book\";\n    id: Scalars[\"ID\"]['output']; // Resolvers can return `string` or `number` in ID fields 👍\n  };\n\n  export type QueryBookArgs = {\n    id: Scalars[\"ID\"]['input']; // Resolvers receive `string` in ID fields 👍\n  };\n\n  export type ResolversTypes = {\n    ID: ID: ResolverTypeWrapper<Scalars['ID']['output']>; // Resolvers can return `string` or `number` in ID fields 👍\n  }\n\n  export type ResolversParentTypes = {\n    ID: Scalars['ID']['output']; // Resolvers receive `string` or `number` from parents 👍\n  };\n  ```\n\n  ***\n\n  Config changes:\n\n  1. Scalars option can now take input/output types:\n\n  ```ts\n  config: {\n    scalars: {\n      ID: {\n        input: 'string',\n        output: 'string | number'\n      }\n    }\n  }\n  ```\n\n  2. If a string is given (instead of an object with input/output fields), it will be used as both input and output types:\n\n  ```ts\n  config: {\n    scalars: {\n      ID: 'string' // This means `string` will be used for both ID's input and output types\n    }\n  }\n  ```\n\n  3. BREAKING CHANGE: External module Scalar types need to be an object with input/output fields\n\n  ```ts\n  config: {\n    scalars: {\n      ID: './path/to/scalar-module'\n    }\n  }\n  ```\n\n  If correctly, wired up, the following will be generated:\n\n  ```ts\n  // Previously, imported `ID` type can be a primitive type, now it must be an object with input/output fields\n  import { ID } from './path/to/scalar-module'\n\n  export type Scalars = {\n    ID: { input: ID['input']; output: ID['output'] }\n  }\n  ```\n\n  ***\n\n  BREAKING CHANGE: This changes Scalar types which could be referenced in other plugins. If you are a plugin maintainer and reference Scalar, please update your plugin to use the correct input/output types.\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Minor Changes\n\n- [#9196](https://github.com/dotansimha/graphql-code-generator/pull/9196) [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96) Thanks [@beerose](https://github.com/beerose)! - Add `@defer` directive support\n\n  When a query includes a deferred fragment field, the server will return a partial response with the non-deferred fields first, followed by the remaining fields once they have been resolved.\n\n  Once start using the `@defer` directive in your queries, the generated code will automatically include support for the directive.\n\n  ```jsx\n  // src/index.tsx\n  import { graphql } from './gql'\n  const OrdersFragment = graphql(`\n    fragment OrdersFragment on User {\n      orders {\n        id\n        total\n      }\n    }\n  `)\n  const GetUserQuery = graphql(`\n    query GetUser($id: ID!) {\n      user(id: $id) {\n        id\n        name\n        ...OrdersFragment @defer\n      }\n    }\n  `)\n  ```\n\n  The generated type for `GetUserQuery` will have information that the fragment is _incremental,_ meaning it may not be available right away.\n\n  ```tsx\n  // gql/graphql.ts\n  export type GetUserQuery = { __typename?: 'Query'; id: string; name: string } & ({\n    __typename?: 'Query'\n  } & {\n    ' $fragmentRefs'?: { OrdersFragment: Incremental<OrdersFragment> }\n  })\n  ```\n\n  Apart from generating code that includes support for the `@defer` directive, the Codegen also exports a utility function called `isFragmentReady`. You can use it to conditionally render components based on whether the data for a deferred\n  fragment is available:\n\n  ```jsx\n  const OrdersList = (props: { data: FragmentType<typeof OrdersFragment> }) => {\n    const data = useFragment(OrdersFragment, props.data);\n    return (\n      // render orders list\n    )\n  };\n\n  function App() {\n    const { data } = useQuery(GetUserQuery);\n    return (\n      {data && (\n        <>\n          {isFragmentReady(GetUserQuery, OrdersFragment, data)\n  \t\t\t\t\t&& <OrdersList data={data} />}\n        </>\n      )}\n    );\n  }\n  export default App;\n  ```\n\n- [#9304](https://github.com/dotansimha/graphql-code-generator/pull/9304) [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823) Thanks [@esfomeado](https://github.com/esfomeado)! - Added support for disabling suffixes on Enums.\n\n### Patch Changes\n\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96), [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`50471e651`](https://github.com/dotansimha/graphql-code-generator/commit/50471e6514557db827cd26157262401c6c600a8c), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c), [`ca02ad172`](https://github.com/dotansimha/graphql-code-generator/commit/ca02ad172a0e8f52570fdef4271ec286d883236d), [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0), [`5950f5a68`](https://github.com/dotansimha/graphql-code-generator/commit/5950f5a6843cdd92b9d5b8ced3a97b68eadf9f30), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n  - @graphql-codegen/visitor-plugin-common@4.0.0\n  - @graphql-codegen/typescript@4.0.0\n\n## 3.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`386cf9044`](https://github.com/dotansimha/graphql-code-generator/commit/386cf9044a41d87ed45069b22d26b30f4b262a85), [`402cb8ac0`](https://github.com/dotansimha/graphql-code-generator/commit/402cb8ac0f0c347b186d295c4b69c19e25a65d00)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.1\n  - @graphql-codegen/typescript@3.0.4\n\n## 3.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`e56790104`](https://github.com/dotansimha/graphql-code-generator/commit/e56790104ae56d6c5b48ef71823345bd09d3b835), [`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29), [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087), [`92d86b009`](https://github.com/dotansimha/graphql-code-generator/commit/92d86b009579edf70f60b0b8e28658af93ff9fd1), [`acb647e4e`](https://github.com/dotansimha/graphql-code-generator/commit/acb647e4efbddecf732b6e55dc47ac40c9bdaf08), [`9f4d9c5a4`](https://github.com/dotansimha/graphql-code-generator/commit/9f4d9c5a479d34da25df8e060a8c2b3b162647dd)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.0\n  - @graphql-codegen/plugin-helpers@4.2.0\n  - @graphql-codegen/typescript@3.0.3\n\n## 3.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`ba0610bbd`](https://github.com/dotansimha/graphql-code-generator/commit/ba0610bbd4578d8a82078014766f56d8ae5fcf7a), [`4b49f6fbe`](https://github.com/dotansimha/graphql-code-generator/commit/4b49f6fbed802907b460bfb7b6e9a85f88c555bc), [`b343626c9`](https://github.com/dotansimha/graphql-code-generator/commit/b343626c978b9ee0f14e314cea6c01ae3dad057c)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.2\n  - @graphql-codegen/typescript@3.0.2\n\n## 3.0.1\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n  - @graphql-codegen/typescript@3.0.1\n  - @graphql-codegen/visitor-plugin-common@3.0.1\n\n## 3.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.0\n  - @graphql-codegen/plugin-helpers@4.0.0\n  - @graphql-codegen/typescript@3.0.0\n\n## 2.5.13\n\n### Patch Changes\n\n- Updated dependencies [[`a98198524`](https://github.com/dotansimha/graphql-code-generator/commit/a9819852443884b43de7c15040ccffc205f9177a)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.8\n  - @graphql-codegen/typescript@2.8.8\n\n## 2.5.12\n\n### Patch Changes\n\n- Updated dependencies [[`eb454d06c`](https://github.com/dotansimha/graphql-code-generator/commit/eb454d06c977f11f7d4a7b0b07eb80f8fd590560)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.7\n  - @graphql-codegen/typescript@2.8.7\n\n## 2.5.11\n\n### Patch Changes\n\n- Updated dependencies [[`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`6c6b6f2df`](https://github.com/dotansimha/graphql-code-generator/commit/6c6b6f2df88a3a37b437a25320dab5590f033316)]:\n  - @graphql-codegen/plugin-helpers@3.1.2\n  - @graphql-codegen/visitor-plugin-common@2.13.6\n  - @graphql-codegen/typescript@2.8.6\n\n## 2.5.10\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81), [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n  - @graphql-codegen/visitor-plugin-common@2.13.5\n  - @graphql-codegen/typescript@2.8.5\n\n## 2.5.9\n\n### Patch Changes\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n  - @graphql-codegen/visitor-plugin-common@2.13.4\n  - @graphql-codegen/typescript@2.8.4\n\n## 2.5.8\n\n### Patch Changes\n\n- [#8664](https://github.com/dotansimha/graphql-code-generator/pull/8664) [`62f655452`](https://github.com/dotansimha/graphql-code-generator/commit/62f6554520955dd675e11c920f35ef9bf0aaeffe) Thanks [@jdmoody](https://github.com/jdmoody)! - Fix issue where selection set flattening uses the wrong parent type\n\n- Updated dependencies [[`62f655452`](https://github.com/dotansimha/graphql-code-generator/commit/62f6554520955dd675e11c920f35ef9bf0aaeffe)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.3\n  - @graphql-codegen/typescript@2.8.3\n\n## 2.5.7\n\n### Patch Changes\n\n- Updated dependencies [[`ef4c2c9c2`](https://github.com/dotansimha/graphql-code-generator/commit/ef4c2c9c233c68830f10eb4c167c7cceead27122)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.2\n  - @graphql-codegen/typescript@2.8.2\n\n## 2.5.6\n\n### Patch Changes\n\n- Updated dependencies [[`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.1\n  - @graphql-codegen/plugin-helpers@2.7.2\n  - @graphql-codegen/typescript@2.8.1\n\n## 2.5.5\n\n### Patch Changes\n\n- Updated dependencies [[`a46b8d99c`](https://github.com/dotansimha/graphql-code-generator/commit/a46b8d99c797283d773ec14163c62be9c84d4c2b)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.0\n  - @graphql-codegen/typescript@2.7.5\n\n## 2.5.4\n\n### Patch Changes\n\n- Updated dependencies [[`1bd7f771c`](https://github.com/dotansimha/graphql-code-generator/commit/1bd7f771ccb949a5a37395c7c57cb41c19340714)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.2\n  - @graphql-codegen/typescript@2.7.4\n\n## 2.5.3\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f), [`47d0a57e2`](https://github.com/dotansimha/graphql-code-generator/commit/47d0a57e27dd0d2334670bfc6c81c45e00ff4e74)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.1\n  - @graphql-codegen/typescript@2.7.3\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 2.5.2\n\n### Patch Changes\n\n- Updated dependencies [2cbcbb371]\n  - @graphql-codegen/visitor-plugin-common@2.12.0\n  - @graphql-codegen/plugin-helpers@2.6.0\n  - @graphql-codegen/typescript@2.7.2\n\n## 2.5.1\n\n### Patch Changes\n\n- Updated dependencies [525ad580b]\n  - @graphql-codegen/visitor-plugin-common@2.11.1\n  - @graphql-codegen/typescript@2.7.1\n\n## 2.5.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [68bb30e19]\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/visitor-plugin-common@2.11.0\n  - @graphql-codegen/typescript@2.7.0\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 2.4.3\n\n### Patch Changes\n\n- Updated dependencies [aa1e6eafd]\n- Updated dependencies [a42fcbfe4]\n- Updated dependencies [8b10f22be]\n  - @graphql-codegen/typescript@2.6.0\n  - @graphql-codegen/visitor-plugin-common@2.10.0\n\n## 2.4.2\n\n### Patch Changes\n\n- Updated dependencies [d16bebacb]\n  - @graphql-codegen/visitor-plugin-common@2.9.1\n  - @graphql-codegen/typescript@2.5.1\n\n## 2.4.1\n\n### Patch Changes\n\n- Updated dependencies [c3d7b7226]\n  - @graphql-codegen/visitor-plugin-common@2.9.0\n  - @graphql-codegen/typescript@2.5.0\n\n## 2.4.0\n\n### Minor Changes\n\n- f1fb77bd4: feat: Add option to squash exactly similar fragment types\n\n### Patch Changes\n\n- Updated dependencies [f1fb77bd4]\n  - @graphql-codegen/visitor-plugin-common@2.8.0\n  - @graphql-codegen/typescript@2.4.11\n\n## 2.3.7\n\n### Patch Changes\n\n- Updated dependencies [9a5f31cb6]\n  - @graphql-codegen/typescript@2.4.10\n  - @graphql-codegen/visitor-plugin-common@2.7.6\n\n## 2.3.6\n\n### Patch Changes\n\n- 9312920a4: Import type definitions of dependent fragments when `inlineFragmentType` is `mask`\n- 2966686e9: Generate $fragmentName for fragment subtypes for fragment masking\n- Updated dependencies [2966686e9]\n  - @graphql-codegen/visitor-plugin-common@2.7.5\n  - @graphql-codegen/typescript@2.4.9\n\n## 2.3.5\n\n### Patch Changes\n\n- Updated dependencies [337fd4f77]\n  - @graphql-codegen/visitor-plugin-common@2.7.4\n  - @graphql-codegen/typescript@2.4.8\n\n## 2.3.4\n\n### Patch Changes\n\n- Updated dependencies [54718c039]\n  - @graphql-codegen/typescript@2.4.7\n  - @graphql-codegen/visitor-plugin-common@2.7.3\n\n## 2.3.3\n\n### Patch Changes\n\n- Updated dependencies [11d05e361]\n  - @graphql-codegen/visitor-plugin-common@2.7.2\n  - @graphql-codegen/typescript@2.4.6\n\n## 2.3.2\n\n### Patch Changes\n\n- fd55e2039: fix incorrect type generation when using the inlineFragmentTypes 'combine' option that resulted in generating masked fragment output.\n- Updated dependencies [fd55e2039]\n  - @graphql-codegen/visitor-plugin-common@2.7.1\n  - @graphql-codegen/typescript@2.4.5\n\n## 2.3.1\n\n### Patch Changes\n\n- Updated dependencies [1479233df]\n  - @graphql-codegen/visitor-plugin-common@2.7.0\n  - @graphql-codegen/typescript@2.4.4\n\n## 2.3.0\n\n### Minor Changes\n\n- 4d413b13a: feat: Support including fragments when using flattenGeneratedTypes in typescript-operations\n\n## 2.2.4\n\n### Patch Changes\n\n- Updated dependencies [c8ef37ae0]\n- Updated dependencies [754a33715]\n- Updated dependencies [bef4376d5]\n- Updated dependencies [be7cb3a82]\n  - @graphql-codegen/visitor-plugin-common@2.6.0\n  - @graphql-codegen/plugin-helpers@2.4.0\n  - @graphql-codegen/typescript@2.4.3\n\n## 2.2.3\n\n### Patch Changes\n\n- 7649201fe: Remove redundant mandatory 'undefined' on avoidOptionals=true\n\n## 2.2.2\n\n### Patch Changes\n\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/visitor-plugin-common@2.5.2\n  - @graphql-codegen/typescript@2.4.2\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 2.2.1\n\n### Patch Changes\n\n- a9f1f1594: Use maybeValue as default output for optionals on preResolveTypes: true\n- Updated dependencies [a9f1f1594]\n- Updated dependencies [9ea6621ec]\n  - @graphql-codegen/visitor-plugin-common@2.5.1\n  - @graphql-codegen/typescript@2.4.1\n\n## 2.2.0\n\n### Minor Changes\n\n- 97ddb487a: feat: GraphQL v16 compatibility\n\n### Patch Changes\n\n- Updated dependencies [97ddb487a]\n  - @graphql-codegen/visitor-plugin-common@2.5.0\n  - @graphql-codegen/typescript@2.3.0\n  - @graphql-codegen/plugin-helpers@2.3.0\n\n## 2.1.8\n\n### Patch Changes\n\n- 8a576b49a: avoidOptionals with skip/include directives fix\n- Updated dependencies [ad02cb9b8]\n  - @graphql-codegen/visitor-plugin-common@2.4.0\n  - @graphql-codegen/typescript@2.2.4\n\n## 2.1.7\n\n### Patch Changes\n\n- 1d570b456: avoidOptionals sub-config fix\n- Updated dependencies [b9e85adae]\n- Updated dependencies [7c60e5acc]\n- Updated dependencies [3c2c847be]\n  - @graphql-codegen/visitor-plugin-common@2.3.0\n  - @graphql-codegen/plugin-helpers@2.2.0\n  - @graphql-codegen/typescript@2.2.3\n\n## 2.1.6\n\n### Patch Changes\n\n- 5c37b9d11: Fix avoidOptional handle of Maybe types\n\n## 2.1.5\n\n### Patch Changes\n\n- 25cd11d01: correctly inline Maybe types if the `preresolveTypes` config option is set to `true`\n\n## 2.1.4\n\n### Patch Changes\n\n- Updated dependencies [0b090e31a]\n  - @graphql-codegen/visitor-plugin-common@2.2.1\n  - @graphql-codegen/typescript@2.2.2\n\n## 2.1.3\n\n### Patch Changes\n\n- Updated dependencies [d6c2d4c09]\n- Updated dependencies [feeae1c66]\n- Updated dependencies [8261e4161]\n- Updated dependencies [5086791ac]\n  - @graphql-codegen/visitor-plugin-common@2.2.0\n  - @graphql-codegen/typescript@2.2.0\n\n## 2.1.2\n\n### Patch Changes\n\n- Updated dependencies [6470e6cc9]\n- Updated dependencies [263570e50]\n- Updated dependencies [35199dedf]\n  - @graphql-codegen/visitor-plugin-common@2.1.2\n  - @graphql-codegen/plugin-helpers@2.1.1\n  - @graphql-codegen/typescript@2.1.2\n\n## 2.1.1\n\n### Patch Changes\n\n- Updated dependencies [aabeff181]\n  - @graphql-codegen/visitor-plugin-common@2.1.1\n  - @graphql-codegen/typescript@2.1.1\n\n## 2.1.0\n\n### Minor Changes\n\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- Updated dependencies [290170262]\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/visitor-plugin-common@2.1.0\n  - @graphql-codegen/plugin-helpers@2.1.0\n  - @graphql-codegen/typescript@2.1.0\n\n## 2.0.1\n\n### Patch Changes\n\n- e8c8e9c06: Set `preResolveTypes: true` by default (should be there since v2)\n\n## 2.0.0\n\n### Major Changes\n\n- d80efdec4: Change `preResolveTypes` default to be `true` for more readable types\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- d80efdec4: Add option `inlineFragmentTypes` for deep inlining fragment types within operation types. This `inlineFragmentTypes` is set to `inline` by default (Previous behaviour is `combine`).\n\n  This behavior is the better default for users that only use Fragments for building operations and then want to have access to all the data via the operation type (instead of accessing slices of the data via fragments).\n\n- Updated dependencies [d80efdec4]\n- Updated dependencies [d80efdec4]\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/visitor-plugin-common@2.0.0\n  - @graphql-codegen/typescript@2.0.0\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 1.18.4\n\n### Patch Changes\n\n- Updated dependencies [df19a4ed]\n- Updated dependencies [470336a1]\n- Updated dependencies [9005cc17]\n  - @graphql-codegen/visitor-plugin-common@1.22.0\n  - @graphql-codegen/plugin-helpers@1.18.8\n  - @graphql-codegen/typescript@1.23.0\n\n## 1.18.3\n\n### Patch Changes\n\n- 6762aff5: Fix for array types with @skip @include directives\n- Updated dependencies [6762aff5]\n  - @graphql-codegen/visitor-plugin-common@1.21.3\n  - @graphql-codegen/typescript@1.22.4\n\n## 1.18.2\n\n### Patch Changes\n\n- 6aaecf1c: Fix issues with missing sub-fragments when skipTypename: true\n- Updated dependencies [6aaecf1c]\n  - @graphql-codegen/visitor-plugin-common@1.21.2\n  - @graphql-codegen/typescript@1.22.3\n\n## 1.18.1\n\n### Patch Changes\n\n- Updated dependencies [cf1e5abc]\n  - @graphql-codegen/visitor-plugin-common@1.21.1\n  - @graphql-codegen/typescript@1.22.2\n\n## 1.18.0\n\n### Minor Changes\n\n- 0a909869: Add arrayInputCoercion option\n\n### Patch Changes\n\n- Updated dependencies [dfd25caf]\n- Updated dependencies [8da7dff6]\n  - @graphql-codegen/visitor-plugin-common@1.21.0\n  - @graphql-codegen/plugin-helpers@1.18.7\n  - @graphql-codegen/typescript@1.22.1\n\n## 1.17.16\n\n### Patch Changes\n\n- d9212aa0: fix(visitor-plugin-common): guard for a runtime type error\n- Updated dependencies [d9212aa0]\n- Updated dependencies [f0b5ea53]\n- Updated dependencies [097bea2f]\n  - @graphql-codegen/visitor-plugin-common@1.20.0\n  - @graphql-codegen/typescript@1.22.0\n  - @graphql-codegen/plugin-helpers@1.18.5\n\n## 1.17.15\n\n### Patch Changes\n\n- 1f6f3db6: Fix for @skip @include directives upon arrays\n- 29b75b1e: enhance(namingConvention): use change-case-all instead of individual packages for naming convention\n- Updated dependencies [e947f8e3]\n- Updated dependencies [29b75b1e]\n- Updated dependencies [d4942d04]\n- Updated dependencies [1f6f3db6]\n- Updated dependencies [29b75b1e]\n  - @graphql-codegen/visitor-plugin-common@1.19.0\n  - @graphql-codegen/typescript@1.21.1\n  - @graphql-codegen/plugin-helpers@1.18.3\n\n## 1.17.14\n\n### Patch Changes\n\n- 63be0f40: Fix issues with empty interfaces causing syntax issues\n- 190482a1: add support for fragment variables\n- 142b32b3: @skip, @include directives resolve to optional fields\n- 142b32b3: Better support for @skip/@include directives with complex selection sets\n- Updated dependencies [63be0f40]\n- Updated dependencies [190482a1]\n- Updated dependencies [4444348d]\n- Updated dependencies [142b32b3]\n- Updated dependencies [42213fa0]\n  - @graphql-codegen/visitor-plugin-common@1.18.1\n  - @graphql-codegen/typescript@1.20.1\n\n## 1.17.13\n\n### Patch Changes\n\n- 64293437: Support for input lists coercion\n- Updated dependencies [64293437]\n- Updated dependencies [fd5843a7]\n- Updated dependencies [d75051f5]\n  - @graphql-codegen/visitor-plugin-common@1.17.22\n\n## 1.17.12\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/visitor-plugin-common@1.17.20\n  - @graphql-codegen/typescript@1.18.1\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 1.17.11\n\n### Patch Changes\n\n- 7587fda4: When using avoidOptionals config, @skip, @include resolve into MakeMaybe type\n- Updated dependencies [99819bf1]\n- Updated dependencies [49242c20]\n- Updated dependencies [c3b59e81]\n  - @graphql-codegen/visitor-plugin-common@1.17.19\n  - @graphql-codegen/typescript@1.18.0\n\n## 1.17.10\n\n### Patch Changes\n\n- 475aa9b8: @skip, @include directives resolve to optional fields\n- Updated dependencies [faa13973]\n  - @graphql-codegen/visitor-plugin-common@1.17.18\n\n## 1.17.9\n\n### Patch Changes\n\n- 612e5e52: Remove broken isTypeOf call (always undefined in graphql-tools v6)\n- 0f35e775: Fixed issues with incorrect naming when typesSuffix is used\n- Updated dependencies [612e5e52]\n- Updated dependencies [9f2a4e2f]\n- Updated dependencies [0f35e775]\n- Updated dependencies [eaf45d1f]\n  - @graphql-codegen/visitor-plugin-common@1.17.17\n  - @graphql-codegen/plugin-helpers@1.18.1\n\n## 1.17.8\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n  - @graphql-codegen/visitor-plugin-common@1.17.13\n  - @graphql-codegen/plugin-helpers@1.17.8\n  - @graphql-codegen/typescript@1.17.8\n"
  },
  {
    "path": "packages/plugins/typescript/operations/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/typescript-operations\",\n  \"version\": \"5.0.9\",\n  \"description\": \"GraphQL Code Generator plugin for generating TypeScript types for GraphQL queries, mutations, subscriptions and fragments\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/plugins/typescript/operations\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"^6.1.1\",\n    \"@graphql-codegen/typescript\": \"^5.0.9\",\n    \"@graphql-codegen/visitor-plugin-common\": \"^6.2.4\",\n    \"auto-bind\": \"~4.0.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\",\n    \"graphql-sock\": \"^1.0.0\"\n  },\n  \"peerDependenciesMeta\": {\n    \"graphql-sock\": {\n      \"optional\": true\n    }\n  },\n  \"devDependencies\": {\n    \"graphql-sock\": \"1.0.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/operations/src/config.ts",
    "content": "import { AvoidOptionalsConfig, RawDocumentsConfig } from '@graphql-codegen/visitor-plugin-common';\n\n/**\n * @description This plugin generates TypeScript types based on your GraphQLSchema _and_ your GraphQL operations and fragments.\n * It generates types for your GraphQL documents: Query, Mutation, Subscription and Fragment.\n *\n * Note: In most configurations, this plugin requires you to use `typescript as well, because it depends on its base types.\n */\nexport interface TypeScriptDocumentsPluginConfig extends RawDocumentsConfig {\n  /**\n   * @description The [GraphQL spec](https://spec.graphql.org/draft/#sel-FAHjBJFCAACE_Gh7d)\n   * allows arrays and a single primitive value for list input. This allows to\n   * deactivate that behavior to only accept arrays instead of single values. If\n   * set to `false`, the definition: `query foo(bar: [Int!]!): Foo` will output\n   * `bar: Array<Int>` instead of `bar: Array<Int> | Int` for the variable part.\n   * @default true\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript'],\n   *        config: {\n   *          arrayInputCoercion: false\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  arrayInputCoercion?: boolean;\n  /**\n   * @description This will cause the generator to avoid using TypeScript optionals (`?`) on types,\n   * so the following definition: `type A { myField: String }` will output `myField: Maybe<string>`\n   * instead of `myField?: Maybe<string>`.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ## Override all definition types\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript'],\n   *        config: {\n   *          avoidOptionals: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Override only specific definition types\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript'],\n   *        config: {\n   *          avoidOptionals: {\n   *            field: true\n   *            inputValue: true\n   *            object: true\n   *            defaultValue: true\n   *          }\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  avoidOptionals?: boolean | AvoidOptionalsConfig;\n  /**\n   * @description Generates immutable types by adding `readonly` to properties and uses `ReadonlyArray`.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript'],\n   *        config: {\n   *          immutableTypes: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  immutableTypes?: boolean;\n  /**\n   * @description Flatten fragment spread and inline fragments into a simple selection set before generating.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-operations'],\n   *        config: {\n   *          flattenGeneratedTypes: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  flattenGeneratedTypes?: boolean;\n\n  /**\n   * @description Include all fragments types when flattenGeneratedTypes is enabled.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-operations'],\n   *        config: {\n   *          flattenGeneratedTypes: true,\n   *          flattenGeneratedTypesIncludeFragments: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  flattenGeneratedTypesIncludeFragments?: boolean;\n\n  /**\n   * @description Set to `true` in order to generate output without `export` modifier.\n   * This is useful if you are generating `.d.ts` file and want it to be globally available.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript'],\n   *        config: {\n   *          noExport: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  noExport?: boolean;\n  globalNamespace?: boolean;\n  /**\n   * @name addOperationExport\n   * @type boolean\n   * @description Add const export of the operation name to output file. Pay attention that the file should be `d.ts`.\n   * You can combine it with `near-operation-file preset` and therefore the types will be generated along with graphql file. Then you need to set extension in `presetConfig` to be `.gql.d.ts` and by that you can import `gql` file in `ts` files.\n   * It will allow you to get everything with one import:\n   *\n   * ```ts\n   * import { GetClient, GetClientQuery, GetClientQueryVariables } from './GetClient.gql.js'\n   * ```\n   * @default false\n   * @see https://github.com/dotansimha/graphql-code-generator/issues/3949\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      \"./typings/api.ts\": {\n   *        \"plugins\": [\n   *            \"typescript\"\n   *        ]\n   *    },\n   *    \"./\": {\n   *        \"preset\": \"near-operation-file\",\n   *        \"presetConfig\": {\n   *            \"baseTypesPath\": \"./typings/api.ts\",\n   *            \"extension\": \".gql.d.ts\"\n   *        },\n   *        \"plugins\": [\n   *            \"@graphql-codegen/typescript-operations\"\n   *        ],\n   *        \"config\": {\n   *            \"addOperationExport\": true\n   *        }\n   *    }\n   *  };\n   *  export default config;\n   * ```\n   */\n  addOperationExport?: boolean;\n  /**\n   * @description Allow to override the type value of `Maybe`.\n   * @default T | null\n   *\n   * @exampleMarkdown\n   * ## Allow undefined\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript'],\n   *        config: {\n   *          maybeValue: 'T | null | undefined'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## Allow `null` in resolvers:\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript'],\n   *        config: {\n   *          maybeValue: 'T extends PromiseLike<infer U> ? Promise<U | null> : T | null'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  maybeValue?: string;\n\n  /**\n   * @description Adds undefined as a possible type for query variables\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript'],\n   *        config: {\n   *          allowUndefinedQueryVariables: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n\n  allowUndefinedQueryVariables?: boolean;\n\n  /**\n   * @description Options related to handling nullability\n   * @exampleMarkdown\n   * ## `errorHandlingClient`\n   * An error handling client is a client which prevents the user from reading a `null` used as a placeholder for an error in a GraphQL response.\n   * The client may do so by throwing when an errored field is accessed (as is the case for [`graphql-toe`](https://github.com/graphile/graphql-toe)),\n   * or when a fragment containing an error is read (as is the case for Relay's `@throwOnFieldError` directive),\n   * or by preventing any data from being read if an error occurred (as with Apollo Client's `errorPolicy: \"none\"`).\n   *\n   * When using error handling clients, a semantic non-nullable field can never be `null`.\n   * If a semantic non-nullable field's value in the response is `null`, there must be a respective error.\n   * The error handling client will throw in this case, so the `null` value is never read.\n   *\n   * To enable this option, install `graphql-sock` peer dependency:\n   *\n   * ```sh npm2yarn\n   * npm install -D graphql-sock\n   * ```\n   *\n   * Now, you can enable support for error handling clients:\n   *\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript', 'typescript-operations'],\n   *       config: {\n   *         nullability: {\n   *           errorHandlingClient: true\n   *         }\n   *       },\n   *     },\n   *   },\n   * };\n   * export default config;\n   * ```\n   */\n  nullability?: {\n    errorHandlingClient: boolean;\n  };\n}\n"
  },
  {
    "path": "packages/plugins/typescript/operations/src/index.ts",
    "content": "import { oldVisit, PluginFunction, Types } from '@graphql-codegen/plugin-helpers';\nimport { LoadedFragment, optimizeOperations } from '@graphql-codegen/visitor-plugin-common';\nimport { concatAST, FragmentDefinitionNode, GraphQLSchema, Kind } from 'graphql';\nimport { TypeScriptDocumentsPluginConfig } from './config.js';\nimport { TypeScriptDocumentsVisitor } from './visitor.js';\n\nexport { TypeScriptDocumentsPluginConfig } from './config.js';\n\nexport const plugin: PluginFunction<TypeScriptDocumentsPluginConfig, Types.ComplexPluginOutput> = async (\n  inputSchema: GraphQLSchema,\n  rawDocuments: Types.DocumentFile[],\n  config: TypeScriptDocumentsPluginConfig\n) => {\n  const schema = config.nullability?.errorHandlingClient ? await semanticToStrict(inputSchema) : inputSchema;\n\n  const documents = config.flattenGeneratedTypes\n    ? optimizeOperations(schema, rawDocuments, {\n        includeFragments: config.flattenGeneratedTypesIncludeFragments,\n      })\n    : rawDocuments;\n  const allAst = concatAST(documents.map(v => v.document));\n\n  const allFragments: LoadedFragment[] = [\n    ...(allAst.definitions.filter(d => d.kind === Kind.FRAGMENT_DEFINITION) as FragmentDefinitionNode[]).map(\n      fragmentDef => ({\n        node: fragmentDef,\n        name: fragmentDef.name.value,\n        onType: fragmentDef.typeCondition.name.value,\n        isExternal: false,\n      })\n    ),\n    ...(config.externalFragments || []),\n  ];\n\n  const visitor = new TypeScriptDocumentsVisitor(schema, config, allFragments);\n\n  const visitorResult = oldVisit(allAst, {\n    leave: visitor,\n  });\n\n  let content = visitorResult.definitions.join('\\n');\n\n  if (config.addOperationExport) {\n    const exportConsts = [];\n\n    for (const d of allAst.definitions) {\n      if ('name' in d) {\n        exportConsts.push(`export declare const ${d.name.value}: import(\"graphql\").DocumentNode;`);\n      }\n    }\n\n    content = visitorResult.definitions.concat(exportConsts).join('\\n');\n  }\n\n  if (config.globalNamespace) {\n    content = `\n    declare global {\n      ${content}\n    }`;\n  }\n\n  return {\n    prepend: [...visitor.getImports(), ...visitor.getGlobalDeclarations(visitor.config.noExport)],\n    content,\n  };\n};\n\nexport { TypeScriptDocumentsVisitor };\n\nconst semanticToStrict = async (schema: GraphQLSchema): Promise<GraphQLSchema> => {\n  try {\n    const sock = await import('graphql-sock');\n    return sock.semanticToStrict(schema);\n  } catch {\n    throw new Error(\n      \"To use the `nullability.errorHandlingClient` option, you must install the 'graphql-sock' package.\"\n    );\n  }\n};\n"
  },
  {
    "path": "packages/plugins/typescript/operations/src/ts-operation-variables-to-object.ts",
    "content": "import { TypeScriptOperationVariablesToObject as TSOperationVariablesToObject } from '@graphql-codegen/typescript';\n\nexport class TypeScriptOperationVariablesToObject extends TSOperationVariablesToObject {\n  protected formatTypeString(fieldType: string, _isNonNullType: boolean, _hasDefaultValue: boolean): string {\n    return fieldType;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/operations/src/ts-selection-set-processor.ts",
    "content": "import {\n  BaseSelectionSetProcessor,\n  LinkField,\n  PrimitiveAliasedFields,\n  PrimitiveField,\n  ProcessResult,\n  SelectionSetProcessorConfig,\n} from '@graphql-codegen/visitor-plugin-common';\nimport { GraphQLInterfaceType, GraphQLObjectType } from 'graphql';\n\nexport class TypeScriptSelectionSetProcessor extends BaseSelectionSetProcessor<SelectionSetProcessorConfig> {\n  transformPrimitiveFields(\n    schemaType: GraphQLObjectType | GraphQLInterfaceType,\n    fields: PrimitiveField[],\n    unsetTypes?: boolean\n  ): ProcessResult {\n    if (fields.length === 0) {\n      return [];\n    }\n\n    const parentName =\n      (this.config.namespacedImportName ? `${this.config.namespacedImportName}.` : '') +\n      this.config.convertName(schemaType.name, {\n        useTypesPrefix: true,\n      });\n\n    if (unsetTypes) {\n      const escapedFieldNames = fields.map(field => `'${field.fieldName}'`);\n      return [formattedUnionTransform('MakeEmpty', parentName, escapedFieldNames)];\n    }\n\n    let hasConditionals = false;\n    const escapedConditionalsList: string[] = [];\n    const escapedFieldNames = fields.map(field => {\n      if (field.isConditional) {\n        hasConditionals = true;\n        escapedConditionalsList.push(`'${field.fieldName}'`);\n      }\n      return `'${field.fieldName}'`;\n    });\n    let resString = formattedUnionTransform('Pick', parentName, escapedFieldNames);\n\n    if (hasConditionals) {\n      const avoidOptional =\n        // TODO: check type and exec only if relevant\n        this.config.avoidOptionals === true ||\n        (typeof this.config.avoidOptionals === 'object' &&\n          (this.config.avoidOptionals.field ||\n            this.config.avoidOptionals.inputValue ||\n            this.config.avoidOptionals.object));\n\n      const transform = avoidOptional ? 'MakeMaybe' : 'MakeOptional';\n      resString = `${\n        this.config.namespacedImportName ? `${this.config.namespacedImportName}.` : ''\n      }${formattedUnionTransform(transform, resString, escapedConditionalsList)}`;\n    }\n    return [resString];\n  }\n\n  transformTypenameField(type: string, name: string): ProcessResult {\n    return [`{ ${name}: ${type} }`];\n  }\n\n  transformAliasesPrimitiveFields(\n    schemaType: GraphQLObjectType | GraphQLInterfaceType,\n    fields: PrimitiveAliasedFields[]\n  ): ProcessResult {\n    if (fields.length === 0) {\n      return [];\n    }\n\n    const parentName =\n      (this.config.namespacedImportName ? `${this.config.namespacedImportName}.` : '') +\n      this.config.convertName(schemaType.name, {\n        useTypesPrefix: true,\n      });\n\n    const selections = fields.map(aliasedField => {\n      const value =\n        aliasedField.fieldName === '__typename' ? `'${schemaType.name}'` : `${parentName}['${aliasedField.fieldName}']`;\n\n      return `${aliasedField.alias}: ${value}`;\n    });\n    return [formatSelections(selections)];\n  }\n\n  transformLinkFields(fields: LinkField[]): ProcessResult {\n    if (fields.length === 0) {\n      return [];\n    }\n\n    const selections = fields.map(field => `${field.alias || field.name}: ${field.selectionSet}`);\n\n    return [formatSelections(selections)];\n  }\n}\n\n/** Equivalent to `${transformName}<${target}, ${unionElements.join(' | ')}>`, but with line feeds if necessary */\nfunction formattedUnionTransform(transformName: string, target: string, unionElements: string[]): string {\n  if (unionElements.length > 3) {\n    return `${transformName}<\\n    ${target},\\n    | ${unionElements.join('\\n    | ')}\\n  >`;\n  }\n  return `${transformName}<${target}, ${unionElements.join(' | ')}>`;\n}\n\n/** Equivalent to `{ ${selections.join(', ')} }`, but with line feeds if necessary */\nfunction formatSelections(selections: string[]): string {\n  if (selections.length > 1) {\n    return `{\\n    ${selections.map(s => s.replace(/\\n/g, '\\n  ')).join(',\\n    ')},\\n  }`;\n  }\n  return `{ ${selections.join(', ')} }`;\n}\n"
  },
  {
    "path": "packages/plugins/typescript/operations/src/visitor.ts",
    "content": "import {\n  BaseDocumentsVisitor,\n  DeclarationKind,\n  generateFragmentImportStatement,\n  getConfigValue,\n  LoadedFragment,\n  normalizeAvoidOptionals,\n  NormalizedAvoidOptionalsConfig,\n  ParsedDocumentsConfig,\n  PreResolveTypesProcessor,\n  SelectionSetProcessorConfig,\n  SelectionSetToObject,\n  wrapTypeWithModifiers,\n} from '@graphql-codegen/visitor-plugin-common';\nimport autoBind from 'auto-bind';\nimport { GraphQLNamedType, GraphQLOutputType, GraphQLSchema, isEnumType, isNonNullType } from 'graphql';\nimport { TypeScriptDocumentsPluginConfig } from './config.js';\nimport { TypeScriptOperationVariablesToObject } from './ts-operation-variables-to-object.js';\nimport { TypeScriptSelectionSetProcessor } from './ts-selection-set-processor.js';\n\nexport interface TypeScriptDocumentsParsedConfig extends ParsedDocumentsConfig {\n  arrayInputCoercion: boolean;\n  avoidOptionals: NormalizedAvoidOptionalsConfig;\n  immutableTypes: boolean;\n  noExport: boolean;\n  maybeValue: string;\n  allowUndefinedQueryVariables: boolean;\n}\n\nexport class TypeScriptDocumentsVisitor extends BaseDocumentsVisitor<\n  TypeScriptDocumentsPluginConfig,\n  TypeScriptDocumentsParsedConfig\n> {\n  constructor(schema: GraphQLSchema, config: TypeScriptDocumentsPluginConfig, allFragments: LoadedFragment[]) {\n    super(\n      config,\n      {\n        arrayInputCoercion: getConfigValue(config.arrayInputCoercion, true),\n        noExport: getConfigValue(config.noExport, false),\n        avoidOptionals: normalizeAvoidOptionals(getConfigValue(config.avoidOptionals, false)),\n        immutableTypes: getConfigValue(config.immutableTypes, false),\n        nonOptionalTypename: getConfigValue(config.nonOptionalTypename, false),\n        preResolveTypes: getConfigValue(config.preResolveTypes, true),\n        mergeFragmentTypes: getConfigValue(config.mergeFragmentTypes, false),\n        allowUndefinedQueryVariables: getConfigValue(config.allowUndefinedQueryVariables, false),\n      } as TypeScriptDocumentsParsedConfig,\n      schema\n    );\n\n    autoBind(this);\n\n    const preResolveTypes = getConfigValue(config.preResolveTypes, true);\n    const defaultMaybeValue = 'T | null';\n    const maybeValue = getConfigValue(config.maybeValue, defaultMaybeValue);\n\n    const wrapOptional = (type: string) => {\n      if (preResolveTypes === true) {\n        return maybeValue.replace('T', type);\n      }\n      const prefix = this.config.namespacedImportName ? `${this.config.namespacedImportName}.` : '';\n      return `${prefix}Maybe<${type}>`;\n    };\n    const wrapArray = (type: string) => {\n      const listModifier = this.config.immutableTypes ? 'ReadonlyArray' : 'Array';\n      return `${listModifier}<${type}>`;\n    };\n\n    const formatNamedField = (\n      name: string,\n      type: GraphQLOutputType | GraphQLNamedType | null,\n      isConditional = false,\n      isOptional = false\n    ): string => {\n      const optional =\n        isOptional || isConditional || (!this.config.avoidOptionals.field && !!type && !isNonNullType(type));\n      return (this.config.immutableTypes ? `readonly ${name}` : name) + (optional ? '?' : '');\n    };\n\n    const processorConfig: SelectionSetProcessorConfig = {\n      namespacedImportName: this.config.namespacedImportName,\n      convertName: this.convertName.bind(this),\n      enumPrefix: this.config.enumPrefix,\n      enumSuffix: this.config.enumSuffix,\n      scalars: this.scalars,\n      formatNamedField,\n      wrapTypeWithModifiers(baseType, type) {\n        return wrapTypeWithModifiers(baseType, type, { wrapOptional, wrapArray });\n      },\n      avoidOptionals: this.config.avoidOptionals,\n      printFieldsOnNewLines: this.config.printFieldsOnNewLines,\n    };\n    const processor = new (preResolveTypes ? PreResolveTypesProcessor : TypeScriptSelectionSetProcessor)(\n      processorConfig\n    );\n    this.setSelectionSetHandler(\n      new SelectionSetToObject(\n        processor,\n        this.scalars,\n        this.schema,\n        this.convertName.bind(this),\n        this.getFragmentSuffix.bind(this),\n        allFragments,\n        this.config\n      )\n    );\n    const enumsNames = Object.keys(schema.getTypeMap()).filter(typeName => isEnumType(schema.getType(typeName)));\n    this.setVariablesTransformer(\n      new TypeScriptOperationVariablesToObject(\n        this.scalars,\n        this.convertName.bind(this),\n        this.config.avoidOptionals,\n        this.config.immutableTypes,\n        this.config.namespacedImportName,\n        enumsNames,\n        this.config.enumPrefix,\n        this.config.enumSuffix,\n        this.config.enumValues,\n        this.config.arrayInputCoercion,\n        undefined,\n        'InputMaybe'\n      )\n    );\n    this._declarationBlockConfig = {\n      ignoreExport: this.config.noExport,\n    };\n  }\n\n  public getImports(): Array<string> {\n    return !this.config.globalNamespace &&\n      (this.config.inlineFragmentTypes === 'combine' || this.config.inlineFragmentTypes === 'mask')\n      ? this.config.fragmentImports.map(fragmentImport => generateFragmentImportStatement(fragmentImport, 'type'))\n      : [];\n  }\n\n  protected getPunctuation(_declarationKind: DeclarationKind): string {\n    return ';';\n  }\n\n  protected applyVariablesWrapper(variablesBlock: string, operationType: string): string {\n    const prefix = this.config.namespacedImportName ? `${this.config.namespacedImportName}.` : '';\n    const extraType = this.config.allowUndefinedQueryVariables && operationType === 'Query' ? ' | undefined' : '';\n\n    return `${prefix}Exact<${variablesBlock === '{}' ? `{ [key: string]: never; }` : variablesBlock}>${extraType}`;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/operations/tests/__snapshots__/ts-documents.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`TypeScript Operations Plugin > Config > should include fragment variable definitions when experimentalFragmentVariables is set 1`] = `\n\"export type TextNotificationFragmentFragment = { __typename?: 'TextNotification', text?: string };\n\n\nexport type TextNotificationFragmentFragmentVariables = Exact<{\n  skip: Scalars['Boolean']['input'];\n}>;\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Issues > #2699 - Issues with multiple interfaces and unions 1`] = `\n\"export type GetEntityBrandDataQueryVariables = Exact<{\n  gid: Scalars['ID']['input'];\n  brand: Scalars['ID']['input'];\n}>;\n\n\nexport type GetEntityBrandDataQuery = { __typename?: 'Query', node:\n    | { __typename: 'Company', active: boolean, id: string, createdAt: any, updatedAt: any, brandData?: { __typename?: 'EntityBrandData', active: boolean, browsable: boolean, title: string, alternateTitle?: string | null, description: string } | null, createdBy?: { __typename?: 'User', id: string, name: string } | null, updatedBy?: { __typename?: 'User', id: string, name: string } | null }\n    | { __typename: 'Theater', active: boolean, id: string, createdAt: any, updatedAt: any, brandData?: { __typename?: 'EntityBrandData', active: boolean, browsable: boolean, title: string, alternateTitle?: string | null, description: string } | null, createdBy?: { __typename?: 'User', id: string, name: string } | null, updatedBy?: { __typename?: 'User', id: string, name: string } | null }\n    | { __typename: 'Movie', id: string, createdAt: any, updatedAt: any, brandData?: { __typename?: 'EntityBrandData', active: boolean, browsable: boolean, title: string, alternateTitle?: string | null, description: string } | null, createdBy?: { __typename?: 'User', id: string, name: string } | null, updatedBy?: { __typename?: 'User', id: string, name: string } | null }\n    | { __typename: 'User', id: string, createdAt: any, updatedAt: any, brandData?: { __typename?: 'EntityBrandData', active: boolean, browsable: boolean, title: string, alternateTitle?: string | null, description: string } | null, createdBy?: { __typename?: 'User', id: string, name: string } | null, updatedBy?: { __typename?: 'User', id: string, name: string } | null }\n   };\n\ntype EntityBrandData_Company_Fragment = { __typename?: 'Company', brandData?: { __typename?: 'EntityBrandData', active: boolean, browsable: boolean, title: string, alternateTitle?: string | null, description: string } | null };\n\ntype EntityBrandData_Theater_Fragment = { __typename?: 'Theater', brandData?: { __typename?: 'EntityBrandData', active: boolean, browsable: boolean, title: string, alternateTitle?: string | null, description: string } | null };\n\ntype EntityBrandData_Movie_Fragment = { __typename?: 'Movie', brandData?: { __typename?: 'EntityBrandData', active: boolean, browsable: boolean, title: string, alternateTitle?: string | null, description: string } | null };\n\ntype EntityBrandData_User_Fragment = { __typename?: 'User', brandData?: { __typename?: 'EntityBrandData', active: boolean, browsable: boolean, title: string, alternateTitle?: string | null, description: string } | null };\n\nexport type EntityBrandDataFragment =\n  | EntityBrandData_Company_Fragment\n  | EntityBrandData_Theater_Fragment\n  | EntityBrandData_Movie_Fragment\n  | EntityBrandData_User_Fragment\n;\n\ntype ElementMetadata_Company_Fragment = { __typename?: 'Company', createdAt: any, updatedAt: any, createdBy?: { __typename?: 'User', id: string, name: string } | null, updatedBy?: { __typename?: 'User', id: string, name: string } | null };\n\ntype ElementMetadata_Theater_Fragment = { __typename?: 'Theater', createdAt: any, updatedAt: any, createdBy?: { __typename?: 'User', id: string, name: string } | null, updatedBy?: { __typename?: 'User', id: string, name: string } | null };\n\ntype ElementMetadata_Movie_Fragment = { __typename?: 'Movie', createdAt: any, updatedAt: any, createdBy?: { __typename?: 'User', id: string, name: string } | null, updatedBy?: { __typename?: 'User', id: string, name: string } | null };\n\ntype ElementMetadata_User_Fragment = { __typename?: 'User', createdAt: any, updatedAt: any, createdBy?: { __typename?: 'User', id: string, name: string } | null, updatedBy?: { __typename?: 'User', id: string, name: string } | null };\n\nexport type ElementMetadataFragment =\n  | ElementMetadata_Company_Fragment\n  | ElementMetadata_Theater_Fragment\n  | ElementMetadata_Movie_Fragment\n  | ElementMetadata_User_Fragment\n;\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Issues > #2916 - Missing import prefix with preResolveTypes: true and near-operation-file preset 1`] = `\n\"export type UserQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type UserQuery = { user: { id: string, username: string, email: string, dep: Types.Department } };\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Issues > #3064 - fragments over interfaces causes issues with fields 1`] = `\n\"type Venue_Hotel_Fragment = { __typename?: 'Hotel', id: string, gpsPosition: { __typename?: 'GPSPosition', lat: number, lng: number } };\n\ntype Venue_Transport_Fragment = { __typename?: 'Transport', id: string };\n\nexport type VenueFragment =\n  | Venue_Hotel_Fragment\n  | Venue_Transport_Fragment\n;\n\nexport type QQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type QQuery = { __typename?: 'Query', hotel: { __typename?: 'Hotel', id: string, gpsPosition: { __typename?: 'GPSPosition', lat: number, lng: number } }, transport: { __typename?: 'Transport', id: string } };\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Issues > #3064 - fragments over interfaces causes issues with fields 2`] = `\n\"export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string; }\n  String: { input: string; output: string; }\n  Boolean: { input: boolean; output: boolean; }\n  Int: { input: number; output: number; }\n  Float: { input: number; output: number; }\n};\n\nexport type Venue = {\n  id: Scalars['String']['output'];\n  name: Scalars['String']['output'];\n};\n\nexport type GpsPosition = {\n  __typename?: 'GPSPosition';\n  lat: Scalars['Float']['output'];\n  lng: Scalars['Float']['output'];\n};\n\nexport type VenueWithPosition = {\n  id: Scalars['String']['output'];\n  gpsPosition: GpsPosition;\n};\n\nexport type Hotel = VenueWithPosition & Venue & {\n  __typename?: 'Hotel';\n  id: Scalars['String']['output'];\n  gpsPosition: GpsPosition;\n  name: Scalars['String']['output'];\n};\n\nexport type Transport = Venue & {\n  __typename?: 'Transport';\n  id: Scalars['String']['output'];\n  name: Scalars['String']['output'];\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  hotel: Hotel;\n  transport: Transport;\n};\ntype Venue_Hotel_Fragment = { __typename?: 'Hotel', id: string, gpsPosition: { __typename?: 'GPSPosition', lat: number, lng: number } };\n\ntype Venue_Transport_Fragment = { __typename?: 'Transport', id: string };\n\nexport type VenueFragment =\n  | Venue_Hotel_Fragment\n  | Venue_Transport_Fragment\n;\n\nexport type QQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type QQuery = { __typename?: 'Query', hotel: { __typename?: 'Hotel', id: string, gpsPosition: { __typename?: 'GPSPosition', lat: number, lng: number } }, transport: { __typename?: 'Transport', id: string } };\nfunction test(q: QQuery) {\n        if (q.hotel) {\n            const t1 = q.hotel.gpsPosition.lat\n        }\n\n        if (q.transport) {\n            const t2 = q.transport.id;\n        }\n    }\"\n`;\n\nexports[`TypeScript Operations Plugin > Issues > #6874 - generates types when parent type differs from spread fragment member types and preResolveTypes=true 1`] = `\n\"export type SnakeQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type SnakeQueryQuery = { __typename?: 'Query', snake:\n    | { __typename?: 'Snake', name: string, features: { __typename?: 'SnakeFeatures', color: string, length: number } }\n    | { __typename?: 'Error' }\n   };\n\ntype AnimalFragment_Bat_Fragment = { __typename?: 'Bat', features: { __typename?: 'BatFeatures', color: string, wingspan: number } };\n\ntype AnimalFragment_Snake_Fragment = { __typename?: 'Snake', features: { __typename?: 'SnakeFeatures', color: string, length: number } };\n\nexport type AnimalFragmentFragment =\n  | AnimalFragment_Bat_Fragment\n  | AnimalFragment_Snake_Fragment\n;\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Issues > #8793 selecting __typename should not be optional 1`] = `\n\"export type SnakeQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type SnakeQueryQuery = { __typename: 'Query', snake:\n    | { __typename: 'Snake' }\n    | { __typename: 'Error' }\n   };\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Selection Set > Should generate the correct __typename when using both inline fragment and spread over type 1`] = `\n\"export type UserQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type UserQueryQuery = (\n  { __typename?: 'Query' }\n  & { user?: Maybe<(\n    { __typename?: 'User' }\n    & Pick<User, 'id' | 'name'>\n  )> }\n);\n\nexport type UserFragment = (\n  { __typename?: 'User' }\n  & Pick<User, 'id' | 'name'>\n);\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Selection Set > Should generate the correct __typename when using fragment over type 1`] = `\n\"export type UserQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type UserQueryQuery = (\n  { __typename?: 'Query' }\n  & { user?: Maybe<(\n    { __typename?: 'User' }\n    & Pick<User, 'id' | 'name'>\n  )> }\n);\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Selection Set > Should generate the correct __typename when using fragment spread over type 1`] = `\n\"export type UserQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type UserQueryQuery = (\n  { __typename?: 'Query' }\n  & { user?: Maybe<(\n    { __typename?: 'User' }\n    & Pick<User, 'id' | 'name'>\n  )> }\n);\n\nexport type UserFragment = (\n  { __typename?: 'User' }\n  & Pick<User, 'id' | 'name'>\n);\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Selection Set > Should generate the correct __typename when using fragment spread over union 1`] = `\n\"export type UserFragmentFragment = (\n  { __typename?: 'User' }\n  & Pick<User, 'id'>\n);\n\nexport type AaaQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type AaaQuery = (\n  { __typename?: 'Query' }\n  & { user:\n    | (\n      { __typename?: 'User' }\n      & Pick<User, 'id'>\n    )\n    | { __typename?: 'Error' }\n   }\n);\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Selection Set > Should generate the correct intersection for fragments when using with interfaces with same type 1`] = `\n\"export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type Unnamed_1_Query = (\n  { __typename?: 'Query' }\n  & { b?: Maybe<\n    | (\n      { __typename?: 'A' }\n      & Pick<A, 'id' | 'x'>\n    )\n    | { __typename?: 'B' }\n  > }\n);\n\nexport type AFragment = (\n  { __typename?: 'A' }\n  & Pick<A, 'id'>\n);\n\nexport type BFragment = (\n  { __typename?: 'A' }\n  & Pick<A, 'x'>\n);\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Selection Set > Should have valid __typename usage and split types according to that (with usage) 1`] = `\n\"type NetRoute_Ipv4Route_Fragment = (\n  { __typename: 'IPV4Route' }\n  & {\n    ipv4Address: Ipv4Route['address'],\n    ipv4Gateway: Ipv4Route['gateway'],\n  }\n);\n\ntype NetRoute_Ipv6Route_Fragment = (\n  { __typename: 'IPV6Route' }\n  & {\n    ipv6Address: Ipv6Route['address'],\n    ipv6Gateway: Ipv6Route['gateway'],\n  }\n);\n\nexport type NetRouteFragment =\n  | NetRoute_Ipv4Route_Fragment\n  | NetRoute_Ipv6Route_Fragment\n;\n\nexport type QqQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type QqQuery = (\n  { __typename?: 'Query' }\n  & { routes: Array<\n    | (\n      { __typename: 'IPV4Route' }\n      & {\n        ipv4Address: Ipv4Route['address'],\n        ipv4Gateway: Ipv4Route['gateway'],\n      }\n    )\n    | (\n      { __typename: 'IPV6Route' }\n      & {\n        ipv6Address: Ipv6Route['address'],\n        ipv6Gateway: Ipv6Route['gateway'],\n      }\n    )\n  > }\n);\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Selection Set > Should have valid __typename usage and split types according to that (with usage) 2`] = `\n\"type NetRoute_Ipv4Route_Fragment = (\n  { __typename: 'IPV4Route' }\n  & {\n    ipv4Address: Ipv4Route['address'],\n    ipv4Gateway: Ipv4Route['gateway'],\n  }\n);\n\ntype NetRoute_Ipv6Route_Fragment = (\n  { __typename: 'IPV6Route' }\n  & {\n    ipv6Address: Ipv6Route['address'],\n    ipv6Gateway: Ipv6Route['gateway'],\n  }\n);\n\nexport type NetRouteFragment =\n  | NetRoute_Ipv4Route_Fragment\n  | NetRoute_Ipv6Route_Fragment\n;\n\nexport type TestFragment = (\n  { __typename?: 'IPV6Route' }\n  & {\n    ipv6Address: Ipv6Route['address'],\n    ipv6Gateway: Ipv6Route['gateway'],\n  }\n);\n\nexport type QqQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type QqQuery = (\n  { __typename?: 'Query' }\n  & { routes: Array<\n    | (\n      { __typename: 'IPV4Route' }\n      & {\n        ipv4Address: Ipv4Route['address'],\n        ipv4Gateway: Ipv4Route['gateway'],\n      }\n    )\n    | (\n      { __typename: 'IPV6Route' }\n      & {\n        ipv6Address: Ipv6Route['address'],\n        ipv6Gateway: Ipv6Route['gateway'],\n      }\n    )\n  > }\n);\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Selection Set > Should have valid fragments intersection on different types (with usage) #2498 1`] = `\n\"export type TomFragment = (\n  { __typename?: 'Tom' }\n  & Pick<Tom, 'id' | 'foo'>\n);\n\nexport type JerryFragment = (\n  { __typename?: 'Jerry' }\n  & Pick<Jerry, 'id' | 'bar'>\n);\n\ntype User_Tom_Fragment = (\n  { __typename?: 'Tom' }\n  & Pick<Tom, 'id' | 'foo'>\n);\n\ntype User_Jerry_Fragment = (\n  { __typename?: 'Jerry' }\n  & Pick<Jerry, 'id' | 'bar'>\n);\n\nexport type UserFragment =\n  | User_Tom_Fragment\n  | User_Jerry_Fragment\n;\n\nexport type UserQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type UserQueryQuery = (\n  { __typename?: 'Query' }\n  & { user?: Maybe<\n    | (\n      { __typename?: 'Tom' }\n      & Pick<Tom, 'id' | 'foo'>\n    )\n    | (\n      { __typename?: 'Jerry' }\n      & Pick<Jerry, 'id' | 'bar'>\n    )\n  > }\n);\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Union & Interfaces > #4216 - handle fragments against unions and interfaces with flattenGeneratedTypes 1`] = `\n\"export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string; }\n  String: { input: string; output: string; }\n  Boolean: { input: boolean; output: boolean; }\n  Int: { input: number; output: number; }\n  Float: { input: number; output: number; }\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  search?: Maybe<Array<Searchable>>;\n};\n\nexport type Concept = {\n  id?: Maybe<Scalars['String']['output']>;\n};\n\nexport type Dimension = Concept & {\n  __typename?: 'Dimension';\n  id?: Maybe<Scalars['String']['output']>;\n};\n\nexport type DimValue = {\n  __typename?: 'DimValue';\n  dimension?: Maybe<Dimension>;\n  value: Scalars['String']['output'];\n};\n\nexport type Searchable = Dimension | DimValue;\nexport type SearchPopularQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type SearchPopularQuery = (\n  { __typename?: 'Query' }\n  & { search?: Maybe<Array<\n    | (\n      { __typename?: 'Dimension' }\n      & Pick<Dimension, 'id'>\n    )\n    | (\n      { __typename?: 'DimValue' }\n      & Pick<DimValue, 'value'>\n      & { dimension?: Maybe<(\n        { __typename?: 'Dimension' }\n        & Pick<Dimension, 'id'>\n      )> }\n    )\n  >> }\n);\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Union & Interfaces > Should handle union selection sets with both FragmentSpreads and InlineFragments 1`] = `\n\"export type UserQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type UserQueryQuery = (\n  { __typename?: 'Query' }\n  & { user:\n    | (\n      { __typename?: 'User' }\n      & Pick<User, 'login' | 'id'>\n    )\n    | (\n      { __typename?: 'Error2' }\n      & Pick<Error2, 'message'>\n    )\n    | (\n      { __typename?: 'Error3' }\n      & Pick<Error3, 'message'>\n      & { info?: Maybe<(\n        { __typename?: 'AdditionalInfo' }\n        & Pick<AdditionalInfo, 'message2' | 'message'>\n      )> }\n    )\n   }\n);\n\nexport type AdditionalInfoFragment = (\n  { __typename?: 'AdditionalInfo' }\n  & Pick<AdditionalInfo, 'message'>\n);\n\ntype UserResult1_User_Fragment = (\n  { __typename?: 'User' }\n  & Pick<User, 'id'>\n);\n\ntype UserResult1_Error2_Fragment = { __typename?: 'Error2' };\n\ntype UserResult1_Error3_Fragment = (\n  { __typename?: 'Error3' }\n  & { info?: Maybe<(\n    { __typename?: 'AdditionalInfo' }\n    & Pick<AdditionalInfo, 'message2'>\n  )> }\n);\n\nexport type UserResult1Fragment =\n  | UserResult1_User_Fragment\n  | UserResult1_Error2_Fragment\n  | UserResult1_Error3_Fragment\n;\n\ntype UserResult_User_Fragment = (\n  { __typename?: 'User' }\n  & Pick<User, 'id'>\n);\n\ntype UserResult_Error2_Fragment = (\n  { __typename?: 'Error2' }\n  & Pick<Error2, 'message'>\n);\n\ntype UserResult_Error3_Fragment = { __typename?: 'Error3' };\n\nexport type UserResultFragment =\n  | UserResult_User_Fragment\n  | UserResult_Error2_Fragment\n  | UserResult_Error3_Fragment\n;\n\"\n`;\n\nexports[`TypeScript Operations Plugin > Union & Interfaces > Should handle union selection sets with both FragmentSpreads and InlineFragments with flattenGeneratedTypes 1`] = `\n\"export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string; }\n  String: { input: string; output: string; }\n  Boolean: { input: boolean; output: boolean; }\n  Int: { input: number; output: number; }\n  Float: { input: number; output: number; }\n};\n\nexport type Error = {\n  message: Scalars['String']['output'];\n};\n\nexport type Error1 = Error & {\n  __typename?: 'Error1';\n  message: Scalars['String']['output'];\n};\n\nexport type Error2 = Error & {\n  __typename?: 'Error2';\n  message: Scalars['String']['output'];\n};\n\nexport type Error3 = Error & {\n  __typename?: 'Error3';\n  message: Scalars['String']['output'];\n  info?: Maybe<AdditionalInfo>;\n};\n\nexport type AdditionalInfo = {\n  __typename?: 'AdditionalInfo';\n  message: Scalars['String']['output'];\n  message2: Scalars['String']['output'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  id: Scalars['ID']['output'];\n  login: Scalars['String']['output'];\n};\n\nexport type UserResult = User | Error2 | Error3;\n\nexport type Query = {\n  __typename?: 'Query';\n  user: UserResult;\n};\nexport type UserQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type UserQueryQuery = (\n  { __typename?: 'Query' }\n  & { user:\n    | (\n      { __typename?: 'User' }\n      & Pick<User, 'id' | 'login'>\n    )\n    | (\n      { __typename?: 'Error2' }\n      & Pick<Error2, 'message'>\n    )\n    | (\n      { __typename?: 'Error3' }\n      & Pick<Error3, 'message'>\n      & { info?: Maybe<(\n        { __typename?: 'AdditionalInfo' }\n        & Pick<AdditionalInfo, 'message2' | 'message'>\n      )> }\n    )\n   }\n);\n\n        function t(q: UserQueryQuery) {\n            if (q.user) {\n                if (q.user.__typename === 'User') {\n                    if (q.user.id) {\n                        const u = q.user.login;\n                    }\n                }\n                if (q.user.__typename === 'Error2') {\n                    console.log(q.user.message);\n                }\n                if (q.user.__typename === 'Error3') {\n                    if (q.user.info) {\n                        console.log(q.user.info.__typename)\n                    }\n                }\n            }\n        }\"\n`;\n\nexports[`TypeScript Operations Plugin > Union & Interfaces > Should handle union selection sets with both FragmentSpreads and InlineFragments with flattenGeneratedTypes and directives 1`] = `\n\"export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string; }\n  String: { input: string; output: string; }\n  Boolean: { input: boolean; output: boolean; }\n  Int: { input: number; output: number; }\n  Float: { input: number; output: number; }\n};\n\nexport type Error = {\n  message: Scalars['String']['output'];\n};\n\nexport type Error1 = Error & {\n  __typename?: 'Error1';\n  message: Scalars['String']['output'];\n};\n\nexport type Error2 = Error & {\n  __typename?: 'Error2';\n  message: Scalars['String']['output'];\n};\n\nexport type Error3 = Error & {\n  __typename?: 'Error3';\n  message: Scalars['String']['output'];\n  info?: Maybe<AdditionalInfo>;\n};\n\nexport type AdditionalInfo = {\n  __typename?: 'AdditionalInfo';\n  message: Scalars['String']['output'];\n  message2: Scalars['String']['output'];\n};\n\nexport type User = {\n  __typename?: 'User';\n  id: Scalars['ID']['output'];\n  login: Scalars['String']['output'];\n  test?: Maybe<Scalars['String']['output']>;\n  test2?: Maybe<Scalars['String']['output']>;\n};\n\nexport type UserResult = User | Error2 | Error3;\n\nexport type Query = {\n  __typename?: 'Query';\n  user: UserResult;\n};\nexport type UserQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n\nexport type UserQueryQuery = (\n  { __typename?: 'Query' }\n  & { user:\n    | (\n      { __typename?: 'User' }\n      & Pick<\n        User,\n        | 'id'\n        | 'test2'\n        | 'login'\n        | 'test'\n      >\n    )\n    | (\n      { __typename?: 'Error2' }\n      & Pick<Error2, 'message'>\n    )\n    | (\n      { __typename?: 'Error3' }\n      & Pick<Error3, 'message'>\n      & { info?: Maybe<(\n        { __typename?: 'AdditionalInfo' }\n        & Pick<AdditionalInfo, 'message2' | 'message'>\n      )> }\n    )\n   }\n);\n\n        function t(q: UserQueryQuery) {\n            if (q.user) {\n                if (q.user.__typename === 'User') {\n                    if (q.user.id) {\n                        const u = q.user.login;\n                    }\n                }\n                if (q.user.__typename === 'Error2') {\n                    console.log(q.user.message);\n                }\n                if (q.user.__typename === 'Error3') {\n                    if (q.user.info) {\n                        console.log(q.user.info.__typename)\n                    }\n                }\n            }\n        }\"\n`;\n"
  },
  {
    "path": "packages/plugins/typescript/operations/tests/extract-all-types.spec.ts",
    "content": "import { mergeOutputs, Types } from '@graphql-codegen/plugin-helpers';\nimport { validateTs } from '@graphql-codegen/testing';\nimport { buildSchema, parse } from 'graphql';\nimport { plugin as tsPlugin } from '../../typescript/src/index.js';\nimport { plugin, TypeScriptDocumentsPluginConfig } from '../src/index.js';\n\ndescribe('extractAllFieldsToTypes: true', () => {\n  const validate = async (content: Types.PluginOutput, config: any = {}, pluginSchema) => {\n    const m = mergeOutputs([await tsPlugin(pluginSchema, [], config, { outputFile: '' }), content]);\n    validateTs(m, undefined, undefined, undefined, []);\n\n    return m;\n  };\n\n  const dummyUserTestSchema = buildSchema(/* GraphQL */ `\n    scalar Date\n    type Query {\n      me: User\n    }\n    interface User {\n      id: ID!\n      joinDate: Date!\n    }\n    type DummyUser implements User {\n      id: ID!\n      joinDate: Date!\n    }\n    type ActiveUser implements User {\n      id: ID!\n      joinDate: Date!\n      isActive: Boolean!\n      parentUser: User!\n      thing: String!\n    }\n  `);\n\n  const dummyUserDoc = parse(/* GraphQL */ `\n    fragment UserFragment on User {\n      id\n      joinDate\n    }\n    fragment Me on User {\n      id\n      ...UserFragment\n      ... on ActiveUser {\n        isActive\n        parentUser {\n          ...UserFragment\n        }\n      }\n    }\n    query OverlappingFieldsMergingTest {\n      # this should be optimized to be: me { ...Me } since they're both selecting for 'id'\n      me {\n        id\n        ...Me\n      }\n    }\n    query NestedOverlappingFieldsMergingTest {\n      # an optimization here would be for these to merge,\n      # since ParentMe selects for the same things as the field selection in: me { id }\n      me {\n        ...Me\n        ... on ActiveUser {\n          isActive\n        }\n      }\n    }\n  `);\n\n  it('should extract types from queries', async () => {\n    const config: TypeScriptDocumentsPluginConfig = {\n      preResolveTypes: true,\n      extractAllFieldsToTypes: true,\n      printFieldsOnNewLines: true,\n      nonOptionalTypename: true,\n      dedupeOperationSuffix: true,\n    };\n    const { content } = await plugin(\n      dummyUserTestSchema,\n      [{ location: 'test-file.ts', document: dummyUserDoc }],\n      config,\n      { outputFile: '' }\n    );\n    expect(content).toMatchInlineSnapshot(`\n      \"type UserFragment_DummyUser = {\n        __typename: 'DummyUser',\n        id: string,\n        joinDate: any\n      };\n\n      type UserFragment_ActiveUser = {\n        __typename: 'ActiveUser',\n        id: string,\n        joinDate: any\n      };\n\n      export type UserFragment =\n        | UserFragment_DummyUser\n        | UserFragment_ActiveUser\n      ;\n\n      export type MeFragment_ActiveUser_parentUser_DummyUser = {\n        __typename: 'DummyUser',\n        id: string,\n        joinDate: any\n      };\n\n      export type MeFragment_ActiveUser_parentUser_ActiveUser = {\n        __typename: 'ActiveUser',\n        id: string,\n        joinDate: any\n      };\n\n      export type MeFragment_ActiveUser_parentUser =\n        | MeFragment_ActiveUser_parentUser_DummyUser\n        | MeFragment_ActiveUser_parentUser_ActiveUser\n      ;\n\n      type Me_DummyUser_Fragment = {\n        __typename: 'DummyUser',\n        id: string,\n        joinDate: any\n      };\n\n      type Me_ActiveUser_Fragment = {\n        __typename: 'ActiveUser',\n        isActive: boolean,\n        id: string,\n        joinDate: any,\n        parentUser: MeFragment_ActiveUser_parentUser\n      };\n\n      export type MeFragment =\n        | Me_DummyUser_Fragment\n        | Me_ActiveUser_Fragment\n      ;\n\n      export type OverlappingFieldsMergingTestQuery_me_DummyUser = {\n        __typename: 'DummyUser',\n        id: string,\n        joinDate: any\n      };\n\n      export type OverlappingFieldsMergingTestQuery_me_ActiveUser = {\n        __typename: 'ActiveUser',\n        id: string,\n        isActive: boolean,\n        joinDate: any,\n        parentUser: MeFragment_ActiveUser_parentUser\n      };\n\n      export type OverlappingFieldsMergingTestQuery_me =\n        | OverlappingFieldsMergingTestQuery_me_DummyUser\n        | OverlappingFieldsMergingTestQuery_me_ActiveUser\n      ;\n\n      export type OverlappingFieldsMergingTestQuery_Query = {\n        __typename: 'Query',\n        me?: OverlappingFieldsMergingTestQuery_me | null\n      };\n\n\n      export type OverlappingFieldsMergingTestQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type OverlappingFieldsMergingTestQuery = OverlappingFieldsMergingTestQuery_Query;\n\n      export type NestedOverlappingFieldsMergingTestQuery_me_DummyUser = {\n        __typename: 'DummyUser',\n        id: string,\n        joinDate: any\n      };\n\n      export type NestedOverlappingFieldsMergingTestQuery_me_ActiveUser = {\n        __typename: 'ActiveUser',\n        isActive: boolean,\n        id: string,\n        joinDate: any,\n        parentUser: MeFragment_ActiveUser_parentUser\n      };\n\n      export type NestedOverlappingFieldsMergingTestQuery_me =\n        | NestedOverlappingFieldsMergingTestQuery_me_DummyUser\n        | NestedOverlappingFieldsMergingTestQuery_me_ActiveUser\n      ;\n\n      export type NestedOverlappingFieldsMergingTestQuery_Query = {\n        __typename: 'Query',\n        me?: NestedOverlappingFieldsMergingTestQuery_me | null\n      };\n\n\n      export type NestedOverlappingFieldsMergingTestQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type NestedOverlappingFieldsMergingTestQuery = NestedOverlappingFieldsMergingTestQuery_Query;\n      \"\n    `);\n\n    await validate(content, config, dummyUserTestSchema);\n  });\n\n  const complexTestSchemaWithUnionsAndInterfaces = buildSchema(/* GraphQL */ `\n    interface GenericCallSummary {\n      id: ID!\n      timestamp: String!\n      summary: String!\n      isTrusted: Boolean!\n    }\n\n    type CallerID {\n      phone: String!\n      formattedPhone: String!\n      name: String\n    }\n\n    enum CallType {\n      OUTGOING\n      INCOMING\n      VOICEMAIL\n      UNKNOWN\n    }\n\n    type TalkInteraction {\n      channel: String!\n      rel: String\n\n      type: CallType!\n\n      from: CallerID\n      to: CallerID\n    }\n\n    interface ConnectionNode {\n      id: ID!\n    }\n\n    interface ConversationEvent implements ConnectionNode {\n      id: ID!\n      timestamp: String!\n      originatedFrom: OriginatedFrom!\n    }\n\n    type BrokenConversationEvent implements ConversationEvent & ConnectionNode {\n      id: ID!\n      timestamp: String!\n\n      originatedFrom: OriginatedFrom!\n      extraField: String!\n    }\n\n    union OriginatedFrom =\n        EmailInteraction\n      | CustomChannelInteraction\n      | TalkInteraction\n      | NativeMessagingInteraction\n      | WhatsAppInteraction\n      | WeChatInteraction\n      | NotImplementedOriginatedFrom\n\n    type NotImplementedOriginatedFrom {\n      channel: String\n      rel: String\n    }\n\n    type EmailInteraction {\n      originalEmailURLPath: String!\n    }\n\n    interface ChannelInteraction {\n      externalId: String!\n      timestamp: String!\n      resourceType: String!\n      version: Int!\n    }\n\n    type CustomChannelInteraction implements ChannelInteraction {\n      externalId: String!\n      timestamp: String!\n      resourceType: String!\n      version: Int!\n    }\n\n    interface BrandedConversation {\n      conversationId: ID\n    }\n\n    type NativeMessagingInteraction implements BrandedConversation {\n      conversationId: ID\n    }\n\n    type WhatsAppInteraction implements BrandedConversation {\n      conversationId: ID\n    }\n\n    type WeChatInteraction implements BrandedConversation {\n      conversationId: ID\n    }\n\n    type ArchivedArticle {\n      id: ID!\n      title: String!\n      url: String!\n      htmlUrl: String!\n    }\n\n    type BotSolution implements ConnectionNode & ConversationEvent {\n      id: ID!\n      timestamp: String!\n      originatedFrom: OriginatedFrom!\n\n      article: ArchivedArticle!\n    }\n\n    type TalkPublicCallSummary implements ConnectionNode & ConversationEvent & GenericCallSummary {\n      id: ID!\n      timestamp: String!\n      summary: String!\n      isTrusted: Boolean!\n      originatedFrom: OriginatedFrom!\n    }\n  `);\n\n  const fragmentsOnComplexSchema = parse(/* GraphQL */ `\n    fragment ConversationBotSolution on BotSolution {\n      id\n      ...ConversationConversationEvent\n      article {\n        id\n        htmlUrl\n        title\n        url\n      }\n      originatedFrom {\n        ...ConversationOriginatedFrom\n      }\n    }\n\n    fragment ConversationGenericCallSummary on GenericCallSummary {\n      id\n      summary\n    }\n    fragment ConversationTalkInteraction on TalkInteraction {\n      channel\n      type\n    }\n    fragment ConversationConversationEvent on ConversationEvent {\n      __typename\n      id\n      timestamp\n      originatedFrom {\n        ...ConversationOriginatedFrom\n      }\n    }\n\n    fragment MessageEnvelopeData on OriginatedFrom {\n      ... on EmailInteraction {\n        originalEmailURLPath\n      }\n    }\n\n    fragment AnyChannelOriginatedFrom on CustomChannelInteraction {\n      externalId\n      timestamp\n      resourceType\n    }\n\n    fragment ConversationOriginatedFrom on OriginatedFrom {\n      __typename\n      ... on BrandedConversation {\n        conversationId\n      }\n      ...MessageEnvelopeData\n      ...AnyChannelOriginatedFrom\n    }\n\n    fragment ConversationTalkPublicCallSummary on TalkPublicCallSummary {\n      id\n      ...ConversationConversationEvent\n      ...ConversationGenericCallSummary\n      originatedFrom {\n        ... on TalkInteraction {\n          ...ConversationTalkInteraction\n        }\n      }\n    }\n  `);\n\n  it('should extract types from multiple fragments', async () => {\n    const config: TypeScriptDocumentsPluginConfig = {\n      preResolveTypes: true,\n      extractAllFieldsToTypes: true,\n      nonOptionalTypename: true,\n      dedupeOperationSuffix: true,\n    };\n    const { content } = await plugin(\n      complexTestSchemaWithUnionsAndInterfaces,\n      [{ location: 'test-file.ts', document: fragmentsOnComplexSchema }],\n      config,\n      { outputFile: '' }\n    );\n    expect(content).toMatchInlineSnapshot(`\n      \"export type ConversationBotSolutionFragment_BotSolution_article_ArchivedArticle = { __typename: 'ArchivedArticle', id: string, htmlUrl: string, title: string, url: string };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_EmailInteraction = { __typename: 'EmailInteraction', originalEmailURLPath: string };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_CustomChannelInteraction = { __typename: 'CustomChannelInteraction', externalId: string, timestamp: string, resourceType: string };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_TalkInteraction = { __typename: 'TalkInteraction' };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_NativeMessagingInteraction = { __typename: 'NativeMessagingInteraction', conversationId?: string | null };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_WhatsAppInteraction = { __typename: 'WhatsAppInteraction', conversationId?: string | null };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_WeChatInteraction = { __typename: 'WeChatInteraction', conversationId?: string | null };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_NotImplementedOriginatedFrom = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom =\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_EmailInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_CustomChannelInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_TalkInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_NativeMessagingInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_WhatsAppInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_WeChatInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      export type ConversationBotSolutionFragment = { __typename: 'BotSolution', id: string, timestamp: string, article: ConversationBotSolutionFragment_BotSolution_article_ArchivedArticle, originatedFrom: ConversationBotSolutionFragment_BotSolution_originatedFrom };\n\n      export type ConversationGenericCallSummaryFragment = { __typename: 'TalkPublicCallSummary', id: string, summary: string };\n\n      export type ConversationTalkInteractionFragment = { __typename: 'TalkInteraction', channel: string, type: CallType };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_EmailInteraction = { __typename: 'EmailInteraction', originalEmailURLPath: string };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_CustomChannelInteraction = { __typename: 'CustomChannelInteraction', externalId: string, timestamp: string, resourceType: string };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_TalkInteraction = { __typename: 'TalkInteraction' };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_NativeMessagingInteraction = { __typename: 'NativeMessagingInteraction', conversationId?: string | null };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_WhatsAppInteraction = { __typename: 'WhatsAppInteraction', conversationId?: string | null };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_WeChatInteraction = { __typename: 'WeChatInteraction', conversationId?: string | null };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_NotImplementedOriginatedFrom = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom =\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_EmailInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_CustomChannelInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_TalkInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_NativeMessagingInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_WhatsAppInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_WeChatInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      type ConversationConversationEvent_BrokenConversationEvent_Fragment = { __typename: 'BrokenConversationEvent', id: string, timestamp: string, originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom };\n\n      type ConversationConversationEvent_BotSolution_Fragment = { __typename: 'BotSolution', id: string, timestamp: string, originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom };\n\n      type ConversationConversationEvent_TalkPublicCallSummary_Fragment = { __typename: 'TalkPublicCallSummary', id: string, timestamp: string, originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom };\n\n      export type ConversationConversationEventFragment =\n        | ConversationConversationEvent_BrokenConversationEvent_Fragment\n        | ConversationConversationEvent_BotSolution_Fragment\n        | ConversationConversationEvent_TalkPublicCallSummary_Fragment\n      ;\n\n      type MessageEnvelopeData_EmailInteraction_Fragment = { __typename: 'EmailInteraction', originalEmailURLPath: string };\n\n      type MessageEnvelopeData_CustomChannelInteraction_Fragment = { __typename: 'CustomChannelInteraction' };\n\n      type MessageEnvelopeData_TalkInteraction_Fragment = { __typename: 'TalkInteraction' };\n\n      type MessageEnvelopeData_NativeMessagingInteraction_Fragment = { __typename: 'NativeMessagingInteraction' };\n\n      type MessageEnvelopeData_WhatsAppInteraction_Fragment = { __typename: 'WhatsAppInteraction' };\n\n      type MessageEnvelopeData_WeChatInteraction_Fragment = { __typename: 'WeChatInteraction' };\n\n      type MessageEnvelopeData_NotImplementedOriginatedFrom_Fragment = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type MessageEnvelopeDataFragment =\n        | MessageEnvelopeData_EmailInteraction_Fragment\n        | MessageEnvelopeData_CustomChannelInteraction_Fragment\n        | MessageEnvelopeData_TalkInteraction_Fragment\n        | MessageEnvelopeData_NativeMessagingInteraction_Fragment\n        | MessageEnvelopeData_WhatsAppInteraction_Fragment\n        | MessageEnvelopeData_WeChatInteraction_Fragment\n        | MessageEnvelopeData_NotImplementedOriginatedFrom_Fragment\n      ;\n\n      export type AnyChannelOriginatedFromFragment = { __typename: 'CustomChannelInteraction', externalId: string, timestamp: string, resourceType: string };\n\n      type ConversationOriginatedFrom_EmailInteraction_Fragment = { __typename: 'EmailInteraction', originalEmailURLPath: string };\n\n      type ConversationOriginatedFrom_CustomChannelInteraction_Fragment = { __typename: 'CustomChannelInteraction', externalId: string, timestamp: string, resourceType: string };\n\n      type ConversationOriginatedFrom_TalkInteraction_Fragment = { __typename: 'TalkInteraction' };\n\n      type ConversationOriginatedFrom_NativeMessagingInteraction_Fragment = { __typename: 'NativeMessagingInteraction', conversationId?: string | null };\n\n      type ConversationOriginatedFrom_WhatsAppInteraction_Fragment = { __typename: 'WhatsAppInteraction', conversationId?: string | null };\n\n      type ConversationOriginatedFrom_WeChatInteraction_Fragment = { __typename: 'WeChatInteraction', conversationId?: string | null };\n\n      type ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type ConversationOriginatedFromFragment =\n        | ConversationOriginatedFrom_EmailInteraction_Fragment\n        | ConversationOriginatedFrom_CustomChannelInteraction_Fragment\n        | ConversationOriginatedFrom_TalkInteraction_Fragment\n        | ConversationOriginatedFrom_NativeMessagingInteraction_Fragment\n        | ConversationOriginatedFrom_WhatsAppInteraction_Fragment\n        | ConversationOriginatedFrom_WeChatInteraction_Fragment\n        | ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment\n      ;\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_EmailInteraction = { __typename: 'EmailInteraction', originalEmailURLPath: string };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_CustomChannelInteraction = { __typename: 'CustomChannelInteraction', externalId: string, timestamp: string, resourceType: string };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_TalkInteraction = { __typename: 'TalkInteraction', channel: string, type: CallType };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NativeMessagingInteraction = { __typename: 'NativeMessagingInteraction', conversationId?: string | null };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WhatsAppInteraction = { __typename: 'WhatsAppInteraction', conversationId?: string | null };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WeChatInteraction = { __typename: 'WeChatInteraction', conversationId?: string | null };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NotImplementedOriginatedFrom = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom =\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_EmailInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_CustomChannelInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_TalkInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NativeMessagingInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WhatsAppInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WeChatInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      export type ConversationTalkPublicCallSummaryFragment = { __typename: 'TalkPublicCallSummary', id: string, timestamp: string, summary: string, originatedFrom: ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom };\n      \"\n    `);\n\n    await validate(content, config, complexTestSchemaWithUnionsAndInterfaces);\n  });\n\n  it('should extract types from multiple fragments (mergeFragmentTypes: true)', async () => {\n    const config: TypeScriptDocumentsPluginConfig = {\n      preResolveTypes: true,\n      extractAllFieldsToTypes: true,\n      nonOptionalTypename: true,\n      dedupeOperationSuffix: true,\n      mergeFragmentTypes: true,\n    };\n    const { content } = await plugin(\n      complexTestSchemaWithUnionsAndInterfaces,\n      [{ location: 'test-file.ts', document: fragmentsOnComplexSchema }],\n      config,\n      { outputFile: '' }\n    );\n    expect(content).toMatchInlineSnapshot(`\n      \"export type ConversationBotSolutionFragment_BotSolution_article_ArchivedArticle = (\n        { id: string, htmlUrl: string, title: string, url: string }\n        & { __typename: 'ArchivedArticle' }\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_EmailInteraction = (\n        { originalEmailURLPath: string }\n        & { __typename: 'EmailInteraction' }\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_CustomChannelInteraction = (\n        { externalId: string, timestamp: string, resourceType: string }\n        & { __typename: 'CustomChannelInteraction' }\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_TalkInteraction_NotImplementedOriginatedFrom = { __typename: 'TalkInteraction' | 'NotImplementedOriginatedFrom' };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_NativeMessagingInteraction_WhatsAppInteraction_WeChatInteraction = (\n        { conversationId?: string | null }\n        & { __typename: 'NativeMessagingInteraction' | 'WhatsAppInteraction' | 'WeChatInteraction' }\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom =\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_EmailInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_CustomChannelInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_TalkInteraction_NotImplementedOriginatedFrom\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_NativeMessagingInteraction_WhatsAppInteraction_WeChatInteraction\n      ;\n\n      export type ConversationBotSolutionFragment = (\n        { id: string, timestamp: string, article: ConversationBotSolutionFragment_BotSolution_article_ArchivedArticle, originatedFrom: ConversationBotSolutionFragment_BotSolution_originatedFrom }\n        & { __typename: 'BotSolution' }\n      );\n\n      export type ConversationGenericCallSummaryFragment = (\n        { id: string, summary: string }\n        & { __typename: 'TalkPublicCallSummary' }\n      );\n\n      export type ConversationTalkInteractionFragment = (\n        { channel: string, type: CallType }\n        & { __typename: 'TalkInteraction' }\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_EmailInteraction = (\n        { originalEmailURLPath: string }\n        & { __typename: 'EmailInteraction' }\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_CustomChannelInteraction = (\n        { externalId: string, timestamp: string, resourceType: string }\n        & { __typename: 'CustomChannelInteraction' }\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_TalkInteraction_NotImplementedOriginatedFrom = { __typename: 'TalkInteraction' | 'NotImplementedOriginatedFrom' };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_NativeMessagingInteraction_WhatsAppInteraction_WeChatInteraction = (\n        { conversationId?: string | null }\n        & { __typename: 'NativeMessagingInteraction' | 'WhatsAppInteraction' | 'WeChatInteraction' }\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom =\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_EmailInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_CustomChannelInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_TalkInteraction_NotImplementedOriginatedFrom\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_NativeMessagingInteraction_WhatsAppInteraction_WeChatInteraction\n      ;\n\n      export type ConversationConversationEventFragment = (\n        { id: string, timestamp: string, originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom }\n        & { __typename: 'BrokenConversationEvent' | 'BotSolution' | 'TalkPublicCallSummary' }\n      );\n\n      type MessageEnvelopeData_EmailInteraction_Fragment = (\n        { originalEmailURLPath: string }\n        & { __typename: 'EmailInteraction' }\n      );\n\n      type MessageEnvelopeData_8FBboKcmuva72FpaH1zuPdoYyrlyvueTn9fqP1dFi_Fragment = { __typename: 'CustomChannelInteraction' | 'TalkInteraction' | 'NativeMessagingInteraction' | 'WhatsAppInteraction' | 'WeChatInteraction' | 'NotImplementedOriginatedFrom' };\n\n      export type MessageEnvelopeDataFragment =\n        | MessageEnvelopeData_EmailInteraction_Fragment\n        | MessageEnvelopeData_8FBboKcmuva72FpaH1zuPdoYyrlyvueTn9fqP1dFi_Fragment\n      ;\n\n      export type AnyChannelOriginatedFromFragment = (\n        { externalId: string, timestamp: string, resourceType: string }\n        & { __typename: 'CustomChannelInteraction' }\n      );\n\n      type ConversationOriginatedFrom_EmailInteraction_Fragment = (\n        { originalEmailURLPath: string }\n        & { __typename: 'EmailInteraction' }\n      );\n\n      type ConversationOriginatedFrom_CustomChannelInteraction_Fragment = (\n        { externalId: string, timestamp: string, resourceType: string }\n        & { __typename: 'CustomChannelInteraction' }\n      );\n\n      type ConversationOriginatedFrom_TalkInteraction_NotImplementedOriginatedFrom_Fragment = { __typename: 'TalkInteraction' | 'NotImplementedOriginatedFrom' };\n\n      type ConversationOriginatedFrom_NativeMessagingInteraction_WhatsAppInteraction_WeChatInteraction_Fragment = (\n        { conversationId?: string | null }\n        & { __typename: 'NativeMessagingInteraction' | 'WhatsAppInteraction' | 'WeChatInteraction' }\n      );\n\n      export type ConversationOriginatedFromFragment =\n        | ConversationOriginatedFrom_EmailInteraction_Fragment\n        | ConversationOriginatedFrom_CustomChannelInteraction_Fragment\n        | ConversationOriginatedFrom_TalkInteraction_NotImplementedOriginatedFrom_Fragment\n        | ConversationOriginatedFrom_NativeMessagingInteraction_WhatsAppInteraction_WeChatInteraction_Fragment\n      ;\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_EmailInteraction = (\n        { originalEmailURLPath: string }\n        & { __typename: 'EmailInteraction' }\n      );\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_CustomChannelInteraction = (\n        { externalId: string, timestamp: string, resourceType: string }\n        & { __typename: 'CustomChannelInteraction' }\n      );\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_TalkInteraction = (\n        { channel: string, type: CallType }\n        & { __typename: 'TalkInteraction' }\n      );\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NativeMessagingInteraction_WhatsAppInteraction_WeChatInteraction = (\n        { conversationId?: string | null }\n        & { __typename: 'NativeMessagingInteraction' | 'WhatsAppInteraction' | 'WeChatInteraction' }\n      );\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NotImplementedOriginatedFrom = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom =\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_EmailInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_CustomChannelInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_TalkInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NativeMessagingInteraction_WhatsAppInteraction_WeChatInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      export type ConversationTalkPublicCallSummaryFragment = (\n        { id: string, timestamp: string, summary: string, originatedFrom: ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom }\n        & { __typename: 'TalkPublicCallSummary' }\n      );\n      \"\n    `);\n\n    await validate(content, config, complexTestSchemaWithUnionsAndInterfaces);\n  });\n\n  it(\"should extract types from multiple fragments (inlineFragmentTypes: 'combine')\", async () => {\n    const config: TypeScriptDocumentsPluginConfig = {\n      preResolveTypes: true,\n      extractAllFieldsToTypes: true,\n      nonOptionalTypename: true,\n      dedupeOperationSuffix: true,\n      inlineFragmentTypes: 'combine',\n    };\n    const { content } = await plugin(\n      complexTestSchemaWithUnionsAndInterfaces,\n      [{ location: 'test-file.ts', document: fragmentsOnComplexSchema }],\n      config,\n      { outputFile: '' }\n    );\n    expect(content).toMatchInlineSnapshot(`\n      \"export type ConversationBotSolutionFragment_BotSolution_article_ArchivedArticle = { __typename: 'ArchivedArticle', id: string, htmlUrl: string, title: string, url: string };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_EmailInteraction = (\n        { __typename: 'EmailInteraction' }\n        & ConversationOriginatedFrom_EmailInteraction_Fragment\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_CustomChannelInteraction = (\n        { __typename: 'CustomChannelInteraction' }\n        & ConversationOriginatedFrom_CustomChannelInteraction_Fragment\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_TalkInteraction = (\n        { __typename: 'TalkInteraction' }\n        & ConversationOriginatedFrom_TalkInteraction_Fragment\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_NativeMessagingInteraction = (\n        { __typename: 'NativeMessagingInteraction' }\n        & ConversationOriginatedFrom_NativeMessagingInteraction_Fragment\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_WhatsAppInteraction = (\n        { __typename: 'WhatsAppInteraction' }\n        & ConversationOriginatedFrom_WhatsAppInteraction_Fragment\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_WeChatInteraction = (\n        { __typename: 'WeChatInteraction' }\n        & ConversationOriginatedFrom_WeChatInteraction_Fragment\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_NotImplementedOriginatedFrom = (\n        { __typename: 'NotImplementedOriginatedFrom' }\n        & ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom =\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_EmailInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_CustomChannelInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_TalkInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_NativeMessagingInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_WhatsAppInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_WeChatInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      export type ConversationBotSolutionFragment = (\n        { __typename: 'BotSolution', id: string, article: ConversationBotSolutionFragment_BotSolution_article_ArchivedArticle, originatedFrom: ConversationBotSolutionFragment_BotSolution_originatedFrom }\n        & ConversationConversationEvent_BotSolution_Fragment\n      );\n\n      export type ConversationGenericCallSummaryFragment = { __typename: 'TalkPublicCallSummary', id: string, summary: string };\n\n      export type ConversationTalkInteractionFragment = { __typename: 'TalkInteraction', channel: string, type: CallType };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_EmailInteraction = (\n        { __typename: 'EmailInteraction' }\n        & ConversationOriginatedFrom_EmailInteraction_Fragment\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_CustomChannelInteraction = (\n        { __typename: 'CustomChannelInteraction' }\n        & ConversationOriginatedFrom_CustomChannelInteraction_Fragment\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_TalkInteraction = (\n        { __typename: 'TalkInteraction' }\n        & ConversationOriginatedFrom_TalkInteraction_Fragment\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_NativeMessagingInteraction = (\n        { __typename: 'NativeMessagingInteraction' }\n        & ConversationOriginatedFrom_NativeMessagingInteraction_Fragment\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_WhatsAppInteraction = (\n        { __typename: 'WhatsAppInteraction' }\n        & ConversationOriginatedFrom_WhatsAppInteraction_Fragment\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_WeChatInteraction = (\n        { __typename: 'WeChatInteraction' }\n        & ConversationOriginatedFrom_WeChatInteraction_Fragment\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_NotImplementedOriginatedFrom = (\n        { __typename: 'NotImplementedOriginatedFrom' }\n        & ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom =\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_EmailInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_CustomChannelInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_TalkInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_NativeMessagingInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_WhatsAppInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_WeChatInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      type ConversationConversationEvent_BrokenConversationEvent_Fragment = { __typename: 'BrokenConversationEvent', id: string, timestamp: string, originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom };\n\n      type ConversationConversationEvent_BotSolution_Fragment = { __typename: 'BotSolution', id: string, timestamp: string, originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom };\n\n      type ConversationConversationEvent_TalkPublicCallSummary_Fragment = { __typename: 'TalkPublicCallSummary', id: string, timestamp: string, originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom };\n\n      export type ConversationConversationEventFragment =\n        | ConversationConversationEvent_BrokenConversationEvent_Fragment\n        | ConversationConversationEvent_BotSolution_Fragment\n        | ConversationConversationEvent_TalkPublicCallSummary_Fragment\n      ;\n\n      type MessageEnvelopeData_EmailInteraction_Fragment = { __typename: 'EmailInteraction', originalEmailURLPath: string };\n\n      type MessageEnvelopeData_CustomChannelInteraction_Fragment = { __typename: 'CustomChannelInteraction' };\n\n      type MessageEnvelopeData_TalkInteraction_Fragment = { __typename: 'TalkInteraction' };\n\n      type MessageEnvelopeData_NativeMessagingInteraction_Fragment = { __typename: 'NativeMessagingInteraction' };\n\n      type MessageEnvelopeData_WhatsAppInteraction_Fragment = { __typename: 'WhatsAppInteraction' };\n\n      type MessageEnvelopeData_WeChatInteraction_Fragment = { __typename: 'WeChatInteraction' };\n\n      type MessageEnvelopeData_NotImplementedOriginatedFrom_Fragment = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type MessageEnvelopeDataFragment =\n        | MessageEnvelopeData_EmailInteraction_Fragment\n        | MessageEnvelopeData_CustomChannelInteraction_Fragment\n        | MessageEnvelopeData_TalkInteraction_Fragment\n        | MessageEnvelopeData_NativeMessagingInteraction_Fragment\n        | MessageEnvelopeData_WhatsAppInteraction_Fragment\n        | MessageEnvelopeData_WeChatInteraction_Fragment\n        | MessageEnvelopeData_NotImplementedOriginatedFrom_Fragment\n      ;\n\n      export type AnyChannelOriginatedFromFragment = { __typename: 'CustomChannelInteraction', externalId: string, timestamp: string, resourceType: string };\n\n      type ConversationOriginatedFrom_EmailInteraction_Fragment = (\n        { __typename: 'EmailInteraction' }\n        & MessageEnvelopeData_EmailInteraction_Fragment\n      );\n\n      type ConversationOriginatedFrom_CustomChannelInteraction_Fragment = (\n        { __typename: 'CustomChannelInteraction' }\n        & MessageEnvelopeData_CustomChannelInteraction_Fragment\n        & AnyChannelOriginatedFromFragment\n      );\n\n      type ConversationOriginatedFrom_TalkInteraction_Fragment = (\n        { __typename: 'TalkInteraction' }\n        & MessageEnvelopeData_TalkInteraction_Fragment\n      );\n\n      type ConversationOriginatedFrom_NativeMessagingInteraction_Fragment = (\n        { __typename: 'NativeMessagingInteraction', conversationId?: string | null }\n        & MessageEnvelopeData_NativeMessagingInteraction_Fragment\n      );\n\n      type ConversationOriginatedFrom_WhatsAppInteraction_Fragment = (\n        { __typename: 'WhatsAppInteraction', conversationId?: string | null }\n        & MessageEnvelopeData_WhatsAppInteraction_Fragment\n      );\n\n      type ConversationOriginatedFrom_WeChatInteraction_Fragment = (\n        { __typename: 'WeChatInteraction', conversationId?: string | null }\n        & MessageEnvelopeData_WeChatInteraction_Fragment\n      );\n\n      type ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment = (\n        { __typename: 'NotImplementedOriginatedFrom' }\n        & MessageEnvelopeData_NotImplementedOriginatedFrom_Fragment\n      );\n\n      export type ConversationOriginatedFromFragment =\n        | ConversationOriginatedFrom_EmailInteraction_Fragment\n        | ConversationOriginatedFrom_CustomChannelInteraction_Fragment\n        | ConversationOriginatedFrom_TalkInteraction_Fragment\n        | ConversationOriginatedFrom_NativeMessagingInteraction_Fragment\n        | ConversationOriginatedFrom_WhatsAppInteraction_Fragment\n        | ConversationOriginatedFrom_WeChatInteraction_Fragment\n        | ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment\n      ;\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_EmailInteraction = { __typename: 'EmailInteraction' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_CustomChannelInteraction = { __typename: 'CustomChannelInteraction' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_TalkInteraction = (\n        { __typename: 'TalkInteraction' }\n        & ConversationTalkInteractionFragment\n      );\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NativeMessagingInteraction = { __typename: 'NativeMessagingInteraction' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WhatsAppInteraction = { __typename: 'WhatsAppInteraction' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WeChatInteraction = { __typename: 'WeChatInteraction' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NotImplementedOriginatedFrom = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom =\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_EmailInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_CustomChannelInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_TalkInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NativeMessagingInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WhatsAppInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WeChatInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      export type ConversationTalkPublicCallSummaryFragment = (\n        { __typename: 'TalkPublicCallSummary', id: string, originatedFrom: ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom }\n        & ConversationConversationEvent_TalkPublicCallSummary_Fragment\n        & ConversationGenericCallSummaryFragment\n      );\n      \"\n    `);\n\n    await validate(content, config, complexTestSchemaWithUnionsAndInterfaces);\n  });\n\n  it(\"should extract types from multiple fragments (inlineFragmentTypes: 'mask')\", async () => {\n    const config: TypeScriptDocumentsPluginConfig = {\n      preResolveTypes: true,\n      extractAllFieldsToTypes: true,\n      nonOptionalTypename: true,\n      dedupeOperationSuffix: true,\n      inlineFragmentTypes: 'mask',\n    };\n    const { content } = await plugin(\n      complexTestSchemaWithUnionsAndInterfaces,\n      [{ location: 'test-file.ts', document: fragmentsOnComplexSchema }],\n      config,\n      { outputFile: '' }\n    );\n    expect(content).toMatchInlineSnapshot(`\n      \"export type ConversationBotSolutionFragment_BotSolution_article_ArchivedArticle = { __typename: 'ArchivedArticle', id: string, htmlUrl: string, title: string, url: string };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_EmailInteraction = (\n        { __typename: 'EmailInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_EmailInteraction_Fragment': ConversationOriginatedFrom_EmailInteraction_Fragment } }\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_CustomChannelInteraction = (\n        { __typename: 'CustomChannelInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_CustomChannelInteraction_Fragment': ConversationOriginatedFrom_CustomChannelInteraction_Fragment } }\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_TalkInteraction = (\n        { __typename: 'TalkInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_TalkInteraction_Fragment': ConversationOriginatedFrom_TalkInteraction_Fragment } }\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_NativeMessagingInteraction = (\n        { __typename: 'NativeMessagingInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_NativeMessagingInteraction_Fragment': ConversationOriginatedFrom_NativeMessagingInteraction_Fragment } }\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_WhatsAppInteraction = (\n        { __typename: 'WhatsAppInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_WhatsAppInteraction_Fragment': ConversationOriginatedFrom_WhatsAppInteraction_Fragment } }\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_WeChatInteraction = (\n        { __typename: 'WeChatInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_WeChatInteraction_Fragment': ConversationOriginatedFrom_WeChatInteraction_Fragment } }\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_NotImplementedOriginatedFrom = (\n        { __typename: 'NotImplementedOriginatedFrom' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment': ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment } }\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom =\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_EmailInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_CustomChannelInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_TalkInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_NativeMessagingInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_WhatsAppInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_WeChatInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      export type ConversationBotSolutionFragment = (\n        { __typename: 'BotSolution', id: string, article: ConversationBotSolutionFragment_BotSolution_article_ArchivedArticle, originatedFrom: ConversationBotSolutionFragment_BotSolution_originatedFrom }\n        & { ' $fragmentRefs'?: { 'ConversationConversationEvent_BotSolution_Fragment': ConversationConversationEvent_BotSolution_Fragment } }\n      ) & { ' $fragmentName'?: 'ConversationBotSolutionFragment' };\n\n      export type ConversationGenericCallSummaryFragment = { __typename: 'TalkPublicCallSummary', id: string, summary: string } & { ' $fragmentName'?: 'ConversationGenericCallSummaryFragment' };\n\n      export type ConversationTalkInteractionFragment = { __typename: 'TalkInteraction', channel: string, type: CallType } & { ' $fragmentName'?: 'ConversationTalkInteractionFragment' };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_EmailInteraction = (\n        { __typename: 'EmailInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_EmailInteraction_Fragment': ConversationOriginatedFrom_EmailInteraction_Fragment } }\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_CustomChannelInteraction = (\n        { __typename: 'CustomChannelInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_CustomChannelInteraction_Fragment': ConversationOriginatedFrom_CustomChannelInteraction_Fragment } }\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_TalkInteraction = (\n        { __typename: 'TalkInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_TalkInteraction_Fragment': ConversationOriginatedFrom_TalkInteraction_Fragment } }\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_NativeMessagingInteraction = (\n        { __typename: 'NativeMessagingInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_NativeMessagingInteraction_Fragment': ConversationOriginatedFrom_NativeMessagingInteraction_Fragment } }\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_WhatsAppInteraction = (\n        { __typename: 'WhatsAppInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_WhatsAppInteraction_Fragment': ConversationOriginatedFrom_WhatsAppInteraction_Fragment } }\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_WeChatInteraction = (\n        { __typename: 'WeChatInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_WeChatInteraction_Fragment': ConversationOriginatedFrom_WeChatInteraction_Fragment } }\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_NotImplementedOriginatedFrom = (\n        { __typename: 'NotImplementedOriginatedFrom' }\n        & { ' $fragmentRefs'?: { 'ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment': ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment } }\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom =\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_EmailInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_CustomChannelInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_TalkInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_NativeMessagingInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_WhatsAppInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_WeChatInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      type ConversationConversationEvent_BrokenConversationEvent_Fragment = { __typename: 'BrokenConversationEvent', id: string, timestamp: string, originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom } & { ' $fragmentName'?: 'ConversationConversationEvent_BrokenConversationEvent_Fragment' };\n\n      type ConversationConversationEvent_BotSolution_Fragment = { __typename: 'BotSolution', id: string, timestamp: string, originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom } & { ' $fragmentName'?: 'ConversationConversationEvent_BotSolution_Fragment' };\n\n      type ConversationConversationEvent_TalkPublicCallSummary_Fragment = { __typename: 'TalkPublicCallSummary', id: string, timestamp: string, originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom } & { ' $fragmentName'?: 'ConversationConversationEvent_TalkPublicCallSummary_Fragment' };\n\n      export type ConversationConversationEventFragment =\n        | ConversationConversationEvent_BrokenConversationEvent_Fragment\n        | ConversationConversationEvent_BotSolution_Fragment\n        | ConversationConversationEvent_TalkPublicCallSummary_Fragment\n      ;\n\n      type MessageEnvelopeData_EmailInteraction_Fragment = { __typename: 'EmailInteraction', originalEmailURLPath: string } & { ' $fragmentName'?: 'MessageEnvelopeData_EmailInteraction_Fragment' };\n\n      type MessageEnvelopeData_CustomChannelInteraction_Fragment = { __typename: 'CustomChannelInteraction' } & { ' $fragmentName'?: 'MessageEnvelopeData_CustomChannelInteraction_Fragment' };\n\n      type MessageEnvelopeData_TalkInteraction_Fragment = { __typename: 'TalkInteraction' } & { ' $fragmentName'?: 'MessageEnvelopeData_TalkInteraction_Fragment' };\n\n      type MessageEnvelopeData_NativeMessagingInteraction_Fragment = { __typename: 'NativeMessagingInteraction' } & { ' $fragmentName'?: 'MessageEnvelopeData_NativeMessagingInteraction_Fragment' };\n\n      type MessageEnvelopeData_WhatsAppInteraction_Fragment = { __typename: 'WhatsAppInteraction' } & { ' $fragmentName'?: 'MessageEnvelopeData_WhatsAppInteraction_Fragment' };\n\n      type MessageEnvelopeData_WeChatInteraction_Fragment = { __typename: 'WeChatInteraction' } & { ' $fragmentName'?: 'MessageEnvelopeData_WeChatInteraction_Fragment' };\n\n      type MessageEnvelopeData_NotImplementedOriginatedFrom_Fragment = { __typename: 'NotImplementedOriginatedFrom' } & { ' $fragmentName'?: 'MessageEnvelopeData_NotImplementedOriginatedFrom_Fragment' };\n\n      export type MessageEnvelopeDataFragment =\n        | MessageEnvelopeData_EmailInteraction_Fragment\n        | MessageEnvelopeData_CustomChannelInteraction_Fragment\n        | MessageEnvelopeData_TalkInteraction_Fragment\n        | MessageEnvelopeData_NativeMessagingInteraction_Fragment\n        | MessageEnvelopeData_WhatsAppInteraction_Fragment\n        | MessageEnvelopeData_WeChatInteraction_Fragment\n        | MessageEnvelopeData_NotImplementedOriginatedFrom_Fragment\n      ;\n\n      export type AnyChannelOriginatedFromFragment = { __typename: 'CustomChannelInteraction', externalId: string, timestamp: string, resourceType: string } & { ' $fragmentName'?: 'AnyChannelOriginatedFromFragment' };\n\n      type ConversationOriginatedFrom_EmailInteraction_Fragment = (\n        { __typename: 'EmailInteraction' }\n        & { ' $fragmentRefs'?: { 'MessageEnvelopeData_EmailInteraction_Fragment': MessageEnvelopeData_EmailInteraction_Fragment } }\n      ) & { ' $fragmentName'?: 'ConversationOriginatedFrom_EmailInteraction_Fragment' };\n\n      type ConversationOriginatedFrom_CustomChannelInteraction_Fragment = (\n        { __typename: 'CustomChannelInteraction' }\n        & { ' $fragmentRefs'?: { 'MessageEnvelopeData_CustomChannelInteraction_Fragment': MessageEnvelopeData_CustomChannelInteraction_Fragment;'AnyChannelOriginatedFromFragment': AnyChannelOriginatedFromFragment } }\n      ) & { ' $fragmentName'?: 'ConversationOriginatedFrom_CustomChannelInteraction_Fragment' };\n\n      type ConversationOriginatedFrom_TalkInteraction_Fragment = (\n        { __typename: 'TalkInteraction' }\n        & { ' $fragmentRefs'?: { 'MessageEnvelopeData_TalkInteraction_Fragment': MessageEnvelopeData_TalkInteraction_Fragment } }\n      ) & { ' $fragmentName'?: 'ConversationOriginatedFrom_TalkInteraction_Fragment' };\n\n      type ConversationOriginatedFrom_NativeMessagingInteraction_Fragment = (\n        { __typename: 'NativeMessagingInteraction', conversationId?: string | null }\n        & { ' $fragmentRefs'?: { 'MessageEnvelopeData_NativeMessagingInteraction_Fragment': MessageEnvelopeData_NativeMessagingInteraction_Fragment } }\n      ) & { ' $fragmentName'?: 'ConversationOriginatedFrom_NativeMessagingInteraction_Fragment' };\n\n      type ConversationOriginatedFrom_WhatsAppInteraction_Fragment = (\n        { __typename: 'WhatsAppInteraction', conversationId?: string | null }\n        & { ' $fragmentRefs'?: { 'MessageEnvelopeData_WhatsAppInteraction_Fragment': MessageEnvelopeData_WhatsAppInteraction_Fragment } }\n      ) & { ' $fragmentName'?: 'ConversationOriginatedFrom_WhatsAppInteraction_Fragment' };\n\n      type ConversationOriginatedFrom_WeChatInteraction_Fragment = (\n        { __typename: 'WeChatInteraction', conversationId?: string | null }\n        & { ' $fragmentRefs'?: { 'MessageEnvelopeData_WeChatInteraction_Fragment': MessageEnvelopeData_WeChatInteraction_Fragment } }\n      ) & { ' $fragmentName'?: 'ConversationOriginatedFrom_WeChatInteraction_Fragment' };\n\n      type ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment = (\n        { __typename: 'NotImplementedOriginatedFrom' }\n        & { ' $fragmentRefs'?: { 'MessageEnvelopeData_NotImplementedOriginatedFrom_Fragment': MessageEnvelopeData_NotImplementedOriginatedFrom_Fragment } }\n      ) & { ' $fragmentName'?: 'ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment' };\n\n      export type ConversationOriginatedFromFragment =\n        | ConversationOriginatedFrom_EmailInteraction_Fragment\n        | ConversationOriginatedFrom_CustomChannelInteraction_Fragment\n        | ConversationOriginatedFrom_TalkInteraction_Fragment\n        | ConversationOriginatedFrom_NativeMessagingInteraction_Fragment\n        | ConversationOriginatedFrom_WhatsAppInteraction_Fragment\n        | ConversationOriginatedFrom_WeChatInteraction_Fragment\n        | ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment\n      ;\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_EmailInteraction = { __typename: 'EmailInteraction' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_CustomChannelInteraction = { __typename: 'CustomChannelInteraction' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_TalkInteraction = (\n        { __typename: 'TalkInteraction' }\n        & { ' $fragmentRefs'?: { 'ConversationTalkInteractionFragment': ConversationTalkInteractionFragment } }\n      );\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NativeMessagingInteraction = { __typename: 'NativeMessagingInteraction' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WhatsAppInteraction = { __typename: 'WhatsAppInteraction' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WeChatInteraction = { __typename: 'WeChatInteraction' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NotImplementedOriginatedFrom = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom =\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_EmailInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_CustomChannelInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_TalkInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NativeMessagingInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WhatsAppInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WeChatInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      export type ConversationTalkPublicCallSummaryFragment = (\n        { __typename: 'TalkPublicCallSummary', id: string, originatedFrom: ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom }\n        & { ' $fragmentRefs'?: { 'ConversationConversationEvent_TalkPublicCallSummary_Fragment': ConversationConversationEvent_TalkPublicCallSummary_Fragment;'ConversationGenericCallSummaryFragment': ConversationGenericCallSummaryFragment } }\n      ) & { ' $fragmentName'?: 'ConversationTalkPublicCallSummaryFragment' };\n      \"\n    `);\n\n    await validate(content, config, complexTestSchemaWithUnionsAndInterfaces);\n  });\n\n  it('should extract types from multiple fragments (preResolveTypes: false)', async () => {\n    const config: TypeScriptDocumentsPluginConfig = {\n      preResolveTypes: false,\n      extractAllFieldsToTypes: true,\n      nonOptionalTypename: true,\n      dedupeOperationSuffix: true,\n    };\n    const { content } = await plugin(\n      complexTestSchemaWithUnionsAndInterfaces,\n      [{ location: 'test-file.ts', document: fragmentsOnComplexSchema }],\n      config,\n      { outputFile: '' }\n    );\n    expect(content).toMatchInlineSnapshot(`\n      \"export type ConversationBotSolutionFragment_BotSolution_article_ArchivedArticle = (\n        { __typename: 'ArchivedArticle' }\n        & Pick<\n          ArchivedArticle,\n          | 'id'\n          | 'htmlUrl'\n          | 'title'\n          | 'url'\n        >\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_EmailInteraction = (\n        { __typename: 'EmailInteraction' }\n        & Pick<EmailInteraction, 'originalEmailURLPath'>\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_CustomChannelInteraction = (\n        { __typename: 'CustomChannelInteraction' }\n        & Pick<CustomChannelInteraction, 'externalId' | 'timestamp' | 'resourceType'>\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_TalkInteraction = { __typename: 'TalkInteraction' };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_NativeMessagingInteraction = (\n        { __typename: 'NativeMessagingInteraction' }\n        & Pick<NativeMessagingInteraction, 'conversationId'>\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_WhatsAppInteraction = (\n        { __typename: 'WhatsAppInteraction' }\n        & Pick<WhatsAppInteraction, 'conversationId'>\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_WeChatInteraction = (\n        { __typename: 'WeChatInteraction' }\n        & Pick<WeChatInteraction, 'conversationId'>\n      );\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom_NotImplementedOriginatedFrom = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type ConversationBotSolutionFragment_BotSolution_originatedFrom =\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_EmailInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_CustomChannelInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_TalkInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_NativeMessagingInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_WhatsAppInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_WeChatInteraction\n        | ConversationBotSolutionFragment_BotSolution_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      export type ConversationBotSolutionFragment = (\n        { __typename: 'BotSolution' }\n        & Pick<BotSolution, 'id' | 'timestamp'>\n        & {\n          article: ConversationBotSolutionFragment_BotSolution_article_ArchivedArticle,\n          originatedFrom: ConversationBotSolutionFragment_BotSolution_originatedFrom,\n        }\n      );\n\n      export type ConversationGenericCallSummaryFragment = (\n        { __typename: 'TalkPublicCallSummary' }\n        & Pick<TalkPublicCallSummary, 'id' | 'summary'>\n      );\n\n      export type ConversationTalkInteractionFragment = (\n        { __typename: 'TalkInteraction' }\n        & Pick<TalkInteraction, 'channel' | 'type'>\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_EmailInteraction = (\n        { __typename: 'EmailInteraction' }\n        & Pick<EmailInteraction, 'originalEmailURLPath'>\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_CustomChannelInteraction = (\n        { __typename: 'CustomChannelInteraction' }\n        & Pick<CustomChannelInteraction, 'externalId' | 'timestamp' | 'resourceType'>\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_TalkInteraction = { __typename: 'TalkInteraction' };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_NativeMessagingInteraction = (\n        { __typename: 'NativeMessagingInteraction' }\n        & Pick<NativeMessagingInteraction, 'conversationId'>\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_WhatsAppInteraction = (\n        { __typename: 'WhatsAppInteraction' }\n        & Pick<WhatsAppInteraction, 'conversationId'>\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_WeChatInteraction = (\n        { __typename: 'WeChatInteraction' }\n        & Pick<WeChatInteraction, 'conversationId'>\n      );\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom_NotImplementedOriginatedFrom = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type ConversationConversationEventFragment_ConversationEvent_originatedFrom =\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_EmailInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_CustomChannelInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_TalkInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_NativeMessagingInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_WhatsAppInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_WeChatInteraction\n        | ConversationConversationEventFragment_ConversationEvent_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      type ConversationConversationEvent_BrokenConversationEvent_Fragment = (\n        { __typename: 'BrokenConversationEvent' }\n        & Pick<BrokenConversationEvent, 'id' | 'timestamp'>\n        & { originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom }\n      );\n\n      type ConversationConversationEvent_BotSolution_Fragment = (\n        { __typename: 'BotSolution' }\n        & Pick<BotSolution, 'id' | 'timestamp'>\n        & { originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom }\n      );\n\n      type ConversationConversationEvent_TalkPublicCallSummary_Fragment = (\n        { __typename: 'TalkPublicCallSummary' }\n        & Pick<TalkPublicCallSummary, 'id' | 'timestamp'>\n        & { originatedFrom: ConversationConversationEventFragment_ConversationEvent_originatedFrom }\n      );\n\n      export type ConversationConversationEventFragment =\n        | ConversationConversationEvent_BrokenConversationEvent_Fragment\n        | ConversationConversationEvent_BotSolution_Fragment\n        | ConversationConversationEvent_TalkPublicCallSummary_Fragment\n      ;\n\n      type MessageEnvelopeData_EmailInteraction_Fragment = (\n        { __typename: 'EmailInteraction' }\n        & Pick<EmailInteraction, 'originalEmailURLPath'>\n      );\n\n      type MessageEnvelopeData_CustomChannelInteraction_Fragment = { __typename: 'CustomChannelInteraction' };\n\n      type MessageEnvelopeData_TalkInteraction_Fragment = { __typename: 'TalkInteraction' };\n\n      type MessageEnvelopeData_NativeMessagingInteraction_Fragment = { __typename: 'NativeMessagingInteraction' };\n\n      type MessageEnvelopeData_WhatsAppInteraction_Fragment = { __typename: 'WhatsAppInteraction' };\n\n      type MessageEnvelopeData_WeChatInteraction_Fragment = { __typename: 'WeChatInteraction' };\n\n      type MessageEnvelopeData_NotImplementedOriginatedFrom_Fragment = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type MessageEnvelopeDataFragment =\n        | MessageEnvelopeData_EmailInteraction_Fragment\n        | MessageEnvelopeData_CustomChannelInteraction_Fragment\n        | MessageEnvelopeData_TalkInteraction_Fragment\n        | MessageEnvelopeData_NativeMessagingInteraction_Fragment\n        | MessageEnvelopeData_WhatsAppInteraction_Fragment\n        | MessageEnvelopeData_WeChatInteraction_Fragment\n        | MessageEnvelopeData_NotImplementedOriginatedFrom_Fragment\n      ;\n\n      export type AnyChannelOriginatedFromFragment = (\n        { __typename: 'CustomChannelInteraction' }\n        & Pick<CustomChannelInteraction, 'externalId' | 'timestamp' | 'resourceType'>\n      );\n\n      type ConversationOriginatedFrom_EmailInteraction_Fragment = (\n        { __typename: 'EmailInteraction' }\n        & Pick<EmailInteraction, 'originalEmailURLPath'>\n      );\n\n      type ConversationOriginatedFrom_CustomChannelInteraction_Fragment = (\n        { __typename: 'CustomChannelInteraction' }\n        & Pick<CustomChannelInteraction, 'externalId' | 'timestamp' | 'resourceType'>\n      );\n\n      type ConversationOriginatedFrom_TalkInteraction_Fragment = { __typename: 'TalkInteraction' };\n\n      type ConversationOriginatedFrom_NativeMessagingInteraction_Fragment = (\n        { __typename: 'NativeMessagingInteraction' }\n        & Pick<NativeMessagingInteraction, 'conversationId'>\n      );\n\n      type ConversationOriginatedFrom_WhatsAppInteraction_Fragment = (\n        { __typename: 'WhatsAppInteraction' }\n        & Pick<WhatsAppInteraction, 'conversationId'>\n      );\n\n      type ConversationOriginatedFrom_WeChatInteraction_Fragment = (\n        { __typename: 'WeChatInteraction' }\n        & Pick<WeChatInteraction, 'conversationId'>\n      );\n\n      type ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type ConversationOriginatedFromFragment =\n        | ConversationOriginatedFrom_EmailInteraction_Fragment\n        | ConversationOriginatedFrom_CustomChannelInteraction_Fragment\n        | ConversationOriginatedFrom_TalkInteraction_Fragment\n        | ConversationOriginatedFrom_NativeMessagingInteraction_Fragment\n        | ConversationOriginatedFrom_WhatsAppInteraction_Fragment\n        | ConversationOriginatedFrom_WeChatInteraction_Fragment\n        | ConversationOriginatedFrom_NotImplementedOriginatedFrom_Fragment\n      ;\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_EmailInteraction = (\n        { __typename: 'EmailInteraction' }\n        & Pick<EmailInteraction, 'originalEmailURLPath'>\n      );\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_CustomChannelInteraction = (\n        { __typename: 'CustomChannelInteraction' }\n        & Pick<CustomChannelInteraction, 'externalId' | 'timestamp' | 'resourceType'>\n      );\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_TalkInteraction = (\n        { __typename: 'TalkInteraction' }\n        & Pick<TalkInteraction, 'channel' | 'type'>\n      );\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NativeMessagingInteraction = (\n        { __typename: 'NativeMessagingInteraction' }\n        & Pick<NativeMessagingInteraction, 'conversationId'>\n      );\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WhatsAppInteraction = (\n        { __typename: 'WhatsAppInteraction' }\n        & Pick<WhatsAppInteraction, 'conversationId'>\n      );\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WeChatInteraction = (\n        { __typename: 'WeChatInteraction' }\n        & Pick<WeChatInteraction, 'conversationId'>\n      );\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NotImplementedOriginatedFrom = { __typename: 'NotImplementedOriginatedFrom' };\n\n      export type ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom =\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_EmailInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_CustomChannelInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_TalkInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NativeMessagingInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WhatsAppInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_WeChatInteraction\n        | ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom_NotImplementedOriginatedFrom\n      ;\n\n      export type ConversationTalkPublicCallSummaryFragment = (\n        { __typename: 'TalkPublicCallSummary' }\n        & Pick<TalkPublicCallSummary, 'id' | 'timestamp' | 'summary'>\n        & { originatedFrom: ConversationTalkPublicCallSummaryFragment_TalkPublicCallSummary_originatedFrom }\n      );\n      \"\n    `);\n\n    await validate(content, config, complexTestSchemaWithUnionsAndInterfaces);\n  });\n  it('fields with shared types and no fragments should use the shared type interface name', async () => {\n    const nestedInterfacesSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        animals: [Animal!]\n      }\n\n      interface Animal {\n        name: String!\n        owner: Person!\n      }\n\n      type Cat implements Animal {\n        name: String!\n        owner: Person!\n      }\n\n      type Dog implements Animal {\n        name: String!\n        owner: Person!\n      }\n\n      interface Person {\n        name: String!\n      }\n\n      type Trainer implements Person {\n        name: String!\n      }\n\n      type Veterinarian implements Person {\n        name: String!\n      }\n    `);\n\n    const nestedInterfacesQuery = parse(/* GraphQL */ `\n      query GetAnimals {\n        animals {\n          name\n          owner {\n            name\n          }\n        }\n      }\n    `);\n\n    const config: TypeScriptDocumentsPluginConfig = {\n      preResolveTypes: true,\n      extractAllFieldsToTypes: true,\n      nonOptionalTypename: true,\n      dedupeOperationSuffix: true,\n    };\n\n    const { content } = await plugin(\n      nestedInterfacesSchema,\n      [{ location: 'test-file.ts', document: nestedInterfacesQuery }],\n      config,\n      { outputFile: '' }\n    );\n\n    // Issue #10502: When nested interfaces have the same fields, extractAllFieldsToTypes\n    // We need to use the interface name for the nested type name.\n\n    expect(content).toMatchInlineSnapshot(`\n      \"export type GetAnimalsQuery_animals_Animal_owner_Trainer = { __typename: 'Trainer', name: string };\n\n      export type GetAnimalsQuery_animals_Animal_owner_Veterinarian = { __typename: 'Veterinarian', name: string };\n\n      export type GetAnimalsQuery_animals_Animal_owner =\n        | GetAnimalsQuery_animals_Animal_owner_Trainer\n        | GetAnimalsQuery_animals_Animal_owner_Veterinarian\n      ;\n\n      export type GetAnimalsQuery_animals_Cat = { __typename: 'Cat', name: string, owner: GetAnimalsQuery_animals_Animal_owner };\n\n      export type GetAnimalsQuery_animals_Dog = { __typename: 'Dog', name: string, owner: GetAnimalsQuery_animals_Animal_owner };\n\n      export type GetAnimalsQuery_animals =\n        | GetAnimalsQuery_animals_Cat\n        | GetAnimalsQuery_animals_Dog\n      ;\n\n      export type GetAnimalsQuery_Query = { __typename: 'Query', animals?: Array<GetAnimalsQuery_animals> | null };\n\n\n      export type GetAnimalsQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type GetAnimalsQuery = GetAnimalsQuery_Query;\n      \"\n    `);\n\n    await validate(content, config, nestedInterfacesSchema);\n  });\n\n  it('fragment spreads on the same interface should not force concrete parent type names (regression #10502)', async () => {\n    const interfaceFragmentSchema = buildSchema(/* GraphQL */ `\n      schema {\n        query: Query\n      }\n\n      type Query {\n        pet(petId: ID!): Pet\n      }\n\n      interface Pet {\n        id: ID!\n        home: Home\n      }\n\n      type Dog implements Pet {\n        id: ID!\n        home: Home\n      }\n\n      type Cat implements Pet {\n        id: ID!\n        home: Home\n      }\n\n      interface Home {\n        id: ID!\n      }\n\n      type House implements Home {\n        id: ID!\n      }\n    `);\n\n    const interfaceFragmentDoc = parse(/* GraphQL */ `\n      fragment GetFragmentPet on Pet {\n        id\n        home {\n          id\n        }\n      }\n\n      query GetPetData($petId: ID!) {\n        pet(petId: $petId) {\n          id\n          home {\n            id\n          }\n          ...GetFragmentPet\n        }\n      }\n    `);\n\n    const config: TypeScriptDocumentsPluginConfig = {\n      preResolveTypes: true,\n      extractAllFieldsToTypes: true,\n      nonOptionalTypename: true,\n      dedupeOperationSuffix: true,\n    };\n\n    const { content } = await plugin(\n      interfaceFragmentSchema,\n      [{ location: 'test-file.ts', document: interfaceFragmentDoc }],\n      config,\n      { outputFile: '' }\n    );\n\n    // Edge case: a fragment spread on the same interface should not cause extracted types\n    // for interface fields to be rooted to the first concrete parent (e.g. Cat).\n    expect(content).toMatchInlineSnapshot(`\n      \"export type GetFragmentPetFragment_Pet_home_House = { __typename: 'House', id: string };\n\n      type GetFragmentPet_Dog_Fragment = { __typename: 'Dog', id: string, home?: GetFragmentPetFragment_Pet_home_House | null };\n\n      type GetFragmentPet_Cat_Fragment = { __typename: 'Cat', id: string, home?: GetFragmentPetFragment_Pet_home_House | null };\n\n      export type GetFragmentPetFragment =\n        | GetFragmentPet_Dog_Fragment\n        | GetFragmentPet_Cat_Fragment\n      ;\n\n      export type GetPetDataQuery_pet_Pet_home_House = { __typename: 'House', id: string };\n\n      export type GetPetDataQuery_pet_Dog = { __typename: 'Dog', id: string, home?: GetPetDataQuery_pet_Pet_home_House | null };\n\n      export type GetPetDataQuery_pet_Cat = { __typename: 'Cat', id: string, home?: GetPetDataQuery_pet_Pet_home_House | null };\n\n      export type GetPetDataQuery_pet =\n        | GetPetDataQuery_pet_Dog\n        | GetPetDataQuery_pet_Cat\n      ;\n\n      export type GetPetDataQuery_Query = { __typename: 'Query', pet?: GetPetDataQuery_pet | null };\n\n\n      export type GetPetDataQueryVariables = Exact<{\n        petId: Scalars['ID']['input'];\n      }>;\n\n\n      export type GetPetDataQuery = GetPetDataQuery_Query;\n      \"\n    `);\n\n    await validate(content, config, interfaceFragmentSchema);\n  });\n\n  // Exception case for Issue #10502 - shared schema for fragment tests\n  const notificationSchema = buildSchema(/* GraphQL */ `\n    type Query {\n      notifications: [Notification!]!\n    }\n\n    interface Notification {\n      id: ID!\n      content: Content\n      title: String!\n    }\n\n    type AppNotification implements Notification {\n      id: ID!\n      content: Content\n      title: String!\n    }\n\n    type SystemNotification implements Notification {\n      id: ID!\n      content: Content\n      title: String!\n    }\n\n    interface Content {\n      id: ID!\n    }\n\n    type TextContent implements Content {\n      id: ID!\n    }\n\n    type ImageContent implements Content {\n      id: ID!\n    }\n  `);\n\n  it('inline fragments should use their own type name and not parent type name', async () => {\n    const notificationDoc = parse(/* GraphQL */ `\n      query GetNotifications {\n        notifications {\n          id\n          ... on AppNotification {\n            content {\n              id\n            }\n          }\n          ... on SystemNotification {\n            content {\n              id\n            }\n          }\n        }\n      }\n    `);\n\n    const config: TypeScriptDocumentsPluginConfig = {\n      preResolveTypes: true,\n      extractAllFieldsToTypes: true,\n      nonOptionalTypename: true,\n      dedupeOperationSuffix: true,\n    };\n\n    const { content } = await plugin(\n      notificationSchema,\n      [{ location: 'test-file.ts', document: notificationDoc }],\n      config,\n      { outputFile: '' }\n    );\n\n    expect(content).toMatchInlineSnapshot(`\n      \"export type GetNotificationsQuery_notifications_AppNotification_content_TextContent = { __typename: 'TextContent', id: string };\n\n      export type GetNotificationsQuery_notifications_AppNotification_content_ImageContent = { __typename: 'ImageContent', id: string };\n\n      export type GetNotificationsQuery_notifications_AppNotification_content =\n        | GetNotificationsQuery_notifications_AppNotification_content_TextContent\n        | GetNotificationsQuery_notifications_AppNotification_content_ImageContent\n      ;\n\n      export type GetNotificationsQuery_notifications_SystemNotification_content_TextContent = { __typename: 'TextContent', id: string };\n\n      export type GetNotificationsQuery_notifications_SystemNotification_content_ImageContent = { __typename: 'ImageContent', id: string };\n\n      export type GetNotificationsQuery_notifications_SystemNotification_content =\n        | GetNotificationsQuery_notifications_SystemNotification_content_TextContent\n        | GetNotificationsQuery_notifications_SystemNotification_content_ImageContent\n      ;\n\n      export type GetNotificationsQuery_notifications_AppNotification = { __typename: 'AppNotification', id: string, content?: GetNotificationsQuery_notifications_AppNotification_content | null };\n\n      export type GetNotificationsQuery_notifications_SystemNotification = { __typename: 'SystemNotification', id: string, content?: GetNotificationsQuery_notifications_SystemNotification_content | null };\n\n      export type GetNotificationsQuery_notifications =\n        | GetNotificationsQuery_notifications_AppNotification\n        | GetNotificationsQuery_notifications_SystemNotification\n      ;\n\n      export type GetNotificationsQuery_Query = { __typename: 'Query', notifications: Array<GetNotificationsQuery_notifications> };\n\n\n      export type GetNotificationsQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type GetNotificationsQuery = GetNotificationsQuery_Query;\n      \"\n    `);\n    await validate(content, config, notificationSchema);\n  });\n\n  it('named fragments should use their name and not parent type name', async () => {\n    const notificationDoc = parse(/* GraphQL */ `\n      fragment AppNotificationFragment on AppNotification {\n        content {\n          id\n        }\n      }\n\n      fragment SystemNotificationFragment on SystemNotification {\n        content {\n          id\n        }\n      }\n\n      query GetNotifications {\n        notifications {\n          id\n          title\n          ...AppNotificationFragment\n          ...SystemNotificationFragment\n        }\n      }\n    `);\n\n    const config: TypeScriptDocumentsPluginConfig = {\n      preResolveTypes: true,\n      extractAllFieldsToTypes: true,\n      nonOptionalTypename: true,\n      dedupeOperationSuffix: true,\n    };\n\n    const { content } = await plugin(\n      notificationSchema,\n      [{ location: 'test-file.ts', document: notificationDoc }],\n      config,\n      { outputFile: '' }\n    );\n\n    expect(content).toMatchInlineSnapshot(`\n      \"export type AppNotificationFragment_AppNotification_content_TextContent = { __typename: 'TextContent', id: string };\n\n      export type AppNotificationFragment_AppNotification_content_ImageContent = { __typename: 'ImageContent', id: string };\n\n      export type AppNotificationFragment_AppNotification_content =\n        | AppNotificationFragment_AppNotification_content_TextContent\n        | AppNotificationFragment_AppNotification_content_ImageContent\n      ;\n\n      export type AppNotificationFragment = { __typename: 'AppNotification', content?: AppNotificationFragment_AppNotification_content | null };\n\n      export type SystemNotificationFragment_SystemNotification_content_TextContent = { __typename: 'TextContent', id: string };\n\n      export type SystemNotificationFragment_SystemNotification_content_ImageContent = { __typename: 'ImageContent', id: string };\n\n      export type SystemNotificationFragment_SystemNotification_content =\n        | SystemNotificationFragment_SystemNotification_content_TextContent\n        | SystemNotificationFragment_SystemNotification_content_ImageContent\n      ;\n\n      export type SystemNotificationFragment = { __typename: 'SystemNotification', content?: SystemNotificationFragment_SystemNotification_content | null };\n\n      export type GetNotificationsQuery_notifications_AppNotification = { __typename: 'AppNotification', id: string, title: string, content?: AppNotificationFragment_AppNotification_content | null };\n\n      export type GetNotificationsQuery_notifications_SystemNotification = { __typename: 'SystemNotification', id: string, title: string, content?: SystemNotificationFragment_SystemNotification_content | null };\n\n      export type GetNotificationsQuery_notifications =\n        | GetNotificationsQuery_notifications_AppNotification\n        | GetNotificationsQuery_notifications_SystemNotification\n      ;\n\n      export type GetNotificationsQuery_Query = { __typename: 'Query', notifications: Array<GetNotificationsQuery_notifications> };\n\n\n      export type GetNotificationsQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type GetNotificationsQuery = GetNotificationsQuery_Query;\n      \"\n    `);\n    await validate(content, config, notificationSchema);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/operations/tests/shared/schema.ts",
    "content": "import { buildSchema } from 'graphql';\n\nexport const schema = buildSchema(/* GraphQL */ `\n  scalar DateTime\n\n  input InputType {\n    t: String\n  }\n\n  type User {\n    id: ID!\n    username: String!\n    email: String!\n    profile: Profile\n    role: Role\n  }\n\n  type Profile {\n    age: Int\n    firstName: String!\n  }\n\n  type Mutation {\n    test: String\n    login(username: String!, password: String!): User\n  }\n\n  type Subscription {\n    userCreated: User\n  }\n\n  interface Notifiction {\n    id: ID!\n    createdAt: String!\n  }\n\n  type TextNotification implements Notifiction {\n    id: ID!\n    text: String!\n    createdAt: String!\n  }\n\n  type ImageNotification implements Notifiction {\n    id: ID!\n    imageUrl: String!\n    metadata: ImageMetadata!\n    createdAt: String!\n  }\n\n  type ImageMetadata {\n    createdBy: String!\n  }\n\n  enum Role {\n    USER\n    ADMIN\n  }\n\n  union MyUnion = User | Profile\n\n  union AnyNotification = TextNotification | ImageNotification\n  union SearchResult = TextNotification | ImageNotification | User\n\n  type Query {\n    me: User\n    unionTest: MyUnion\n    notifications: [Notifiction!]!\n    mixedNotifications: [AnyNotification!]!\n    search(term: String!): [SearchResult!]!\n    dummy: String\n    dummyNonNull: String!\n    dummyArray: [String]\n    dummyNonNullArray: [String]!\n    dummyNonNullArrayWithValues: [String!]!\n    dummyWithType: Profile\n  }\n\n  schema {\n    query: Query\n    mutation: Mutation\n    subscription: Subscription\n  }\n`);\n"
  },
  {
    "path": "packages/plugins/typescript/operations/tests/ts-documents.apolloUnmask.spec.ts",
    "content": "import { parse } from 'graphql';\nimport { schema } from './shared/schema.js';\nimport { plugin } from '../src/index.js';\n\ndescribe('TypeScript Operations Plugin - apolloUnmask', () => {\n  it(\"'mask' with @unmask configured with apolloUnmask yields correct types\", async () => {\n    const ast = parse(/* GraphQL */ `\n      query {\n        me {\n          ...UserFragment @unmask\n        }\n      }\n      fragment UserFragment on User {\n        id\n      }\n    `);\n    const result = await plugin(\n      schema,\n      [{ location: 'test-file.ts', document: ast }],\n      { inlineFragmentTypes: 'mask', customDirectives: { apolloUnmask: true } },\n      { outputFile: '' }\n    );\n\n    expect(result.content).toMatchInlineSnapshot(`\n      \"export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type Unnamed_1_Query = { __typename?: 'Query', me?: { __typename?: 'User', id: string } | null };\n\n      export type UserFragmentFragment = { __typename?: 'User', id: string } & { ' $fragmentName'?: 'UserFragmentFragment' };\n      \"\n    `);\n  });\n\n  it(\"'mask' with @unmask without apolloUnmask yields correct types\", async () => {\n    const ast = parse(/* GraphQL */ `\n      query {\n        me {\n          ...UserFragment @unmask\n        }\n      }\n      fragment UserFragment on User {\n        id\n      }\n    `);\n    const result = await plugin(\n      schema,\n      [{ location: 'test-file.ts', document: ast }],\n      { inlineFragmentTypes: 'mask' },\n      { outputFile: '' }\n    );\n    expect(result.content).toMatchInlineSnapshot(`\n      \"export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type Unnamed_1_Query = { __typename?: 'Query', me?: (\n          { __typename?: 'User' }\n          & { ' $fragmentRefs'?: { 'UserFragmentFragment': UserFragmentFragment } }\n        ) | null };\n\n      export type UserFragmentFragment = { __typename?: 'User', id: string } & { ' $fragmentName'?: 'UserFragmentFragment' };\n      \"\n    `);\n  });\n\n  it(\"'mask' with @unmask with apolloUnmask explicitly disabled yields correct types\", async () => {\n    const ast = parse(/* GraphQL */ `\n      query {\n        me {\n          ...UserFragment @unmask\n        }\n      }\n      fragment UserFragment on User {\n        id\n      }\n    `);\n    const result = await plugin(\n      schema,\n      [{ location: 'test-file.ts', document: ast }],\n      { inlineFragmentTypes: 'mask', customDirectives: { apolloUnmask: false } },\n      { outputFile: '' }\n    );\n    expect(result.content).toMatchInlineSnapshot(`\n      \"export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type Unnamed_1_Query = { __typename?: 'Query', me?: (\n          { __typename?: 'User' }\n          & { ' $fragmentRefs'?: { 'UserFragmentFragment': UserFragmentFragment } }\n        ) | null };\n\n      export type UserFragmentFragment = { __typename?: 'User', id: string } & { ' $fragmentName'?: 'UserFragmentFragment' };\n      \"\n    `);\n  });\n\n  it(\"'mask' with @unmask and masked fragments yields correct types\", async () => {\n    const ast = parse(/* GraphQL */ `\n      query {\n        me {\n          ...UserFragment @unmask\n          ...UserFragment2\n        }\n      }\n      fragment UserFragment on User {\n        id\n      }\n\n      fragment UserFragment2 on User {\n        email\n      }\n    `);\n    const result = await plugin(\n      schema,\n      [{ location: 'test-file.ts', document: ast }],\n      { inlineFragmentTypes: 'mask', customDirectives: { apolloUnmask: true } },\n      { outputFile: '' }\n    );\n    expect(result.content).toMatchInlineSnapshot(`\n      \"export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type Unnamed_1_Query = { __typename?: 'Query', me?: (\n          { __typename?: 'User', id: string }\n          & { ' $fragmentRefs'?: { 'UserFragment2Fragment': UserFragment2Fragment } }\n        ) | null };\n\n      export type UserFragmentFragment = { __typename?: 'User', id: string } & { ' $fragmentName'?: 'UserFragmentFragment' };\n\n      export type UserFragment2Fragment = { __typename?: 'User', email: string } & { ' $fragmentName'?: 'UserFragment2Fragment' };\n      \"\n    `);\n  });\n\n  it(\"'mask' with @unmask and masked fragments on overlapping fields yields correct types\", async () => {\n    const ast = parse(/* GraphQL */ `\n      query {\n        me {\n          ...UserFragment @unmask\n          ...UserFragment2\n        }\n      }\n      fragment UserFragment on User {\n        id\n        email\n      }\n\n      fragment UserFragment2 on User {\n        email\n      }\n    `);\n    const result = await plugin(\n      schema,\n      [{ location: 'test-file.ts', document: ast }],\n      { inlineFragmentTypes: 'mask', customDirectives: { apolloUnmask: true } },\n      { outputFile: '' }\n    );\n    expect(result.content).toMatchInlineSnapshot(`\n      \"export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type Unnamed_1_Query = { __typename?: 'Query', me?: (\n          { __typename?: 'User', id: string, email: string }\n          & { ' $fragmentRefs'?: { 'UserFragment2Fragment': UserFragment2Fragment } }\n        ) | null };\n\n      export type UserFragmentFragment = { __typename?: 'User', id: string, email: string } & { ' $fragmentName'?: 'UserFragmentFragment' };\n\n      export type UserFragment2Fragment = { __typename?: 'User', email: string } & { ' $fragmentName'?: 'UserFragment2Fragment' };\n      \"\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/operations/tests/ts-documents.nullability.spec.ts",
    "content": "import { buildSchema, parse } from 'graphql';\nimport * as prettier from 'prettier';\nimport { plugin } from '../src/index.js';\n\nconst schema = buildSchema(/* GraphQL */ `\n  directive @semanticNonNull(levels: [Int] = [0]) on FIELD_DEFINITION\n\n  type Query {\n    me: User\n  }\n\n  type User {\n    field: String @semanticNonNull\n    fieldLevel0: String @semanticNonNull(levels: [0])\n    fieldLevel1: String @semanticNonNull(levels: [1])\n    fieldBothLevels: String @semanticNonNull(levels: [0, 1])\n    list: [String] @semanticNonNull\n    listLevel0: [String] @semanticNonNull(levels: [0])\n    listLevel1: [String] @semanticNonNull(levels: [1])\n    listBothLevels: [String] @semanticNonNull(levels: [0, 1])\n    nonNullableList: [String]! @semanticNonNull\n    nonNullableListLevel0: [String]! @semanticNonNull(levels: [0])\n    nonNullableListLevel1: [String]! @semanticNonNull(levels: [1])\n    nonNullableListBothLevels: [String]! @semanticNonNull(levels: [0, 1])\n    listWithNonNullableItem: [String!] @semanticNonNull\n    listWithNonNullableItemLevel0: [String!] @semanticNonNull(levels: [0])\n    listWithNonNullableItemLevel1: [String!] @semanticNonNull(levels: [1])\n    listWithNonNullableItemBothLevels: [String!] @semanticNonNull(levels: [0, 1])\n    nonNullableListWithNonNullableItem: [String!]! @semanticNonNull\n    nonNullableListWithNonNullableItemLevel0: [String!]! @semanticNonNull(levels: [0])\n    nonNullableListWithNonNullableItemLevel1: [String!]! @semanticNonNull(levels: [1])\n    nonNullableListWithNonNullableItemBothLevels: [String!]! @semanticNonNull(levels: [0, 1])\n  }\n`);\n\nconst document = parse(/* GraphQL */ `\n  query {\n    me {\n      field\n      fieldLevel0\n      fieldLevel1\n      fieldBothLevels\n      list\n      listLevel0\n      listLevel1\n      listBothLevels\n      nonNullableList\n      nonNullableListLevel0\n      nonNullableListLevel1\n      nonNullableListBothLevels\n      listWithNonNullableItem\n      listWithNonNullableItemLevel0\n      listWithNonNullableItemLevel1\n      listWithNonNullableItemBothLevels\n      nonNullableListWithNonNullableItem\n      nonNullableListWithNonNullableItemLevel0\n      nonNullableListWithNonNullableItemLevel1\n      nonNullableListWithNonNullableItemBothLevels\n    }\n  }\n`);\n\ndescribe('TypeScript Operations Plugin - nullability', () => {\n  it('converts semanticNonNull to nonNull when nullability.errorHandlingClient=true', async () => {\n    const result = await plugin(schema, [{ document }], {\n      nullability: {\n        errorHandlingClient: true,\n      },\n    });\n\n    const formattedContent = prettier.format(result.content, { parser: 'typescript' });\n    expect(formattedContent).toMatchInlineSnapshot(`\n      \"export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never }>;\n\n      export type Unnamed_1_Query = {\n        __typename?: \"Query\";\n        me?: {\n          __typename?: \"User\";\n          field: string;\n          fieldLevel0: string;\n          fieldLevel1?: string | null;\n          fieldBothLevels: string;\n          list: Array<string | null>;\n          listLevel0: Array<string | null>;\n          listLevel1?: Array<string> | null;\n          listBothLevels: Array<string>;\n          nonNullableList: Array<string | null>;\n          nonNullableListLevel0: Array<string | null>;\n          nonNullableListLevel1: Array<string>;\n          nonNullableListBothLevels: Array<string>;\n          listWithNonNullableItem: Array<string>;\n          listWithNonNullableItemLevel0: Array<string>;\n          listWithNonNullableItemLevel1?: Array<string> | null;\n          listWithNonNullableItemBothLevels: Array<string>;\n          nonNullableListWithNonNullableItem: Array<string>;\n          nonNullableListWithNonNullableItemLevel0: Array<string>;\n          nonNullableListWithNonNullableItemLevel1: Array<string>;\n          nonNullableListWithNonNullableItemBothLevels: Array<string>;\n        } | null;\n      };\n      \"\n    `);\n  });\n\n  it('does not convert nullability to nonNull when nullability.errorHandlingClient=false', async () => {\n    const result = await plugin(schema, [{ document }], {\n      nullability: {\n        errorHandlingClient: false,\n      },\n    });\n\n    const formattedContent = prettier.format(result.content, { parser: 'typescript' });\n    expect(formattedContent).toMatchInlineSnapshot(`\n      \"export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never }>;\n\n      export type Unnamed_1_Query = {\n        __typename?: \"Query\";\n        me?: {\n          __typename?: \"User\";\n          field?: string | null;\n          fieldLevel0?: string | null;\n          fieldLevel1?: string | null;\n          fieldBothLevels?: string | null;\n          list?: Array<string | null> | null;\n          listLevel0?: Array<string | null> | null;\n          listLevel1?: Array<string | null> | null;\n          listBothLevels?: Array<string | null> | null;\n          nonNullableList: Array<string | null>;\n          nonNullableListLevel0: Array<string | null>;\n          nonNullableListLevel1: Array<string | null>;\n          nonNullableListBothLevels: Array<string | null>;\n          listWithNonNullableItem?: Array<string> | null;\n          listWithNonNullableItemLevel0?: Array<string> | null;\n          listWithNonNullableItemLevel1?: Array<string> | null;\n          listWithNonNullableItemBothLevels?: Array<string> | null;\n          nonNullableListWithNonNullableItem: Array<string>;\n          nonNullableListWithNonNullableItemLevel0: Array<string>;\n          nonNullableListWithNonNullableItemLevel1: Array<string>;\n          nonNullableListWithNonNullableItemBothLevels: Array<string>;\n        } | null;\n      };\n      \"\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/operations/tests/ts-documents.spec.ts",
    "content": "import { mergeOutputs, Types } from '@graphql-codegen/plugin-helpers';\nimport { validateTs } from '@graphql-codegen/testing';\nimport { buildClientSchema, buildSchema, parse } from 'graphql';\nimport { plugin as tsPlugin } from '../../typescript/src/index.js';\nimport { plugin } from '../src/index.js';\nimport { schema } from './shared/schema.js';\n\ndescribe('TypeScript Operations Plugin', () => {\n  const gitHuntSchema = buildClientSchema(require('../../../../../dev-test/githunt/schema.json'));\n\n  const validate = async (\n    content: Types.PluginOutput,\n    config: any = {},\n    pluginSchema = schema,\n    usage = '',\n    suspenseErrors = []\n  ) => {\n    const m = mergeOutputs([await tsPlugin(pluginSchema, [], config, { outputFile: '' }), content, usage]);\n    validateTs(m, undefined, undefined, undefined, suspenseErrors);\n\n    return m;\n  };\n\n  describe('Config', () => {\n    it('Should not generate \"export\" when noExport is set to true', async () => {\n      const ast = parse(/* GraphQL */ `\n        query notifications {\n          notifications {\n            id\n\n            ... on TextNotification {\n              text\n            }\n\n            ... on ImageNotification {\n              imageUrl\n              metadata {\n                created: createdBy\n              }\n            }\n          }\n        }\n      `);\n      const config = { noExport: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).not.toContain('export');\n      await validate(content, config);\n    });\n\n    it('Should handle \"namespacedImportName\" and add it when specified', async () => {\n      const ast = parse(/* GraphQL */ `\n        query notifications {\n          notifications {\n            id\n\n            ... on TextNotification {\n              text\n              textAlias: text\n            }\n\n            ... on TextNotification {\n              text\n            }\n\n            ... on ImageNotification {\n              imageUrl\n              metadata {\n                created: createdBy\n              }\n            }\n          }\n        }\n      `);\n      const config = { preResolveTypes: false, namespacedImportName: 'Types' };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type NotificationsQuery = (\n          { __typename?: 'Query' }\n          & { notifications: Array<(\n            { __typename?: 'TextNotification' }\n            & Pick<Types.TextNotification, 'text' | 'id'>\n            & { textAlias: Types.TextNotification['text'] }\n          ) | (\n            { __typename?: 'ImageNotification' }\n            & Pick<Types.ImageNotification, 'imageUrl' | 'id'>\n            & { metadata: (\n              { __typename?: 'ImageMetadata' }\n              & { created: Types.ImageMetadata['createdBy'] }\n            ) }\n          )> }\n        );\n      `);\n      await validate(content, config, schema, '', [`Cannot find namespace 'Types'.`]);\n    });\n\n    it('Can merge an inline fragment with a spread', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Comment {\n          id: ID!\n          title: String!\n        }\n\n        type TextComment implements Comment {\n          id: ID!\n          title: String!\n          text: String!\n        }\n\n        type ImageComment implements Comment {\n          id: ID!\n          title: String!\n          image: String!\n        }\n\n        type Post {\n          id: ID!\n          comments: [Comment!]!\n        }\n      `);\n\n      const ast = parse(/* GraphQL */ `\n        fragment Post on Post {\n          id\n          comments {\n            ... on TextComment {\n              text\n            }\n          }\n        }\n\n        fragment PostPlus on Post {\n          ...Post\n          comments {\n            id\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: 'test-file.ts', document: ast }],\n        {},\n        {\n          outputFile: '',\n        }\n      );\n      expect(content).toBeSimilarStringTo(`\n        export type PostFragment = { __typename?: 'Post', id: string, comments: Array<{ __typename?: 'TextComment', text: string } | { __typename?: 'ImageComment' }> };\n\n        export type PostPlusFragment = { __typename?: 'Post', id: string, comments: Array<{ __typename?: 'TextComment', text: string, id: string } | { __typename?: 'ImageComment', id: string }> };\n      `);\n    });\n\n    it('Should handle \"namespacedImportName\" and \"preResolveTypes\" together', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          f: E\n          user: User!\n        }\n\n        enum E {\n          A\n          B\n        }\n\n        scalar JSON\n\n        type User {\n          id: ID!\n          f: E\n          j: JSON\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        query test {\n          f\n          user {\n            id\n            f\n            j\n          }\n        }\n      `);\n      const config = { namespacedImportName: 'Types', preResolveTypes: true };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(\n        `export type TestQuery = { __typename?: 'Query', f?: Types.E | null, user: { __typename?: 'User', id: string, f?: Types.E | null, j?: any | null } };`\n      );\n\n      await validate(content, config, schema, '', [`Cannot find namespace 'Types'.`]);\n    });\n\n    it('Should generate the correct output when using immutableTypes config', async () => {\n      const ast = parse(/* GraphQL */ `\n        query notifications {\n          notifications {\n            id\n\n            ... on TextNotification {\n              text\n            }\n\n            ... on ImageNotification {\n              imageUrl\n              metadata {\n                createdBy\n              }\n            }\n          }\n        }\n      `);\n      const config = { preResolveTypes: false, namingConvention: 'change-case-all#lowerCase', immutableTypes: true };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type notificationsquery = (\n          { readonly __typename?: 'Query' }\n          & { readonly notifications: ReadonlyArray<(\n            { readonly __typename?: 'TextNotification' }\n            & Pick<textnotification, 'text' | 'id'>\n          ) | (\n            { readonly __typename?: 'ImageNotification' }\n            & Pick<imagenotification, 'imageUrl' | 'id'>\n            & { readonly metadata: (\n              { readonly __typename?: 'ImageMetadata' }\n              & Pick<imagemetadata, 'createdBy'>\n            ) }\n          )> }\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('should include fragment variable definitions when experimentalFragmentVariables is set', async () => {\n      const ast = parse(\n        /* GraphQL */ `\n          fragment TextNotificationFragment($skip: Boolean!) on TextNotification {\n            text @skip(if: $skip)\n          }\n        `,\n        // < v15 compatibility\n        { experimentalFragmentVariables: true, allowLegacyFragmentVariables: true } as any\n      );\n      const config = { experimentalFragmentVariables: true };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toMatchSnapshot();\n    });\n\n    it('should resolve optionals according to maybeValue', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User!\n        }\n\n        type User {\n          name: String!\n          age: Int\n          address: String!\n          nicknames: [String!]\n          parents: [User!]!\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        query user($showProperty: Boolean!) {\n          user {\n            name\n            age\n            address @include(if: $showProperty)\n            nicknames @include(if: $showProperty)\n            parents @include(if: $showProperty)\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        {\n          preResolveTypes: true,\n          maybeValue: \"T | 'specialType'\",\n        },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n      expect(content).toBeSimilarStringTo(`\n      export type UserQuery = { __typename?: 'Query', user: { __typename?: 'User', name: string, age?: number | 'specialType', address?: string, nicknames?: Array<string> | 'specialType', parents?: Array<User> } };\n      `);\n    });\n\n    it('should add undefined as possible value according to allowUndefinedQueryVariables', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User!\n        }\n\n        type User {\n          name: String!\n          age: Int\n          address: String!\n          nicknames: [String!]\n          parents: [User!]!\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        query user($showProperty: Boolean!) {\n          user {\n            name\n            age\n            address @include(if: $showProperty)\n            nicknames @include(if: $showProperty)\n            parents @include(if: $showProperty)\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        {\n          preResolveTypes: true,\n          allowUndefinedQueryVariables: true,\n        },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type UserQueryVariables = Exact<{\n          showProperty: Scalars['Boolean']['input'];\n        }> | undefined;\n      `);\n    });\n  });\n\n  describe('Scalars', () => {\n    it('Should include scalars when doing pick', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        scalar Date\n        type Query {\n          me: User\n        }\n        type User {\n          id: ID!\n          joinDate: Date!\n        }\n      `);\n\n      const doc = parse(/* GraphQL */ `\n        query {\n          me {\n            id\n            joinDate\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: doc }], config, {\n        outputFile: '',\n      });\n      expect(content).toContain(`Pick<User, 'id' | 'joinDate'>`);\n      await validate(content, config, testSchema);\n    });\n  });\n\n  describe('Custom Operation Result Name Suffix', () => {\n    it('Should generate custom operation result name', async () => {\n      const ast = parse(/* GraphQL */ `\n        query notifications {\n          notifications {\n            id\n\n            ... on TextNotification {\n              text\n            }\n\n            ... on ImageNotification {\n              imageUrl\n              metadata {\n                createdBy\n              }\n            }\n          }\n        }\n      `);\n      const config = { operationResultSuffix: 'Result', preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(\n        `export type NotificationsQueryVariables = Exact<{ [key: string]: never; }>;`\n      );\n      expect(content).toBeSimilarStringTo(`\n        export type NotificationsQueryResult = (\n          { __typename?: 'Query' }\n          & { notifications: Array<(\n            { __typename?: 'TextNotification' }\n            & Pick<TextNotification, 'text' | 'id'>\n          ) | (\n            { __typename?: 'ImageNotification' }\n            & Pick<ImageNotification, 'imageUrl' | 'id'>\n            & { metadata: (\n              { __typename?: 'ImageMetadata' }\n              & Pick<ImageMetadata, 'createdBy'>\n            ) }\n          )> }\n        );\n      `);\n\n      await validate(content, config);\n    });\n  });\n\n  describe('Naming Convention & Types Prefix', () => {\n    it('Should allow custom naming and point to the correct type', async () => {\n      const ast = parse(/* GraphQL */ `\n        query notifications {\n          notifications {\n            id\n\n            ... on TextNotification {\n              text\n            }\n\n            ... on ImageNotification {\n              imageUrl\n              metadata {\n                createdBy\n              }\n            }\n          }\n        }\n      `);\n      const config = { preResolveTypes: false, namingConvention: 'change-case-all#lowerCase' };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type notificationsquery = (\n          { __typename?: 'Query' }\n          & { notifications: Array<(\n            { __typename?: 'TextNotification' }\n            & Pick<textnotification, 'text' | 'id'>\n          ) | (\n            { __typename?: 'ImageNotification' }\n            & Pick<imagenotification, 'imageUrl' | 'id'>\n            & { metadata: (\n              { __typename?: 'ImageMetadata' }\n              & Pick<imagemetadata, 'createdBy'>\n            ) }\n          )> }\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should allow custom naming and point to the correct type - with custom prefix', async () => {\n      const ast = parse(/* GraphQL */ `\n        query notifications {\n          notifications {\n            id\n\n            ... on TextNotification {\n              text\n            }\n\n            ... on ImageNotification {\n              imageUrl\n              metadata {\n                createdBy\n              }\n            }\n          }\n        }\n      `);\n\n      const config = { preResolveTypes: false, typesPrefix: 'i', namingConvention: 'change-case-all#lowerCase' };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(\n        `export type inotificationsqueryvariables = Exact<{ [key: string]: never; }>;`\n      );\n      expect(content).toBeSimilarStringTo(`\n        export type inotificationsquery = (\n          { __typename?: 'Query' }\n          & { notifications: Array<(\n            { __typename?: 'TextNotification' }\n            & Pick<itextnotification, 'text' | 'id'>\n          ) | (\n            { __typename?: 'ImageNotification' }\n            & Pick<iimagenotification, 'imageUrl' | 'id'>\n            & { metadata: (\n                { __typename?: 'ImageMetadata' }\n                & Pick<iimagemetadata, 'createdBy'>\n              ) }\n          )> }\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Test for dedupeOperationSuffix', async () => {\n      const ast = parse(/* GraphQL */ `\n        query notificationsQuery {\n          notifications {\n            id\n          }\n        }\n\n        fragment MyFragment on Query {\n          notifications {\n            id\n          }\n        }\n      `);\n      const ast2 = parse(/* GraphQL */ `\n        query notifications {\n          notifications {\n            id\n          }\n        }\n\n        fragment My on Query {\n          notifications {\n            id\n          }\n        }\n      `);\n      const ast3 = parse(/* GraphQL */ `\n        query notificationsQuery {\n          ...MyFragment\n        }\n\n        fragment MyFragment on Query {\n          notifications {\n            id\n          }\n        }\n      `);\n\n      expect(\n        (await plugin(schema, [{ location: 'test-file.ts', document: ast }], {}, { outputFile: '' })).content\n      ).toContain('export type NotificationsQueryQuery =');\n      expect(\n        (await plugin(schema, [{ location: 'test-file.ts', document: ast }], {}, { outputFile: '' })).content\n      ).toContain('export type MyFragmentFragment =');\n      expect(\n        (\n          await plugin(\n            schema,\n            [{ location: 'test-file.ts', document: ast }],\n            { dedupeOperationSuffix: false },\n            { outputFile: '' }\n          )\n        ).content\n      ).toContain('export type NotificationsQueryQuery =');\n      expect(\n        (\n          await plugin(\n            schema,\n            [{ location: 'test-file.ts', document: ast }],\n            { dedupeOperationSuffix: true },\n            { outputFile: '' }\n          )\n        ).content\n      ).toContain('export type NotificationsQuery =');\n      expect(\n        (\n          await plugin(\n            schema,\n            [{ location: 'test-file.ts', document: ast }],\n            { dedupeOperationSuffix: true },\n            { outputFile: '' }\n          )\n        ).content\n      ).toContain('export type MyFragment =');\n      expect(\n        (\n          await plugin(\n            schema,\n            [{ location: 'test-file.ts', document: ast2 }],\n            { dedupeOperationSuffix: true },\n            { outputFile: '' }\n          )\n        ).content\n      ).toContain('export type NotificationsQuery =');\n      expect(\n        (\n          await plugin(\n            schema,\n            [{ location: 'test-file.ts', document: ast2 }],\n            { dedupeOperationSuffix: false },\n            { outputFile: '' }\n          )\n        ).content\n      ).toContain('export type NotificationsQuery =');\n      expect(\n        (\n          await plugin(\n            schema,\n            [{ location: 'test-file.ts', document: ast2 }],\n            { dedupeOperationSuffix: false },\n            { outputFile: '' }\n          )\n        ).content\n      ).toContain('export type MyFragment =');\n\n      const withUsage = (\n        await plugin(\n          schema,\n          [{ location: 'test-file.ts', document: ast3 }],\n          { dedupeOperationSuffix: true, preResolveTypes: false },\n          { outputFile: '' }\n        )\n      ).content;\n      expect(withUsage).toBeSimilarStringTo(`\n        export type MyFragment = (\n          { __typename?: 'Query' }\n          & { notifications: Array<(\n            { __typename?: 'TextNotification' }\n            & Pick<TextNotification, 'id'>\n          ) | (\n            { __typename?: 'ImageNotification' }\n            & Pick<ImageNotification, 'id'>\n          )> }\n        );\n      `);\n      expect(withUsage).toBeSimilarStringTo(`\n      export type NotificationsQuery = (\n        { __typename?: 'Query' }\n        & { notifications: Array<(\n          { __typename?: 'TextNotification' }\n          & Pick<TextNotification, 'id'>\n        ) | (\n          { __typename?: 'ImageNotification' }\n          & Pick<ImageNotification, 'id'>\n        )> }\n      );\n      `);\n    });\n  });\n\n  it('Test for omitOperationSuffix', async () => {\n    const ast = parse(/* GraphQL */ `\n      query notificationsQuery {\n        notifications {\n          id\n        }\n      }\n\n      fragment MyFragment on Query {\n        notifications {\n          id\n        }\n      }\n    `);\n    const ast2 = parse(/* GraphQL */ `\n      query notifications {\n        notifications {\n          id\n        }\n      }\n\n      fragment My on Query {\n        notifications {\n          id\n        }\n      }\n    `);\n    const ast3 = parse(/* GraphQL */ `\n      query notifications {\n        ...My\n      }\n\n      fragment My on Query {\n        notifications {\n          id\n        }\n      }\n    `);\n\n    expect(\n      (\n        await plugin(\n          schema,\n          [{ location: 'test-file.ts', document: ast }],\n          { preResolveTypes: false },\n          { outputFile: '' }\n        )\n      ).content\n    ).toContain('export type NotificationsQueryQuery =');\n    expect(\n      (\n        await plugin(\n          schema,\n          [{ location: 'test-file.ts', document: ast }],\n          { preResolveTypes: false },\n          { outputFile: '' }\n        )\n      ).content\n    ).toContain('export type MyFragmentFragment =');\n    expect(\n      (\n        await plugin(\n          schema,\n          [{ location: 'test-file.ts', document: ast }],\n          { omitOperationSuffix: true, preResolveTypes: false },\n          { outputFile: '' }\n        )\n      ).content\n    ).toContain('export type NotificationsQuery =');\n    expect(\n      (\n        await plugin(\n          schema,\n          [{ location: 'test-file.ts', document: ast }],\n          { omitOperationSuffix: true, preResolveTypes: false },\n          { outputFile: '' }\n        )\n      ).content\n    ).toContain('export type MyFragment =');\n    expect(\n      (\n        await plugin(\n          schema,\n          [{ location: 'test-file.ts', document: ast2 }],\n          { omitOperationSuffix: true, preResolveTypes: false },\n          { outputFile: '' }\n        )\n      ).content\n    ).toContain('export type Notifications =');\n    expect(\n      (\n        await plugin(\n          schema,\n          [{ location: 'test-file.ts', document: ast2 }],\n          { omitOperationSuffix: true, preResolveTypes: false },\n          { outputFile: '' }\n        )\n      ).content\n    ).toContain('export type My =');\n    expect(\n      (\n        await plugin(\n          schema,\n          [{ location: 'test-file.ts', document: ast2 }],\n          { omitOperationSuffix: false, preResolveTypes: false },\n          { outputFile: '' }\n        )\n      ).content\n    ).toContain('export type NotificationsQuery =');\n    expect(\n      (\n        await plugin(\n          schema,\n          [{ location: 'test-file.ts', document: ast2 }],\n          { omitOperationSuffix: false, preResolveTypes: false },\n          { outputFile: '' }\n        )\n      ).content\n    ).toContain('export type MyFragment =');\n\n    const withUsage = (\n      await plugin(\n        schema,\n        [{ location: 'test-file.ts', document: ast3 }],\n        { omitOperationSuffix: true, preResolveTypes: false },\n        { outputFile: '' }\n      )\n    ).content;\n    expect(withUsage).toBeSimilarStringTo(`\n      export type My = (\n        { __typename?: 'Query' }\n        & { notifications: Array<(\n          { __typename?: 'TextNotification' }\n          & Pick<TextNotification, 'id'>\n        ) | (\n          { __typename?: 'ImageNotification' }\n          & Pick<ImageNotification, 'id'>\n        )> }\n      );\n    `);\n    expect(withUsage).toBeSimilarStringTo(`\n    export type Notifications = (\n      { __typename?: 'Query' }\n      & { notifications: Array<(\n        { __typename?: 'TextNotification' }\n        & Pick<TextNotification, 'id'>\n      ) | (\n        { __typename?: 'ImageNotification' }\n        & Pick<ImageNotification, 'id'>\n      )> }\n    );\n    `);\n  });\n\n  describe('__typename', () => {\n    it('Should ignore __typename for root types with skipTypeNameForRoot = true', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Test {\n          foo: String\n        }\n\n        type Query {\n          test: Test\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        query q1 {\n          test {\n            foo\n          }\n        }\n      `);\n      const config = {\n        skipTypeNameForRoot: true,\n        preResolveTypes: false,\n      };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(\n        `export type Q1Query = { test?: Maybe<(\n          { __typename?: 'Test' }\n          & Pick<Test, 'foo'>\n        )> };`\n      );\n      await validate(content, config, testSchema);\n    });\n\n    it('Should ignore __typename for root types with skipTypeNameForRoot = true, and with nonOptionalTypename = true', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Test {\n          foo: String\n        }\n\n        type Query {\n          test: Test\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        query q1 {\n          test {\n            foo\n          }\n        }\n      `);\n      const config = {\n        nonOptionalTypename: true,\n        skipTypeNameForRoot: true,\n        preResolveTypes: false,\n      };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(\n        `export type Q1Query = { test?: Maybe<(\n          { __typename: 'Test' }\n          & Pick<Test, 'foo'>\n        )> };`\n      );\n      await validate(content, config, testSchema);\n    });\n\n    it('Should ignore skipTypeNameForRoot = true when __typename is specified manually', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Test {\n          foo: String\n        }\n\n        type Query {\n          test: Test\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        query q1 {\n          __typename\n          test {\n            foo\n          }\n        }\n      `);\n      const config = {\n        nonOptionalTypename: true,\n        skipTypeNameForRoot: true,\n        preResolveTypes: false,\n      };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(\n        `export type Q1Query = (\n          { __typename: 'Query' }\n          & { test?: Maybe<(\n            { __typename: 'Test' }\n            & Pick<Test, 'foo'>\n          )> }\n        );`\n      );\n      await validate(content, config, testSchema);\n    });\n\n    it('Should add __typename correctly with nonOptionalTypename=false,skipTypename=true,preResolveTypes=true and explicit field', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Search {\n          search: [SearchResult!]!\n        }\n\n        type Movie {\n          id: ID!\n          title: String!\n        }\n        type Person {\n          id: ID!\n          name: String!\n        }\n\n        union SearchResult = Movie | Person\n\n        type Query {\n          search(term: String!): [SearchResult!]!\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        query q1 {\n          search {\n            ... on Movie {\n              __typename\n              id\n              title\n            }\n            ... on Person {\n              __typename\n              id\n              name\n            }\n          }\n        }\n\n        query q2 {\n          search {\n            __typename\n            ... on Movie {\n              id\n              title\n            }\n            ... on Person {\n              id\n              name\n            }\n          }\n        }\n      `);\n      const config = {\n        nonOptionalTypename: false,\n        skipTypename: true,\n      };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toContain(\n        `\\\nexport type Q1Query = { search: Array<\n    | { __typename: 'Movie', id: string, title: string }\n    | { __typename: 'Person', id: string, name: string }\n  > };`\n      );\n      expect(content).toContain(\n        `\\\nexport type Q2Query = { search: Array<\n    | { __typename: 'Movie', id: string, title: string }\n    | { __typename: 'Person', id: string, name: string }\n  > };`\n      );\n      await validate(content, config, testSchema);\n    });\n\n    it('Should skip __typename when skipTypename is set to true', async () => {\n      const ast = parse(/* GraphQL */ `\n        query {\n          dummy\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).not.toContain(`__typename`);\n      await validate(content, config);\n    });\n\n    it('Should add __typename when dealing with fragments', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Node {\n          id: ID!\n        }\n\n        type A implements Node {\n          id: ID!\n          A: String\n        }\n\n        type B implements Node {\n          id: ID!\n          B: String\n        }\n\n        type Query {\n          some: Node\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        fragment Node on Node {\n          __typename\n          id\n        }\n\n        query Test {\n          some {\n            ...Node\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n      export type TestQuery = (\n        { __typename?: 'Query' }\n        & { some?: Maybe<(\n          { __typename: 'A' }\n          & Pick<A, 'id'>\n        ) | (\n          { __typename: 'B' }\n          & Pick<B, 'id'>\n        )> }\n      );\n      `);\n      await validate(content, config, testSchema);\n    });\n\n    it('Should add aliased __typename correctly', async () => {\n      const ast = parse(/* GraphQL */ `\n        query {\n          type: __typename\n          dummy\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n      export type Unnamed_1_Query = (\n        { __typename?: 'Query' }\n        & Pick<Query, 'dummy'>\n        & { type: 'Query' }\n      );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should add aliased __typename correctly with preResovleTypes', async () => {\n      const ast = parse(/* GraphQL */ `\n        query {\n          type: __typename\n          dummy\n        }\n      `);\n      const config = { preResolveTypes: true };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n        export type Unnamed_1_Query = { __typename?: 'Query', dummy?: string | null, type: 'Query' };\n      `);\n      await validate(content, config);\n    });\n\n    it('Should add __typename as non-optional when explicitly specified', async () => {\n      const ast = parse(/* GraphQL */ `\n        query {\n          __typename\n          dummy\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n        export type Unnamed_1_Query = (\n          { __typename: 'Query' }\n          & Pick<Query, 'dummy'>\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should add __typename as non-optional when forced', async () => {\n      const ast = parse(/* GraphQL */ `\n        query {\n          dummy\n        }\n      `);\n      const config = { nonOptionalTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n        export type Unnamed_1_Query = (\n          { __typename: 'Query' }\n          & Pick<Query, 'dummy'>\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should add __typename as optional when its not specified', async () => {\n      const ast = parse(/* GraphQL */ `\n        query {\n          dummy\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n        export type Unnamed_1_Query = (\n          { __typename?: 'Query' }\n          & Pick<Query, 'dummy'>\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should add __typename as non-optional when its explictly specified, even if skipTypename is true', async () => {\n      const ast = parse(/* GraphQL */ `\n        query {\n          __typename\n          dummy\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type Unnamed_1_Query = (\n          { __typename: 'Query' }\n          & Pick<Query, 'dummy'>\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should add __typename correctly when unions are in use', async () => {\n      const ast = parse(/* GraphQL */ `\n        query unionTest {\n          unionTest {\n            ... on User {\n              id\n            }\n\n            ... on Profile {\n              age\n            }\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n        export type UnionTestQuery = (\n          { __typename?: 'Query' }\n          & { unionTest?: Maybe<(\n            { __typename?: 'User' }\n            & Pick<User, 'id'>\n          ) | (\n            { __typename?: 'Profile' }\n            & Pick<Profile, 'age'>\n          )> }\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should add __typename correctly when interfaces are in use', async () => {\n      const ast = parse(/* GraphQL */ `\n        query notifications {\n          notifications {\n            id\n\n            ... on TextNotification {\n              text\n            }\n\n            ... on ImageNotification {\n              imageUrl\n              metadata {\n                createdBy\n              }\n            }\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n        export type NotificationsQuery = (\n          { __typename?: 'Query' }\n          & { notifications: Array<(\n            { __typename?: 'TextNotification' }\n            & Pick<TextNotification, 'text' | 'id'>\n          ) | (\n            { __typename?: 'ImageNotification' }\n            & Pick<ImageNotification, 'imageUrl' | 'id'>\n            & { metadata: (\n                { __typename?: 'ImageMetadata' }\n                & Pick<ImageMetadata, 'createdBy'>\n              ) }\n          )> }\n        );\n      `);\n      await validate(content, config);\n    });\n    it('should mark __typename as non optional in case it is included in the selection set of an interface field', async () => {\n      const ast = parse(/* GraphQL */ `\n        query notifications {\n          notifications {\n            __typename\n            ... on TextNotification {\n              text\n            }\n            ... on ImageNotification {\n              imageUrl\n            }\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n        export type NotificationsQuery = (\n          { __typename?: 'Query' }\n          & { notifications: Array<(\n            { __typename: 'TextNotification' }\n            & Pick<TextNotification, 'text'>\n          ) | (\n            { __typename: 'ImageNotification' }\n            & Pick<ImageNotification, 'imageUrl'>\n          )> }\n        );\n      `);\n      await validate(content, config);\n    });\n    it('should mark __typename as non optional in case it is included in the selection set of an union field', async () => {\n      const ast = parse(/* GraphQL */ `\n        query unionTest {\n          unionTest {\n            __typename\n            ... on Profile {\n              firstName\n            }\n            ... on User {\n              email\n            }\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n      { __typename?: 'Query' }\n      & { unionTest?: Maybe<(\n        { __typename: 'User' }\n        & Pick<User, 'email'>\n      ) | (\n        { __typename: 'Profile' }\n        & Pick<Profile, 'firstName'>\n      )> }\n    );\n      `);\n      await validate(content, config);\n    });\n  });\n\n  describe('Unnamed Documents', () => {\n    it('Should handle unnamed documents correctly', async () => {\n      const ast = parse(/* GraphQL */ `\n        query {\n          dummy\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n        export type Unnamed_1_Query = Pick<Query, 'dummy'>;\n      `);\n      expect(content).toBeSimilarStringTo(`\n        export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never; }>;\n      `);\n      await validate(content, config);\n    });\n\n    it('Should handle unnamed documents correctly with multiple documents', async () => {\n      const ast = parse(/* GraphQL */ `\n        query {\n          dummy\n        }\n\n        query {\n          dummy\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type Unnamed_1_Query = Pick<Query, 'dummy'>;\n      `);\n      expect(content).toBeSimilarStringTo(`\n        export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never; }>;\n      `);\n      expect(content).toBeSimilarStringTo(`\n        export type Unnamed_2_Query = Pick<Query, 'dummy'>;\n      `);\n      expect(content).toBeSimilarStringTo(`\n        export type Unnamed_2_QueryVariables = Exact<{ [key: string]: never; }>;\n      `);\n      await validate(content, config);\n    });\n  });\n\n  describe('Selection Set', () => {\n    it('Should detect invalid types as parent and notify', async () => {\n      const ast = parse(/* GraphQL */ `\n        mutation test {\n          test\n        }\n      `);\n      const config = { preResolveTypes: false };\n\n      try {\n        await plugin(\n          buildSchema(/* GraphQL */ `\n            type Query {\n              foo: String\n            }\n          `),\n          [{ location: 'test-file.ts', document: ast }],\n          config,\n          { outputFile: '' }\n        );\n        expect(true).toBeFalsy();\n      } catch (e) {\n        expect(e.message).toBe('Unable to find root schema type for operation type \"mutation\"!');\n      }\n    });\n\n    it('Should have valid __typename usage and split types according to that (with usage)', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        scalar IPV4\n        scalar IPV6\n\n        type IPV4Route {\n          address: IPV4\n          gateway: IPV4\n        }\n\n        type IPV6Route {\n          address: IPV6\n          gateway: IPV6\n        }\n\n        union RouteUnion = IPV4Route | IPV6Route\n\n        type Query {\n          routes: [RouteUnion!]!\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        fragment NetRoute on RouteUnion {\n          __typename\n          ... on IPV4Route {\n            ipv4Address: address\n            ipv4Gateway: gateway\n          }\n          ... on IPV6Route {\n            ipv6Address: address\n            ipv6Gateway: gateway\n          }\n        }\n\n        query QQ {\n          routes {\n            ...NetRoute\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      const usage = `\n      type Route = QqQuery['routes'][0];\n\n      function validateGateway(route: Route) {\n          if (route.__typename === 'IPV4Route') {\n              console.log(route.ipv4Gateway)\n          } else {\n              console.log(route.ipv6Gateway)\n          }\n      }\n      `;\n\n      await validate(content, config, testSchema, usage);\n      expect(mergeOutputs([content])).toMatchSnapshot();\n    });\n\n    it('Should generate the correct __typename when using fragment over type', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User\n        }\n\n        type User {\n          id: ID!\n          name: String\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        query userQuery {\n          user {\n            ... on User {\n              id\n              name\n            }\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      await validate(content, config, testSchema);\n      expect(mergeOutputs([content])).toMatchSnapshot();\n    });\n\n    it('Should generate the correct __typename when using both inline fragment and spread over type', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User\n        }\n\n        type User {\n          id: ID!\n          name: String\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        query userQuery {\n          user {\n            ... on User {\n              ...user\n            }\n          }\n        }\n\n        fragment user on User {\n          id\n          name\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      await validate(content, config, testSchema);\n      expect(mergeOutputs([content])).toMatchSnapshot();\n    });\n\n    it('Should generate the correct __typename when using fragment spread over type', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User\n        }\n\n        type User {\n          id: ID!\n          name: String\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        query userQuery {\n          user {\n            ...user\n          }\n        }\n\n        fragment user on User {\n          id\n          name\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      await validate(content, config, testSchema);\n      expect(mergeOutputs([content])).toMatchSnapshot();\n    });\n\n    it('Should generate the correct __typename when using fragment spread over union', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type User {\n          id: ID!\n        }\n\n        type Error {\n          message: String!\n        }\n\n        union UserResult = User | Error\n\n        type Query {\n          user: UserResult!\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        fragment UserFragment on User {\n          id\n        }\n        query aaa {\n          user {\n            ...UserFragment\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      await validate(\n        content,\n        config,\n        testSchema,\n        `function test(q: AaaQuery) {\n        console.log(q.user.__typename === 'User' ? q.user.id : null);\n        console.log(q.user.__typename === 'Error' ? q.user.__typename : null);\n      }`\n      );\n      expect(mergeOutputs([content])).toMatchSnapshot();\n    });\n\n    it('Should have valid fragments intersection on different types (with usage) #2498', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface User {\n          id: ID!\n        }\n\n        type Tom implements User {\n          id: ID!\n          foo: String!\n        }\n\n        type Jerry implements User {\n          id: ID!\n          bar: String!\n        }\n\n        type Query {\n          user: User\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        fragment tom on Tom {\n          id\n          foo\n        }\n\n        fragment jerry on Jerry {\n          id\n          bar\n        }\n\n        fragment user on User {\n          ...tom\n          ...jerry\n        }\n\n        query userQuery {\n          user {\n            ...user\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      await validate(\n        content,\n        config,\n        testSchema,\n        `\n          function test(a: UserFragment) {\n              if (a.__typename === 'Tom') {\n                  console.log(a.foo);\n              } else if (a.__typename === 'Jerry') {\n                  console.log(a.bar);\n              }\n          }`\n      );\n      expect(mergeOutputs([content])).toMatchSnapshot();\n    });\n\n    it('Should have valid __typename usage and split types according to that (with usage)', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        scalar IPV4\n        scalar IPV6\n\n        type IPV4Route {\n          address: IPV4\n          gateway: IPV4\n        }\n\n        type IPV6Route {\n          address: IPV6\n          gateway: IPV6\n        }\n\n        union RouteUnion = IPV4Route | IPV6Route\n\n        type Query {\n          routes: [RouteUnion!]!\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        fragment NetRoute on RouteUnion {\n          __typename\n          ... on IPV4Route {\n            ipv4Address: address\n            ipv4Gateway: gateway\n          }\n          ...test\n        }\n\n        fragment test on IPV6Route {\n          ipv6Address: address\n          ipv6Gateway: gateway\n        }\n\n        query QQ {\n          routes {\n            ...NetRoute\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      const usage = `\n      type Route = QqQuery['routes'][0];\n\n      function validateGateway(route: Route) {\n          if (route.__typename === 'IPV4Route') {\n              console.log(route.ipv4Gateway)\n          } else {\n              console.log(route.ipv6Gateway)\n          }\n      }\n      `;\n\n      await validate(content, config, testSchema, usage);\n      expect(mergeOutputs([content])).toMatchSnapshot();\n    });\n\n    it('Should support fragment spread correctly with simple type with no other fields', async () => {\n      const ast = parse(/* GraphQL */ `\n        fragment UserFields on User {\n          id\n          username\n          profile {\n            age\n          }\n          role\n        }\n\n        query me {\n          me {\n            ...UserFields\n          }\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n        export type MeQuery = { me?: Maybe<(\n            Pick<User, 'id' | 'username' | 'role'>\n            & { profile?: Maybe<Pick<Profile, 'age'>> }\n          )> };\n      `);\n      await validate(content, config);\n    });\n\n    it('Should support fragment spread correctly with simple type with other fields', async () => {\n      const ast = parse(/* GraphQL */ `\n        fragment UserFields on User {\n          id\n          profile {\n            age\n          }\n        }\n\n        query me {\n          me {\n            ...UserFields\n            username\n          }\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n      export type MeQuery = { me?: Maybe<(\n        Pick<User, 'username' | 'id'>\n        & { profile?: Maybe<Pick<Profile, 'age'>> }\n      )> };\n      `);\n      await validate(content, config);\n    });\n\n    it('Should support fragment spread correctly with multiple fragment spread', async () => {\n      const ast = parse(/* GraphQL */ `\n        fragment UserFields on User {\n          id\n        }\n\n        fragment UserProfile on User {\n          profile {\n            age\n          }\n        }\n\n        query me {\n          me {\n            ...UserFields\n            ...UserProfile\n            username\n          }\n        }\n      `);\n      const config = { skipTypename: false, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n      export type MeQuery = (\n        { __typename?: 'Query' }\n        & { me?: Maybe<(\n          { __typename?: 'User' }\n          & Pick<User, 'username' | 'id'>\n          & { profile?: Maybe<(\n            { __typename?: 'Profile' }\n            & Pick<Profile, 'age'>\n          )> }\n        )> }\n      );\n      `);\n      expect(content).toBeSimilarStringTo(`\n        export type UserProfileFragment = (\n          { __typename?: 'User' }\n          & { profile?: Maybe<(\n            { __typename?: 'Profile' }\n            & Pick<Profile, 'age'>\n          )> }\n        );\n      `);\n      expect(content).toBeSimilarStringTo(`\n        export type UserFieldsFragment = (\n          { __typename?: 'User' }\n          & Pick<User, 'id'>\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should generate the correct intersection for fragments when using with interfaces with different type', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface Base {\n          id: ID!\n        }\n\n        type A implements Base {\n          id: ID!\n          x: Int!\n        }\n\n        type B implements Base {\n          id: ID!\n          y: Int!\n        }\n\n        type Query {\n          b: Base\n        }\n      `);\n\n      const ast = parse(/* GraphQL */ `\n        query {\n          b {\n            ...a\n            ...b\n          }\n        }\n\n        fragment a on A {\n          id\n          x\n        }\n\n        fragment b on B {\n          id\n          y\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n      export type Unnamed_1_Query = (\n        { __typename?: 'Query' }\n        & { b?: Maybe<(\n          { __typename?: 'A' }\n          & Pick<A, 'id' | 'x'>\n        ) | (\n          { __typename?: 'B' }\n          & Pick<B, 'id' | 'y'>\n        )> }\n      );\n\n      export type AFragment = (\n        { __typename?: 'A' }\n        & Pick<A, 'id' | 'x'>\n      );\n\n      export type BFragment = (\n        { __typename?: 'B' }\n        & Pick<B, 'id' | 'y'>\n      );\n      `);\n      await validate(content, config, schema);\n    });\n\n    it('Should generate the correct intersection for fragments when type implements 2 interfaces', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface Base1 {\n          foo: String!\n        }\n\n        interface Base2 {\n          bar: String!\n        }\n\n        type MyType implements Base1 & Base2 {\n          foo: String!\n          bar: String!\n          test: String!\n        }\n\n        type Query {\n          myType: MyType!\n        }\n      `);\n\n      const ast = parse(/* GraphQL */ `\n        query {\n          myType {\n            ...a\n            ...b\n            ...c\n          }\n        }\n\n        fragment c on MyType {\n          test\n        }\n\n        fragment a on Base1 {\n          foo\n        }\n\n        fragment b on Base2 {\n          bar\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n      export type Unnamed_1_Query = (\n        { __typename?: 'Query' }\n        & { myType: (\n          { __typename?: 'MyType' }\n          & Pick<MyType, 'foo' | 'bar' | 'test'>\n        ) }\n      );\n      `);\n      await validate(content, config, schema);\n    });\n\n    it('Should generate the correct intersection for fragments when using with interfaces with same type', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface Base {\n          id: ID!\n        }\n\n        type A implements Base {\n          id: ID!\n          x: Int!\n        }\n\n        type B implements Base {\n          id: ID!\n          y: Int!\n        }\n\n        type Query {\n          b: Base\n        }\n      `);\n\n      const ast = parse(/* GraphQL */ `\n        query {\n          b {\n            ...a\n            ...b\n          }\n        }\n\n        fragment a on A {\n          id\n        }\n\n        fragment b on A {\n          x\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n      export type Unnamed_1_Query = (\n        { __typename?: 'Query' }\n        & { b?: Maybe<(\n          { __typename?: 'A' }\n          & Pick<A, 'id' | 'x'>\n        ) | { __typename?: 'B' }> }\n      );\n\n        export type AFragment = (\n          { __typename?: 'A' }\n          & Pick<A, 'id'>\n        );\n\n        export type BFragment = (\n          { __typename?: 'A' }\n          & Pick<A, 'x'>\n        );\n      `);\n      validateTs(mergeOutputs([content]), config);\n      expect(mergeOutputs([content])).toMatchSnapshot();\n    });\n\n    it('Should support interfaces correctly when used with inline fragments', async () => {\n      const ast = parse(/* GraphQL */ `\n        query notifications {\n          notifications {\n            id\n\n            ... on TextNotification {\n              text\n            }\n\n            ... on ImageNotification {\n              imageUrl\n              metadata {\n                createdBy\n              }\n            }\n          }\n        }\n      `);\n\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n        export type NotificationsQuery = (\n          { __typename?: 'Query' }\n          & { notifications: Array<(\n            { __typename?: 'TextNotification' }\n            & Pick<TextNotification, 'text' | 'id'>\n          ) | (\n            { __typename?: 'ImageNotification' }\n            & Pick<ImageNotification, 'imageUrl' | 'id'>\n            & { metadata: (\n                { __typename?: 'ImageMetadata' }\n                & Pick<ImageMetadata, 'createdBy'>\n              ) }\n          )> }\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should support union correctly when used with inline fragments', async () => {\n      const ast = parse(/* GraphQL */ `\n        query unionTest {\n          unionTest {\n            ... on User {\n              id\n            }\n\n            ... on Profile {\n              age\n            }\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type UnionTestQuery = (\n          { __typename?: 'Query' }\n            & { unionTest?: Maybe<(\n            { __typename?: 'User' }\n            & Pick<User, 'id'>\n          ) | (\n            { __typename?: 'Profile' }\n            & Pick<Profile, 'age'>\n          )> }\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should support union correctly when used with inline fragments on types implementing common interface', async () => {\n      const ast = parse(/* GraphQL */ `\n        query unionTest {\n          mixedNotifications {\n            ... on Notifiction {\n              id\n            }\n\n            ... on TextNotification {\n              text\n            }\n\n            ... on ImageNotification {\n              imageUrl\n            }\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type UnionTestQuery = (\n          { __typename?: 'Query' }\n          & { mixedNotifications: Array<(\n            { __typename?: 'TextNotification' }\n            & Pick<TextNotification, 'id' | 'text'>\n          ) | (\n            { __typename?: 'ImageNotification' }\n            & Pick<ImageNotification, 'id' | 'imageUrl'>\n          )> }\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should support union correctly when used with inline fragments on types implementing common interface and also other types', async () => {\n      const ast = parse(/* GraphQL */ `\n        query unionTest {\n          search(term: \"a\") {\n            ... on User {\n              id\n            }\n\n            ... on Notifiction {\n              id\n            }\n\n            ... on TextNotification {\n              text\n            }\n\n            ... on ImageNotification {\n              imageUrl\n            }\n          }\n        }\n      `);\n      const config = { preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type UnionTestQuery = (\n          { __typename?: 'Query' }\n          & { search: Array<(\n            { __typename?: 'TextNotification' }\n            & Pick<TextNotification, 'id' | 'text'>\n          ) | (\n            { __typename?: 'ImageNotification' }\n            & Pick<ImageNotification, 'id' | 'imageUrl'>\n          ) | (\n            { __typename?: 'User' }\n            & Pick<User, 'id'>\n          )> }\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should support merging identical fragment union types', async () => {\n      const ast = parse(/* GraphQL */ `\n        query test {\n          notifications {\n            ...N\n          }\n        }\n\n        fragment N on Notifiction {\n          id\n        }\n      `);\n      const config = { preResolveTypes: true, mergeFragmentTypes: true, namingConvention: 'keep' };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type testQueryVariables = Exact<{ [key: string]: never; }>;\n\n        export type testQuery = (\n          { notifications: Array<(\n            { id: string }\n            & { __typename?: 'TextNotification' | 'ImageNotification' }\n          )> }\n          & { __typename?: 'Query' }\n        );\n\n        export type NFragment = (\n          { id: string }\n          & { __typename?: 'TextNotification' | 'ImageNotification' }\n        );\n     `);\n      await validate(content, config);\n    });\n\n    it('Should support computing correct names for merged fragment union types', async () => {\n      const ast = parse(/* GraphQL */ `\n        fragment N on Notifiction {\n          id\n          ... on TextNotification {\n            text\n          }\n        }\n      `);\n      const config = { preResolveTypes: true, mergeFragmentTypes: true, namingConvention: 'keep' };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        type N_TextNotification_Fragment = (\n          { text: string, id: string }\n          & { __typename?: 'TextNotification' }\n        );\n\n        type N_ImageNotification_Fragment = (\n          { id: string }\n          & { __typename?: 'ImageNotification' }\n        );\n\n        export type NFragment = N_TextNotification_Fragment | N_ImageNotification_Fragment;\n      `);\n      await validate(content, config);\n    });\n\n    it('Should support computing correct names for large merged fragment union types', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Node {\n          id: ID!\n        }\n\n        type A implements Node {\n          id: ID!\n          text: String!\n        }\n\n        type B implements Node {\n          id: ID!\n          text: String!\n        }\n\n        type C implements Node {\n          id: ID!\n          text: String!\n        }\n\n        type D implements Node {\n          id: ID!\n          text: String!\n        }\n\n        type E implements Node {\n          id: ID!\n          text: String!\n        }\n      `);\n\n      const ast = parse(/* GraphQL */ `\n        fragment N on Node {\n          id\n          ... on A {\n            text\n          }\n        }\n      `);\n      const config = { preResolveTypes: true, mergeFragmentTypes: true, namingConvention: 'keep' };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n         type N_A_Fragment = (\n           { text: string, id: string }\n           & { __typename?: 'A' }\n         );\n\n         type N_zhJJUzpMTyh98zugnx0IKwiLetPNjV8KybSlmpAEUU_Fragment = (\n           { id: string }\n           & { __typename?: 'B' | 'C' | 'D' | 'E' }\n         );\n\n         export type NFragment = N_A_Fragment | N_zhJJUzpMTyh98zugnx0IKwiLetPNjV8KybSlmpAEUU_Fragment;\n      `);\n      await validate(content, config);\n    });\n\n    it('Should not create empty types when merging fragment union types', async () => {\n      const ast = parse(/* GraphQL */ `\n        fragment N on Query {\n          notifications {\n            ... on TextNotification {\n              text\n            }\n          }\n        }\n      `);\n      const config = { preResolveTypes: true, mergeFragmentTypes: true, namingConvention: 'keep' };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n       export type NFragment = (\n         { notifications: Array<(\n           { text: string }\n           & { __typename?: 'TextNotification' }\n         ) | { __typename?: 'ImageNotification' }> }\n         & { __typename?: 'Query' }\n       );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should support merging identical fragment union types with skipTypename', async () => {\n      const ast = parse(/* GraphQL */ `\n        query test {\n          notifications {\n            ...N\n          }\n        }\n\n        fragment N on Notifiction {\n          id\n        }\n      `);\n      const config = { preResolveTypes: true, skipTypename: true, mergeFragmentTypes: true, namingConvention: 'keep' };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type testQueryVariables = Exact<{ [key: string]: never; }>;\n\n        export type testQuery = { notifications: Array<{ id: string }> };\n      `);\n      await validate(content, config);\n    });\n\n    it('Should support computing correct names for merged fragment union types with skipTypename', async () => {\n      const ast = parse(/* GraphQL */ `\n        fragment N on Notifiction {\n          id\n          ... on TextNotification {\n            text\n          }\n        }\n      `);\n      const config = { preResolveTypes: true, skipTypename: true, mergeFragmentTypes: true, namingConvention: 'keep' };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n       type N_TextNotification_Fragment = { text: string, id: string };\n\n       type N_ImageNotification_Fragment = { id: string };\n\n       export type NFragment = N_TextNotification_Fragment | N_ImageNotification_Fragment;\n      `);\n      await validate(content, config);\n    });\n\n    it('Ignores merging when enabled alongside inline fragment masking', async () => {\n      const ast = parse(/* GraphQL */ `\n        query test {\n          notifications {\n            ...N\n          }\n        }\n\n        fragment N on Notifiction {\n          id\n        }\n      `);\n      const config = { preResolveTypes: true, mergeFragmentTypes: true, inlineFragmentTypes: 'mask' } as const;\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n       export type TestQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n       export type TestQuery = { __typename?: 'Query', notifications: Array<(\n        { __typename?: 'TextNotification' }\n        & { ' $fragmentRefs'?: { 'N_TextNotification_Fragment': N_TextNotification_Fragment } }\n       ) | (\n        { __typename?: 'ImageNotification' }\n        & { ' $fragmentRefs'?: { 'N_ImageNotification_Fragment': N_ImageNotification_Fragment } }\n       )> };\n\n       type N_TextNotification_Fragment = { __typename?: 'TextNotification', id: string } & { ' $fragmentName'?: 'N_TextNotification_Fragment' };\n\n       type N_ImageNotification_Fragment = { __typename?: 'ImageNotification', id: string } & { ' $fragmentName'?: 'N_ImageNotification_Fragment' };\n\n       export type NFragment = N_TextNotification_Fragment | N_ImageNotification_Fragment;\n     `);\n      await validate(content, config);\n    });\n\n    it('Should support inline fragments', async () => {\n      const ast = parse(/* GraphQL */ `\n        query currentUser {\n          me {\n            id\n            ... on User {\n              username\n              profile {\n                age\n              }\n            }\n          }\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n      expect(content).toBeSimilarStringTo(`\n        export type CurrentUserQuery = { me?: Maybe<(\n            Pick<User, 'username' | 'id'>\n            & { profile?: Maybe<Pick<Profile, 'age'>> }\n        )> };\n      `);\n\n      await validate(content, config);\n    });\n\n    it('Should build a basic selection set based on basic query on GitHub schema', async () => {\n      const ast = parse(/* GraphQL */ `\n        query me($repoFullName: String!) {\n          currentUser {\n            login\n            html_url\n          }\n          entry(repoFullName: $repoFullName) {\n            id\n            postedBy {\n              login\n              html_url\n            }\n            createdAt\n          }\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(gitHuntSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(\n        `export type MeQueryVariables = Exact<{\n          repoFullName: Scalars['String']['input'];\n        }>;`\n      );\n      expect(content).toBeSimilarStringTo(`\n        export type MeQuery = { currentUser?: Maybe<Pick<User, 'login' | 'html_url'>>, entry?: Maybe<(\n          Pick<Entry, 'id' | 'createdAt'>\n          & { postedBy: Pick<User, 'login' | 'html_url'> }\n        )> };\n      `);\n      await validate(content, config, gitHuntSchema);\n    });\n\n    it('Should build a basic selection set based on basic query on GitHub schema with preResolveTypes=true', async () => {\n      const ast = parse(/* GraphQL */ `\n        query me($repoFullName: String!) {\n          currentUser {\n            login\n            html_url\n          }\n          entry(repoFullName: $repoFullName) {\n            id\n            postedBy {\n              login\n              html_url\n            }\n            createdAt\n          }\n        }\n      `);\n      const config = { preResolveTypes: true };\n      const { content } = await plugin(gitHuntSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type MeQuery = { __typename?: 'Query', currentUser?: { __typename?: 'User', login: string, html_url: string } | null, entry?: { __typename?: 'Entry', id: number, createdAt: number, postedBy: { __typename?: 'User', login: string, html_url: string } } | null };\n      `);\n      await validate(content, config, gitHuntSchema);\n    });\n\n    it('Should produce valid output with preResolveTypes=true and enums', async () => {\n      const ast = parse(/* GraphQL */ `\n        query test {\n          info {\n            ...information\n          }\n        }\n\n        fragment information on Information {\n          entries {\n            id\n            value\n          }\n        }\n      `);\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Information {\n          entries: [Information_Entry!]!\n        }\n\n        enum Information_EntryType {\n          NAME\n          ADDRESS\n        }\n\n        type Information_Entry {\n          id: Information_EntryType!\n          value: String\n        }\n\n        type Query {\n          info: Information\n        }\n      `);\n      const config = { preResolveTypes: true };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      const o = await validate(content, config, testSchema);\n      expect(o).toContain(`export enum Information_EntryType {`);\n      expect(o).toContain(`__typename?: 'Information_Entry', id: Information_EntryType,`);\n    });\n\n    it('Should produce valid output with preResolveTypes=true and enums with prefixes set', async () => {\n      const ast = parse(/* GraphQL */ `\n        query test($e: Information_EntryType!) {\n          info {\n            ...information\n          }\n          infoArgTest(e: $e) {\n            ...information\n          }\n        }\n\n        fragment information on Information {\n          entries {\n            id\n            value\n          }\n        }\n      `);\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Information {\n          entries: [Information_Entry!]!\n        }\n\n        enum Information_EntryType {\n          NAME\n          ADDRESS\n        }\n\n        type Information_Entry {\n          id: Information_EntryType!\n          value: String\n        }\n\n        type Query {\n          infoArgTest(e: Information_EntryType!): Information\n          info: Information\n        }\n      `);\n      const config = { preResolveTypes: true, typesPrefix: 'I', enumPrefix: false };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      const o = await validate(content, config, testSchema);\n      expect(o).toBeSimilarStringTo(` export type ITestQueryVariables = Exact<{\n        e: Information_EntryType;\n      }>;`);\n      expect(o).toContain(`export type IQuery = {`);\n      expect(o).toContain(`export enum Information_EntryType {`);\n      expect(o).toContain(`__typename?: 'Information_Entry', id: Information_EntryType,`);\n    });\n\n    it('Should produce valid output with preResolveTypes=true and enums with no suffixes', async () => {\n      const ast = parse(/* GraphQL */ `\n        query test($e: Information_EntryType!) {\n          info {\n            ...information\n          }\n          infoArgTest(e: $e) {\n            ...information\n          }\n        }\n\n        fragment information on Information {\n          entries {\n            id\n            value\n          }\n        }\n      `);\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Information {\n          entries: [Information_Entry!]!\n        }\n\n        enum Information_EntryType {\n          NAME\n          ADDRESS\n        }\n\n        type Information_Entry {\n          id: Information_EntryType!\n          value: String\n        }\n\n        type Query {\n          infoArgTest(e: Information_EntryType!): Information\n          info: Information\n        }\n      `);\n      const config = { preResolveTypes: true, typesSuffix: 'I', enumSuffix: false };\n      const { content } = await plugin(testSchema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      const o = await validate(content, config, testSchema);\n      expect(o).toBeSimilarStringTo(` export type TestQueryVariablesI = Exact<{\n        e: Information_EntryType;\n      }>;`);\n      expect(o).toContain(`export type QueryI = {`);\n      expect(o).toContain(`export enum Information_EntryType {`);\n      expect(o).toContain(`__typename?: 'Information_Entry', id: Information_EntryType,`);\n    });\n\n    it('Should build a basic selection set based on basic query', async () => {\n      const ast = parse(/* GraphQL */ `\n        query dummy {\n          dummy\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type DummyQuery = Pick<Query, 'dummy'>;\n      `);\n      await validate(content, config);\n    });\n\n    it('Should build a basic selection set based on basic query with field aliasing for basic scalar', async () => {\n      const ast = parse(/* GraphQL */ `\n        query dummy {\n          customName: dummy\n          customName2: dummyWithType {\n            age\n          }\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type DummyQuery = (\n          { customName: Query['dummy'] }\n          & { customName2?: Maybe<Pick<Profile, 'age'>> }\n        );\n      `);\n      await validate(content, config);\n    });\n\n    it('Should build a basic selection set based on a query with inner fields', async () => {\n      const ast = parse(/* GraphQL */ `\n        query currentUser {\n          me {\n            id\n            username\n            role\n            profile {\n              age\n            }\n          }\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type CurrentUserQuery = { me?: Maybe<(\n          Pick<User, 'id' | 'username' | 'role'>\n          & { profile?: Maybe<Pick<Profile, 'age'>> }\n        )> };\n      `);\n      await validate(content, config);\n    });\n  });\n\n  describe('Fragment Definition', () => {\n    it('Should build fragment definition correctly - with name and selection set', async () => {\n      const ast = parse(/* GraphQL */ `\n        fragment UserFields on User {\n          id\n          username\n          profile {\n            age\n          }\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type UserFieldsFragment = (\n          Pick<User, 'id' | 'username'>\n          & { profile?: Maybe<Pick<Profile, 'age'>> }\n        );\n      `);\n      await validate(content, config);\n    });\n  });\n\n  describe('Operation Definition', () => {\n    it('Should detect Mutation correctly', async () => {\n      const ast = parse(/* GraphQL */ `\n        mutation login {\n          login(username: \"1\", password: \"2\") {\n            id\n            username\n            profile {\n              age\n            }\n          }\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type LoginMutation = { login?: Maybe<(\n          Pick<User, 'id' | 'username'>\n          & { profile?: Maybe<Pick<Profile, 'age'>> }\n        )> };\n      `);\n      await validate(content, config);\n    });\n\n    it('Should detect Query correctly', async () => {\n      const ast = parse(/* GraphQL */ `\n        query test {\n          dummy\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type TestQuery = Pick<Query, 'dummy'>;\n      `);\n      await validate(content, config);\n    });\n\n    it('Should detect Subscription correctly', async () => {\n      const ast = parse(/* GraphQL */ `\n        subscription test {\n          userCreated {\n            id\n          }\n        }\n      `);\n      const config = { skipTypename: true, preResolveTypes: false };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type TestSubscription = { userCreated?: Maybe<Pick<User, 'id'>> };\n      `);\n      await validate(content, config);\n    });\n\n    it('Should handle operation variables correctly', async () => {\n      const ast = parse(/* GraphQL */ `\n        query testQuery(\n          $username: String\n          $email: String\n          $password: String!\n          $input: InputType\n          $mandatoryInput: InputType!\n          $testArray: [String]\n          $requireString: [String]!\n          $innerRequired: [String!]!\n        ) {\n          dummy\n        }\n      `);\n      const config = { skipTypename: true };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(\n        `export type TestQueryQueryVariables = Exact<{\n          username?: InputMaybe<Scalars['String']['input']>;\n          email?: InputMaybe<Scalars['String']['input']>;\n          password: Scalars['String']['input'];\n          input?: InputMaybe<InputType>;\n          mandatoryInput: InputType;\n          testArray?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>> | InputMaybe<Scalars['String']['input']>>;\n          requireString: Array<InputMaybe<Scalars['String']['input']>> | InputMaybe<Scalars['String']['input']>;\n          innerRequired: Array<Scalars['String']['input']> | Scalars['String']['input'];\n        }>;`\n      );\n      await validate(content, config, schema);\n    });\n\n    it('Should handle operation variables correctly when they use custom scalars', async () => {\n      const ast = parse(/* GraphQL */ `\n        query testQuery($test: DateTime) {\n          dummy\n        }\n      `);\n      const config = { skipTypename: true };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(\n        `export type TestQueryQueryVariables = Exact<{\n          test?: InputMaybe<Scalars['DateTime']['input']>;\n        }>;`\n      );\n      await validate(content, config);\n    });\n\n    it('Should create empty variables when there are no operation variables', async () => {\n      const ast = parse(/* GraphQL */ `\n        query testQuery {\n          dummy\n        }\n      `);\n      const config = { skipTypename: true };\n      const { content } = await plugin(schema, [{ location: 'test-file.ts', document: ast }], config, {\n        outputFile: '',\n      });\n\n      expect(content).toBeSimilarStringTo(`export type TestQueryQueryVariables = Exact<{ [key: string]: never; }>;`);\n      await validate(content, config);\n    });\n\n    it('avoid duplicates - each type name should be unique', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type DeleteMutation {\n          deleted: Boolean!\n        }\n        type UpdateMutation {\n          updated: Boolean!\n        }\n        union MessageMutationType = DeleteMutation | UpdateMutation\n        type Query {\n          dummy: String\n        }\n        type Mutation {\n          mutation(message: String!, type: String!): MessageMutationType!\n        }\n      `);\n      const query = parse(/* GraphQL */ `\n        mutation SubmitMessage($message: String!) {\n          mutation(message: $message) {\n            ... on DeleteMutation {\n              deleted\n            }\n            ... on UpdateMutation {\n              updated\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type SubmitMessageMutation = (\n          { __typename?: 'Mutation' }\n          & { mutation: (\n            { __typename?: 'DeleteMutation' }\n            & Pick<DeleteMutation, 'deleted'>\n          ) | (\n            { __typename?: 'UpdateMutation' }\n          & Pick<UpdateMutation, 'updated'>\n          ) }\n        );\n      `);\n    });\n\n    it('should use __typename in fragments when requested', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Post {\n          title: String\n        }\n        type Query {\n          post: Post!\n        }\n      `);\n      const query = parse(/* GraphQL */ `\n        query Post {\n          post {\n            ... on Post {\n              __typename\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type PostQuery = (\n          { __typename?: 'Query' }\n          & { post: { __typename: 'Post' } }\n        );\n      `);\n    });\n\n    it('should handle introspection types (__schema)', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Post {\n          title: String\n        }\n        type Query {\n          post: Post!\n        }\n      `);\n      const query = parse(/* GraphQL */ `\n        query Info {\n          __schema {\n            queryType {\n              fields {\n                name\n              }\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type InfoQuery = (\n          { __typename?: 'Query' }\n          & { __schema: (\n            { __typename?: '__Schema' }\n            & { queryType: (\n              { __typename?: '__Type' }\n              & { fields?: Maybe<Array<(\n                { __typename?: '__Field' }\n                & Pick<__Field, 'name'>\n              )>> }\n            ) }\n          ) }\n        );`);\n    });\n\n    it('should handle introspection types (__type)', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Post {\n          title: String\n        }\n        type Query {\n          post: Post!\n        }\n      `);\n      const query = parse(/* GraphQL */ `\n        query Info {\n          __type(name: \"Post\") {\n            name\n            fields {\n              name\n              type {\n                name\n                kind\n              }\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type InfoQuery = (\n          { __typename?: 'Query' }\n          & { __type?: Maybe<(\n            { __typename?: '__Type' }\n            & Pick<__Type, 'name'>\n            & { fields?: Maybe<Array<(\n              { __typename?: '__Field' }\n              & Pick<__Field, 'name'>\n              & { type: (\n                { __typename?: '__Type' }\n                & Pick<__Type, 'name' | 'kind'>\n              ) }\n            )>> }\n          )> }\n        );\n      `);\n    });\n\n    it('should handle introspection types (like __TypeKind)', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Post {\n          title: String\n        }\n        type Query {\n          post: Post!\n        }\n      `);\n      const query = parse(/* GraphQL */ `\n        query Info {\n          __type(name: \"Post\") {\n            name\n            fields {\n              name\n              type {\n                name\n                kind\n              }\n            }\n          }\n        }\n      `);\n\n      const coreContent = await tsPlugin(\n        testSchema,\n        [{ location: '', document: query }],\n        {},\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      const pluginContent = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        {},\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      const content = mergeOutputs([coreContent, pluginContent]);\n\n      expect(content).toBeSimilarStringTo(`\n      /** An enum describing what kind of type a given \\`__Type\\` is. */\n      export enum __TypeKind {\n        /** Indicates this type is a scalar. */\n        Scalar = 'SCALAR',\n        /** Indicates this type is an object. \\`fields\\` and \\`interfaces\\` are valid fields. */\n        Object = 'OBJECT',\n        /** Indicates this type is an interface. \\`fields\\`, \\`interfaces\\`, and \\`possibleTypes\\` are valid fields. */\n        Interface = 'INTERFACE',\n        /** Indicates this type is a union. \\`possibleTypes\\` is a valid field. */\n        Union = 'UNION',\n        /** Indicates this type is an enum. \\`enumValues\\` is a valid field. */\n        Enum = 'ENUM',\n        /** Indicates this type is an input object. \\`inputFields\\` is a valid field. */\n        InputObject = 'INPUT_OBJECT',\n        /** Indicates this type is a list. \\`ofType\\` is a valid field. */\n        List = 'LIST',\n        /** Indicates this type is a non-null. \\`ofType\\` is a valid field. */\n        NonNull = 'NON_NULL'\n      }\n      `);\n\n      validateTs(content);\n    });\n\n    it('Should generate correctly when using enums and typesPrefix', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        enum Access {\n          Read\n          Write\n          All\n        }\n        type User {\n          access: Access\n        }\n        input Filter {\n          match: String!\n        }\n        type Query {\n          users(filter: Filter!): [User]\n        }\n      `);\n      const query = parse(/* GraphQL */ `\n        query users($filter: Filter!) {\n          users(filter: $filter) {\n            access\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { typesPrefix: 'PREFIX_', preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type PREFIX_UsersQueryVariables = Exact<{\n          filter: PREFIX_Filter;\n        }>;\n      `);\n      expect(content).toBeSimilarStringTo(`\n        export type PREFIX_UsersQuery = (\n          { __typename?: 'Query' }\n          & { users?: Maybe<Array<Maybe<(\n            { __typename?: 'User' }\n            & Pick<PREFIX_User, 'access'>\n          )>>> }\n        );\n      `);\n    });\n\n    it('Should make arguments optional when there is a default value', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type User {\n          name: String!\n        }\n        type Query {\n          users(reverse: Boolean!): [User!]!\n        }\n      `);\n      const query = parse(/* GraphQL */ `\n        query users($reverse: Boolean = true) {\n          users(reverse: $reverse) {\n            name\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        {},\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type UsersQueryVariables = Exact<{\n          reverse?: InputMaybe<Scalars['Boolean']['input']>;\n        }>;\n      `);\n    });\n  });\n\n  describe('Union & Interfaces', () => {\n    it('should generate correct types for union that returns interface types', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface Error {\n          message: String!\n        }\n        type Error1 implements Error {\n          message: String!\n        }\n        type Error2 implements Error {\n          message: String!\n        }\n        type Error3 implements Error {\n          message: String!\n        }\n        type ComplexError implements Error {\n          message: String!\n          additionalInfo: String!\n        }\n\n        type FieldResultSuccess {\n          someValue: Boolean!\n        }\n\n        union FieldResult = Error1 | Error2 | ComplexError | FieldResultSuccess\n\n        type Query {\n          field: FieldResult!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query field {\n          field {\n            __typename\n            ... on Error {\n              message\n            }\n            ... on ComplexError {\n              additionalInfo\n            }\n            ... on FieldResultSuccess {\n              someValue\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n      expect(content).toBeSimilarStringTo(`\n      export type FieldQuery = (\n        { __typename?: 'Query' }\n        & { field: (\n          { __typename: 'Error1' }\n          & Pick<Error1, 'message'>\n        ) | (\n          { __typename: 'Error2' }\n          & Pick<Error2, 'message'>\n        ) | (\n          { __typename: 'ComplexError' }\n          & Pick<ComplexError, 'message' | 'additionalInfo'>\n        ) | (\n          { __typename: 'FieldResultSuccess' }\n          & Pick<FieldResultSuccess, 'someValue'>\n        ) }\n      );\n      `);\n    });\n\n    it('should generate correct types for union that returns interface types (variant __typename in fragment)', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface Error {\n          message: String!\n        }\n        type Error1 implements Error {\n          message: String!\n        }\n        type Error2 implements Error {\n          message: String!\n        }\n        type Error3 implements Error {\n          message: String!\n        }\n        type ComplexError implements Error {\n          message: String!\n          additionalInfo: String!\n        }\n\n        type FieldResultSuccess {\n          someValue: Boolean!\n        }\n\n        union FieldResult = Error1 | Error2 | ComplexError | FieldResultSuccess\n\n        type Query {\n          field: FieldResult!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query field {\n          field {\n            ... on Error {\n              __typename\n              message\n            }\n            ... on ComplexError {\n              additionalInfo\n            }\n            ... on FieldResultSuccess {\n              someValue\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n      expect(content).toBeSimilarStringTo(`\n        export type FieldQuery = (\n          { __typename?: 'Query' }\n          & { field: (\n            { __typename: 'Error1' }\n            & Pick<Error1, 'message'>\n          ) | (\n            { __typename: 'Error2' }\n            & Pick<Error2, 'message'>\n          ) | (\n            { __typename: 'ComplexError' }\n            & Pick<ComplexError, 'message' | 'additionalInfo'>\n          ) | (\n            { __typename?: 'FieldResultSuccess' }\n            & Pick<FieldResultSuccess, 'someValue'>\n          ) }\n        );\n      `);\n    });\n    it('interface with same field names', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Node {\n          id: ID!\n        }\n\n        type A implements Node {\n          id: ID!\n          a: String\n        }\n\n        type B implements Node {\n          id: ID!\n          a: Boolean\n        }\n\n        type Query {\n          node: Node\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query something {\n          node {\n            ... on A {\n              a\n            }\n\n            ... on B {\n              a\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type SomethingQuery = (\n          { __typename?: 'Query' }\n          & { node?: Maybe<(\n            { __typename?: 'A' }\n            & Pick<A, 'a'>\n          ) | (\n            { __typename?: 'B' }\n            & Pick<B, 'a'>\n          )> }\n        );\n      `);\n    });\n    it('union returning single interface types', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Error {\n          message: String!\n        }\n        type Error1 implements Error {\n          message: String!\n        }\n        type Error2 implements Error {\n          message: String!\n        }\n        type Error3 implements Error {\n          message: String!\n          info: AdditionalInfo\n        }\n        type AdditionalInfo {\n          message: String!\n        }\n        type User {\n          id: ID!\n          login: String!\n        }\n\n        union UserResult = User | Error2 | Error3\n        type Query {\n          user: UserResult\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query user {\n          user {\n            ... on User {\n              id\n              login\n            }\n            ... on Error {\n              message\n            }\n            ... on Error3 {\n              info {\n                message\n              }\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type UserQuery = (\n          { __typename?: 'Query' }\n          & { user?: Maybe<(\n            { __typename?: 'User' }\n            & Pick<User, 'id' | 'login'>\n          ) | (\n            { __typename?: 'Error2' }\n            & Pick<Error2, 'message'>\n          ) | (\n            { __typename?: 'Error3' }\n            & Pick<Error3, 'message'>\n            & { info?: Maybe<(\n              { __typename?: 'AdditionalInfo' }\n              & Pick<AdditionalInfo, 'message'>\n            )> }\n          )> }\n        );\n      `);\n    });\n\n    it('duplicated fragment on type includes combined types only once', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Error {\n          message: String!\n        }\n        type Error1 implements Error {\n          message: String!\n        }\n        type Error2 implements Error {\n          message: String!\n        }\n        type Error3 implements Error {\n          message: String!\n          info: AdditionalInfo\n        }\n        type AdditionalInfo {\n          message: String!\n          message2: String!\n        }\n        type User {\n          id: ID!\n          login: String!\n        }\n\n        union UserResult = User | Error2 | Error3\n        type Query {\n          user: UserResult\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query user {\n          user {\n            ... on User {\n              id\n              login\n            }\n            ... on Error {\n              message\n              ... on Error3 {\n                info {\n                  message\n                  message2\n                }\n              }\n            }\n            ... on Error {\n              ... on Error3 {\n                info {\n                  message\n                  message2\n                }\n              }\n            }\n            ... on Error3 {\n              info {\n                message\n              }\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type UserQuery = (\n          { __typename?: 'Query' }\n          & { user?: Maybe<(\n            { __typename?: 'User' }\n            & Pick<User, 'id' | 'login'>\n          ) | (\n            { __typename?: 'Error2' }\n            & Pick<Error2, 'message'>\n          ) | (\n            { __typename?: 'Error3' }\n            & Pick<Error3, 'message'>\n            & { info?: Maybe<(\n                { __typename?: 'AdditionalInfo' }\n                & Pick<AdditionalInfo, 'message' | 'message2'>\n              )> }\n          )> }\n        );\n      `);\n    });\n\n    it('Should merge inline fragments fields correctly', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type User {\n          id: ID!\n          login: String!\n        }\n\n        type Query {\n          user: User!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query UserQuery {\n          user {\n            ... on User {\n              id\n            }\n\n            ... on User {\n              login\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      const o = await validate(content, {}, testSchema);\n\n      expect(o).toBeSimilarStringTo(`\n      export type UserQueryQuery = (\n        { __typename?: 'Query' }\n        & { user: (\n          { __typename?: 'User' }\n          & Pick<User, 'id' | 'login'>\n        ) }\n      );\n      `);\n    });\n\n    it('Should merge inline fragments fields correctly with fragment spread over the same type', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type User {\n          id: ID!\n          login: String!\n        }\n\n        type Query {\n          user: User!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query UserQuery {\n          user {\n            ... on User {\n              id\n            }\n\n            ...test\n          }\n        }\n\n        fragment test on User {\n          login\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      const o = await validate(content, {}, testSchema);\n\n      expect(o).toBeSimilarStringTo(`\n      export type UserQueryQuery = (\n        { __typename?: 'Query' }\n        & { user: (\n          { __typename?: 'User' }\n          & Pick<User, 'id' | 'login'>\n        ) }\n      );`);\n\n      expect(o).toBeSimilarStringTo(`export type TestFragment = (\n        { __typename?: 'User' }\n        & Pick<User, 'login'>\n      );`);\n    });\n\n    it('Should handle union selection sets with both FragmentSpreads and InlineFragments', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Error {\n          message: String!\n        }\n        type Error1 implements Error {\n          message: String!\n        }\n        type Error2 implements Error {\n          message: String!\n        }\n        type Error3 implements Error {\n          message: String!\n          info: AdditionalInfo\n        }\n        type AdditionalInfo {\n          message: String!\n          message2: String!\n        }\n        type User {\n          id: ID!\n          login: String!\n        }\n\n        union UserResult = User | Error2 | Error3\n\n        type Query {\n          user: UserResult!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query UserQuery {\n          user {\n            ...UserResult\n            ...UserResult1\n            ... on User {\n              login\n            }\n            ... on Error3 {\n              message\n              info {\n                ...AdditionalInfo\n              }\n            }\n          }\n        }\n\n        fragment AdditionalInfo on AdditionalInfo {\n          message\n        }\n\n        fragment UserResult1 on UserResult {\n          ... on User {\n            id\n          }\n          ... on Error3 {\n            info {\n              message2\n            }\n          }\n        }\n\n        fragment UserResult on UserResult {\n          ... on User {\n            id\n          }\n          ... on Error2 {\n            message\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      const output = await validate(\n        content,\n        {},\n        testSchema,\n        `\n        function t(q: UserQueryQuery) {\n            if (q.user) {\n                if (q.user.__typename === 'User') {\n                    if (q.user.id) {\n                        const u = q.user.login;\n                    }\n                }\n                if (q.user.__typename === 'Error2') {\n                    console.log(q.user.message);\n                }\n                if (q.user.__typename === 'Error3') {\n                    if (q.user.info) {\n                        console.log(q.user.info.__typename)\n                    }\n                }\n            }\n        }`\n      );\n      expect(mergeOutputs([content])).toMatchSnapshot();\n\n      expect(output).toBeSimilarStringTo(`\n      export type UserQueryQuery = (\n        { __typename?: 'Query' }\n        & { user: (\n          { __typename?: 'User' }\n          & Pick<User, 'login' | 'id'>\n        ) | (\n          { __typename?: 'Error2' }\n          & Pick<Error2, 'message'>\n        ) | (\n          { __typename?: 'Error3' }\n          & Pick<Error3, 'message'>\n          & { info?: Maybe<(\n            { __typename?: 'AdditionalInfo' }\n            & Pick<AdditionalInfo, 'message2' | 'message'>\n          )> }\n        ) }\n      );`);\n\n      expect(output).toBeSimilarStringTo(`\n      export type AdditionalInfoFragment = (\n        { __typename?: 'AdditionalInfo' }\n        & Pick<AdditionalInfo, 'message'>\n      );\n\n      type UserResult1_User_Fragment = (\n        { __typename?: 'User' }\n        & Pick<User, 'id'>\n      );\n\n      type UserResult1_Error2_Fragment = { __typename?: 'Error2' };\n\n      type UserResult1_Error3_Fragment = (\n        { __typename?: 'Error3' }\n        & { info?: Maybe<(\n          { __typename?: 'AdditionalInfo' }\n          & Pick<AdditionalInfo, 'message2'>\n        )> }\n      );\n\n      export type UserResult1Fragment = UserResult1_User_Fragment | UserResult1_Error2_Fragment | UserResult1_Error3_Fragment;\n\n      type UserResult_User_Fragment = (\n        { __typename?: 'User' }\n        & Pick<User, 'id'>\n      );\n\n      type UserResult_Error2_Fragment = (\n        { __typename?: 'Error2' }\n        & Pick<Error2, 'message'>\n      );\n\n      type UserResult_Error3_Fragment = { __typename?: 'Error3' };\n\n      export type UserResultFragment = UserResult_User_Fragment | UserResult_Error2_Fragment | UserResult_Error3_Fragment;`);\n    });\n\n    it('Should handle union selection sets with both FragmentSpreads and InlineFragments with flattenGeneratedTypes', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Error {\n          message: String!\n        }\n        type Error1 implements Error {\n          message: String!\n        }\n        type Error2 implements Error {\n          message: String!\n        }\n        type Error3 implements Error {\n          message: String!\n          info: AdditionalInfo\n        }\n        type AdditionalInfo {\n          message: String!\n          message2: String!\n        }\n        type User {\n          id: ID!\n          login: String!\n        }\n\n        union UserResult = User | Error2 | Error3\n\n        type Query {\n          user: UserResult!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query UserQuery {\n          user {\n            ...UserResult\n            ...UserResult1\n            ... on User {\n              login\n            }\n            ... on Error3 {\n              message\n              info {\n                ...AdditionalInfo\n              }\n            }\n          }\n        }\n\n        fragment AdditionalInfo on AdditionalInfo {\n          message\n        }\n\n        fragment UserResult1 on UserResult {\n          ... on User {\n            id\n          }\n          ... on Error3 {\n            info {\n              message2\n            }\n          }\n        }\n\n        fragment UserResult on UserResult {\n          ... on User {\n            id\n          }\n          ... on Error2 {\n            message\n          }\n        }\n      `);\n\n      const config = {\n        flattenGeneratedTypes: true,\n        preResolveTypes: false,\n      };\n\n      const { content } = await plugin(testSchema, [{ location: '', document: query }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      const output = await validate(\n        content,\n        config,\n        testSchema,\n        `\n        function t(q: UserQueryQuery) {\n            if (q.user) {\n                if (q.user.__typename === 'User') {\n                    if (q.user.id) {\n                        const u = q.user.login;\n                    }\n                }\n                if (q.user.__typename === 'Error2') {\n                    console.log(q.user.message);\n                }\n                if (q.user.__typename === 'Error3') {\n                    if (q.user.info) {\n                        console.log(q.user.info.__typename)\n                    }\n                }\n            }\n        }`\n      );\n      expect(mergeOutputs([output])).toMatchSnapshot();\n\n      expect(output).toBeSimilarStringTo(`\n      export type UserQueryQuery = (\n        { __typename?: 'Query' }\n        & { user: (\n          { __typename?: 'User' }\n          & Pick<User, 'id' | 'login'>\n        ) | (\n          { __typename?: 'Error2' }\n          & Pick<Error2, 'message'>\n        ) | (\n          { __typename?: 'Error3' }\n          & Pick<Error3, 'message'>\n          & { info?: Maybe<(\n            { __typename?: 'AdditionalInfo' }\n            & Pick<AdditionalInfo, 'message2' | 'message'>\n          )> }\n        ) }\n      );\n      `);\n    });\n\n    it('#4216 - handle fragments against unions and interfaces with flattenGeneratedTypes', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        schema {\n          query: Query\n        }\n\n        type Query {\n          search: [Searchable!]\n        }\n\n        interface Concept {\n          id: String\n        }\n\n        type Dimension implements Concept {\n          id: String\n        }\n\n        type DimValue {\n          dimension: Dimension\n          value: String!\n        }\n\n        union Searchable = Dimension | DimValue\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query SearchPopular {\n          search {\n            ...SearchableFragment\n          }\n        }\n\n        fragment SearchableFragment on Searchable {\n          ...SearchConceptFragment\n          ...SearchDimValueFragment\n        }\n\n        fragment SearchConceptFragment on Concept {\n          id\n        }\n\n        fragment SearchDimValueFragment on DimValue {\n          dimension {\n            ...SearchConceptFragment\n          }\n          value\n        }\n      `);\n\n      const config = {\n        flattenGeneratedTypes: true,\n        preResolveTypes: false,\n      };\n\n      const { content } = await plugin(testSchema, [{ location: '', document: query }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      const output = await validate(content, config, testSchema);\n      expect(mergeOutputs([output])).toMatchSnapshot();\n\n      expect(output).toBeSimilarStringTo(`\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = Maybe<T>;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          search?: Maybe<Array<Searchable>>;\n        };\n\n        export type Concept = {\n          id?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type Dimension = Concept & {\n          __typename?: 'Dimension';\n          id?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type DimValue = {\n          __typename?: 'DimValue';\n          dimension?: Maybe<Dimension>;\n          value: Scalars['String']['output'];\n        };\n\n        export type Searchable = Dimension | DimValue;\n        export type SearchPopularQueryVariables = Exact<{ [key: string]: never; }>;\n\n        export type SearchPopularQuery = (\n          { __typename?: 'Query' }\n          & { search?: Maybe<Array<(\n            { __typename?: 'Dimension' }\n            & Pick<Dimension, 'id'>\n          ) | (\n            { __typename?: 'DimValue' }\n            & Pick<DimValue, 'value'>\n            & { dimension?: Maybe<(\n              { __typename?: 'Dimension' }\n              & Pick<Dimension, 'id'>\n            )> }\n          )>> }\n        );`);\n    });\n\n    it('Handles fragments across files with flattenGeneratedTypes', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        schema {\n          query: Query\n        }\n\n        type Query {\n          search: [Dimension!]\n        }\n\n        type Dimension {\n          id: String\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query SearchPopular {\n          search {\n            ...SearchableFragment\n          }\n        }\n\n        # Unreferenced fragments are still dropped\n        fragment ExtraFragment on Dimension {\n          id\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        fragment SearchableFragment on Dimension {\n          id\n        }\n      `);\n\n      const config = {\n        flattenGeneratedTypes: true,\n        flattenGeneratedTypesIncludeFragments: true,\n        preResolveTypes: true,\n      };\n\n      const { content } = await plugin(\n        testSchema,\n        [\n          { location: '', document: query },\n          { location: '', document: fragment },\n        ],\n        config,\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      const output = await validate(content, config, testSchema);\n\n      expect(output).toBeSimilarStringTo(`\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = Maybe<T>;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          search?: Maybe<Array<Dimension>>;\n        };\n\n        export type Dimension = {\n          __typename?: 'Dimension';\n          id?: Maybe<Scalars['String']['output']>;\n        };\n        export type SearchableFragmentFragment = { __typename?: 'Dimension', id?: string | null };\n\n        export type SearchPopularQueryVariables = Exact<{ [key: string]: never; }>;\n\n        export type SearchPopularQuery = { __typename?: 'Query', search?: Array<{ __typename?: 'Dimension', id?: string | null }> | null };`);\n    });\n\n    it('Drops fragments with flattenGeneratedTypes', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        schema {\n          query: Query\n        }\n\n        type Query {\n          search: [Dimension!]\n        }\n\n        type Dimension {\n          id: String\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query SearchPopular {\n          search {\n            ...SearchableFragment\n          }\n        }\n\n        # Unreferenced fragments should be dropped by flattenGeneratedTypes\n        fragment ExtraFragment on Dimension {\n          id\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        # Referenced fragments should be dropped by flattenGeneratedTypes\n        fragment SearchableFragment on Dimension {\n          id\n        }\n      `);\n\n      const config = {\n        flattenGeneratedTypes: true,\n        flattenGeneratedTypesIncludeFragments: false,\n        preResolveTypes: true,\n      };\n\n      const { content } = await plugin(\n        testSchema,\n        [\n          { location: '', document: query },\n          { location: '', document: fragment },\n        ],\n        config,\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      const output = await validate(content, config, testSchema);\n\n      expect(output).toBeSimilarStringTo(`\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = Maybe<T>;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          search?: Maybe<Array<Dimension>>;\n        };\n\n        export type Dimension = {\n          __typename?: 'Dimension';\n          id?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type SearchPopularQueryVariables = Exact<{ [key: string]: never; }>;\n\n        export type SearchPopularQuery = { __typename?: 'Query', search?: Array<{ __typename?: 'Dimension', id?: string | null }> | null };`);\n    });\n\n    it('Should add operation name when addOperationExport is true', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type User {\n          id: ID!\n          login: String!\n        }\n\n        type Query {\n          user: User!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query UserIdQuery {\n          user {\n            id\n          }\n        }\n        query UserLoginQuery {\n          user {\n            login\n          }\n        }\n      `);\n\n      const config = {\n        addOperationExport: true,\n        preResolveTypes: false,\n      };\n\n      const { content } = await plugin(testSchema, [{ location: '', document: query }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n      export type UserIdQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n      export type UserIdQueryQuery = (\n        { __typename?: 'Query' }\n        & { user: (\n          { __typename?: 'User' }\n          & Pick<User, 'id'>\n        ) }\n      );\n\n      export type UserLoginQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n      export type UserLoginQueryQuery = (\n        { __typename?: 'Query' }\n        & { user: (\n          { __typename?: 'User' }\n          & Pick<User, 'login'>\n        ) }\n      );\n\n      export declare const UserIdQuery: import(\"graphql\").DocumentNode;\n      export declare const UserLoginQuery: import(\"graphql\").DocumentNode;\n      `);\n    });\n\n    it('Should handle union selection sets with both FragmentSpreads and InlineFragments with flattenGeneratedTypes and directives', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Error {\n          message: String!\n        }\n        type Error1 implements Error {\n          message: String!\n        }\n        type Error2 implements Error {\n          message: String!\n        }\n        type Error3 implements Error {\n          message: String!\n          info: AdditionalInfo\n        }\n        type AdditionalInfo {\n          message: String!\n          message2: String!\n        }\n        type User {\n          id: ID!\n          login: String!\n          test: String\n          test2: String\n        }\n\n        union UserResult = User | Error2 | Error3\n\n        type Query {\n          user: UserResult!\n        }\n\n        directive @client on FIELD\n        directive @connection on FIELD\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query UserQuery {\n          user {\n            ...UserResult\n            ...UserResult1\n            ... on User {\n              login\n              test @client\n            }\n            ... on Error3 {\n              message\n              info {\n                ...AdditionalInfo\n              }\n            }\n          }\n        }\n\n        fragment AdditionalInfo on AdditionalInfo {\n          message\n        }\n\n        fragment UserResult1 on UserResult {\n          ... on User {\n            id\n            test2 @connection\n          }\n          ... on Error3 {\n            info {\n              message2\n            }\n          }\n        }\n\n        fragment UserResult on UserResult {\n          ... on User {\n            id\n          }\n          ... on Error2 {\n            message\n          }\n        }\n      `);\n\n      const config = {\n        flattenGeneratedTypes: true,\n        preResolveTypes: false,\n      };\n\n      const { content } = await plugin(testSchema, [{ location: '', document: query }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      const output = await validate(\n        content,\n        config,\n        testSchema,\n        `\n        function t(q: UserQueryQuery) {\n            if (q.user) {\n                if (q.user.__typename === 'User') {\n                    if (q.user.id) {\n                        const u = q.user.login;\n                    }\n                }\n                if (q.user.__typename === 'Error2') {\n                    console.log(q.user.message);\n                }\n                if (q.user.__typename === 'Error3') {\n                    if (q.user.info) {\n                        console.log(q.user.info.__typename)\n                    }\n                }\n            }\n        }`\n      );\n      expect(mergeOutputs([output])).toMatchSnapshot();\n\n      expect(output).toBeSimilarStringTo(`\n      export type UserQueryQuery = (\n        { __typename?: 'Query' }\n        & { user: (\n          { __typename?: 'User' }\n          & Pick<User, 'id' | 'test2' | 'login' | 'test'>\n        ) | (\n          { __typename?: 'Error2' }\n          & Pick<Error2, 'message'>\n        ) | (\n          { __typename?: 'Error3' }\n          & Pick<Error3, 'message'>\n          & { info?: Maybe<(\n            { __typename?: 'AdditionalInfo' }\n            & Pick<AdditionalInfo, 'message2' | 'message'>\n          )> }\n        ) }\n      );\n      `);\n    });\n  });\n\n  describe('Issues', () => {\n    it('#4212 - Should merge TS arrays in a more elegant way', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Item {\n          id: ID!\n          name: String!\n        }\n\n        type Object {\n          items: [Item!]!\n        }\n\n        type Query {\n          obj: Object\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        fragment Object1 on Object {\n          items {\n            id\n          }\n        }\n\n        fragment Object2 on Object {\n          items {\n            name\n          }\n        }\n\n        fragment CombinedObject on Object {\n          ...Object1\n          ...Object2\n        }\n\n        query test {\n          obj {\n            ...CombinedObject\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        {},\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      await validate(\n        content,\n        {},\n        testSchema,\n        `\n          function test (t: TestQuery) {\n            for (const item of t.obj!.items) {\n              console.log(item.id, item.name, item.__typename);\n            }\n          }\n      `\n      );\n    });\n\n    it('#5422 - Error when interface doesnt have implemeting types', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface A {\n          a: String!\n        }\n\n        type Query {\n          test: A\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query test {\n          test {\n            a\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).not.toContain(`Maybe<>`);\n      expect(content).toContain(`Maybe<never>`);\n    });\n\n    it('#4389 - validate issues with interfaces', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface A {\n          a: String!\n        }\n\n        interface B implements A {\n          a: String!\n          b: String\n        }\n\n        type C implements B {\n          a: String!\n          b: String\n          c: String!\n        }\n\n        type Query {\n          foo: C\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query {\n          foo {\n            ... on A {\n              a\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n      expect(content).toContain(`{ foo?: Maybe<{ __typename?: 'C' }> }`);\n    });\n\n    it('#5001 - incorrect output with typeSuffix', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          user(id: ID!): User!\n        }\n\n        type User {\n          id: ID!\n          username: String!\n          email: String!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query user {\n          user(id: 1) {\n            id\n            username\n            email\n          }\n        }\n      `);\n\n      const config = {\n        typesSuffix: 'Type',\n      };\n\n      const { content } = await plugin(testSchema, [{ location: '', document: query }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      expect(content).not.toContain('UserTypeQueryVariablesType');\n      expect(content).not.toContain('UserTypeQueryType');\n      expect(content).toContain('UserQueryVariablesType');\n      expect(content).toContain('UserQueryType');\n    });\n\n    it('#3064 - fragments over interfaces causes issues with fields', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Venue {\n          id: String!\n          name: String!\n        }\n\n        type GPSPosition {\n          lat: Float!\n          lng: Float!\n        }\n\n        interface VenueWithPosition {\n          id: String!\n          gpsPosition: GPSPosition!\n        }\n\n        type Hotel implements VenueWithPosition & Venue {\n          id: String!\n          gpsPosition: GPSPosition!\n          name: String!\n        }\n\n        type Transport implements Venue {\n          id: String!\n          name: String!\n        }\n\n        type Query {\n          hotel: Hotel!\n          transport: Transport!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        fragment venue on Venue {\n          id\n          ... on VenueWithPosition {\n            gpsPosition {\n              lat\n              lng\n            }\n          }\n        }\n\n        query q {\n          hotel {\n            ...venue\n          }\n          transport {\n            ...venue\n          }\n        }\n      `);\n\n      const config = {};\n\n      const { content } = await plugin(testSchema, [{ location: '', document: query }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      expect(content).toMatchSnapshot();\n\n      const result = await validate(\n        content,\n        {},\n        testSchema,\n        `function test(q: QQuery) {\n        if (q.hotel) {\n            const t1 = q.hotel.gpsPosition.lat\n        }\n\n        if (q.transport) {\n            const t2 = q.transport.id;\n        }\n    }`\n      );\n      expect(mergeOutputs([result])).toMatchSnapshot();\n    });\n\n    it('#2916 - Missing import prefix with preResolveTypes: true and near-operation-file preset', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          user(id: ID!): User!\n        }\n\n        enum Department {\n          Direction\n          Development\n        }\n\n        type User {\n          id: ID!\n          username: String!\n          email: String!\n          department: Department!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query user {\n          user(id: 1) {\n            id\n            username\n            email\n            dep: department\n          }\n        }\n      `);\n\n      const config = {\n        skipTypename: true,\n        preResolveTypes: true,\n        namespacedImportName: 'Types',\n      };\n\n      const { content } = await plugin(testSchema, [{ location: '', document: query }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      expect(content).toContain(`dep: Types.Department`);\n      expect(content).toMatchSnapshot();\n    });\n\n    it('#2699 - Issues with multiple interfaces and unions', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Node {\n          id: ID!\n        }\n\n        scalar DateTime\n\n        interface Element {\n          active: Boolean!\n          createdAt: DateTime!\n          createdBy: User\n          updatedAt: DateTime!\n          updatedBy: User\n        }\n\n        interface Entity {\n          brandData(brand: ID!): EntityBrandData\n        }\n\n        type EntityBrandData {\n          active: Boolean!\n          browsable: Boolean!\n          description: String!\n          alternateTitle: String\n          title: String!\n        }\n\n        type Query {\n          node(id: ID!): Node!\n        }\n\n        type Company implements Element & Node & Entity {\n          active: Boolean!\n          createdAt: DateTime!\n          createdBy: User\n          updatedAt: DateTime!\n          updatedBy: User\n          id: ID!\n          brandData(brand: ID!): EntityBrandData\n        }\n\n        type Theater implements Element & Node & Entity {\n          active: Boolean!\n          createdAt: DateTime!\n          createdBy: User\n          updatedAt: DateTime!\n          updatedBy: User\n          id: ID!\n          brandData(brand: ID!): EntityBrandData\n        }\n\n        type Movie implements Element & Node & Entity {\n          active: Boolean!\n          createdAt: DateTime!\n          createdBy: User\n          updatedAt: DateTime!\n          updatedBy: User\n          id: ID!\n          brandData(brand: ID!): EntityBrandData\n        }\n\n        type User implements Element & Node & Entity {\n          active: Boolean!\n          name: String!\n          createdAt: DateTime!\n          createdBy: User\n          updatedAt: DateTime!\n          updatedBy: User\n          id: ID!\n          brandData(brand: ID!): EntityBrandData\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query getEntityBrandData($gid: ID!, $brand: ID!) {\n          node(gid: $gid) {\n            __typename\n            id\n            ... on Entity {\n              ...EntityBrandData\n            }\n            ... on Element {\n              ...ElementMetadata\n            }\n            ... on Company {\n              active\n            }\n            ... on Theater {\n              active\n            }\n          }\n        }\n\n        fragment EntityBrandData on Entity {\n          brandData(brand: $brand) {\n            active\n            browsable\n            title\n            alternateTitle\n            description\n          }\n        }\n\n        fragment ElementMetadata on Element {\n          createdAt\n          createdBy {\n            id\n            name\n          }\n          updatedAt\n          updatedBy {\n            id\n            name\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        {},\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(mergeOutputs([content])).toMatchSnapshot();\n\n      await validate(\n        content,\n        {},\n        testSchema,\n        `\nfunction test(q: GetEntityBrandDataQuery): void {\n  const typeName: 'Company' | 'Theater' | 'User' | 'Movie' = q.node.__typename; // just to check that those are the types we want here\n  const brandData = q.node.brandData; // this was missing in the original issue\n  const createdAt = q.node.createdAt; // this was missing in the original issue\n\n  if (q.node.__typename === 'Company') {\n    console.log('Company:', q.node.active);\n  } else if (q.node.__typename === 'Theater') {\n    console.log('Theater:', q.node.active);\n  } else if (q.node.__typename === 'User') {\n    console.log('User:', q.node.id);\n  } else if (q.node.__typename === 'Movie') {\n    console.log('Movie:', q.node.id);\n  }\n}`\n      );\n    });\n\n    it('#1624 - Should work with fragment on union type', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          fooBar: [FooBar!]!\n        }\n\n        union FooBar = Foo | Bar\n\n        type Foo {\n          id: ID!\n        }\n\n        type Bar {\n          id: ID!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query TestQuery {\n          fooBar {\n            ...FooBarFragment\n          }\n        }\n\n        fragment FooBarFragment on FooBar {\n          ... on Foo {\n            id\n          }\n          ... on Bar {\n            id\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n      export type TestQueryQuery = (\n        { __typename?: 'Query' }\n        & { fooBar: Array<(\n          { __typename?: 'Foo' }\n          & Pick<Foo, 'id'>\n        ) | (\n          { __typename?: 'Bar' }\n          & Pick<Bar, 'id'>\n        )> }\n      );\n\n      type FooBarFragment_Foo_Fragment = (\n        { __typename?: 'Foo' }\n        & Pick<Foo, 'id'>\n      );\n\n      type FooBarFragment_Bar_Fragment = (\n        { __typename?: 'Bar' }\n        & Pick<Bar, 'id'>\n      );\n\n      export type FooBarFragmentFragment = FooBarFragment_Foo_Fragment | FooBarFragment_Bar_Fragment;\n      `);\n    });\n\n    it('#2407 Fragment on Fragment Spread on Union type', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Price {\n          id: ID!\n          item: [PriceItemUnion]!\n        }\n\n        type Product {\n          id: ID!\n          title: String!\n        }\n\n        union PriceItemUnion = Product\n\n        type Query {\n          price: Price!\n        }\n      `);\n\n      const productFragmentDocument = parse(/* GraphQL */ `\n        fragment ProductFragment on Product {\n          id\n          title\n        }\n      `);\n\n      const priceFragmentDocument = parse(/* GraphQL */ `\n        fragment PriceFragment on Price {\n          id\n          item {\n            ... on Product {\n              ...ProductFragment\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [\n          { location: '', document: productFragmentDocument },\n          { location: '', document: priceFragmentDocument },\n        ],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n      export type ProductFragmentFragment = (\n        { __typename?: 'Product' }\n        & Pick<Product, 'id' | 'title'>\n      );\n\n        export type PriceFragmentFragment = (\n          { __typename?: 'Price' }\n          & Pick<Price, 'id'>\n          & { item: Array<Maybe<(\n            { __typename?: 'Product' }\n            & Pick<Product, 'id' | 'title'>\n          )>> }\n        );\n      `);\n    });\n\n    it('#2506 - inline fragment without typeCondition specified', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User\n        }\n\n        type User {\n          name: String\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        query user($withUser: Boolean! = false) {\n          ... @include(if: $withUser) {\n            user {\n              name\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n      export type UserQuery = (\n        { __typename?: 'Query' }\n        & { user?: Maybe<(\n          { __typename?: 'User' }\n          & Pick<User, 'name'>\n        )> }\n      );`);\n    });\n\n    it('#2436 - interface with field of same name but different type is correctly handled', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface DashboardTile {\n          tileId: ID!\n        }\n        type TileFilterMetadata {\n          viz: String!\n          columnInfo: String!\n        }\n        type DashboardTileFilterDetails implements DashboardTile {\n          tileId: ID!\n          md: TileFilterMetadata!\n        }\n        type TileParameterMetadata {\n          viz: String!\n          columnInfo: String!\n        }\n        type DashboardTileParameterDetails implements DashboardTile {\n          tileId: ID!\n          md: TileParameterMetadata!\n        }\n        type DashboardVersion {\n          id: ID!\n          tiles: DashboardTile!\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        fragment DashboardVersionFragment on DashboardVersion {\n          tiles {\n            ... on DashboardTileFilterDetails {\n              tileId\n              md {\n                viz\n                columnInfo\n              }\n            }\n            ... on DashboardTileParameterDetails {\n              tileId\n              md {\n                viz\n                columnInfo\n              }\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type DashboardVersionFragmentFragment = (\n          { __typename?: 'DashboardVersion' }\n          & { tiles: (\n            { __typename?: 'DashboardTileFilterDetails' }\n            & Pick<DashboardTileFilterDetails, 'tileId'>\n            & { md: (\n              { __typename?: 'TileFilterMetadata' }\n              & Pick<TileFilterMetadata, 'viz' | 'columnInfo'>\n            ) }\n          ) | (\n            { __typename?: 'DashboardTileParameterDetails' }\n            & Pick<DashboardTileParameterDetails, 'tileId'>\n            & { md: (\n              { __typename?: 'TileParameterMetadata' }\n              & Pick<TileParameterMetadata, 'viz' | 'columnInfo'>\n            ) }\n          ) }\n        );\n      `);\n    });\n\n    it('#2436 - union with field of same name but different type is correctly handled', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type TileFilterMetadata {\n          viz: String!\n          columnInfo: String!\n        }\n        type DashboardTileFilterDetails {\n          tileId: ID!\n          md: TileFilterMetadata!\n        }\n        type TileParameterMetadata {\n          viz: String!\n          columnInfo: String!\n        }\n        type DashboardTileParameterDetails {\n          tileId: ID!\n          md: TileParameterMetadata!\n        }\n        union DashboardTile = DashboardTileFilterDetails | DashboardTileParameterDetails\n\n        type DashboardVersion {\n          id: ID!\n          tiles: DashboardTile!\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        fragment DashboardVersionFragment on DashboardVersion {\n          tiles {\n            ... on DashboardTileFilterDetails {\n              tileId\n              md {\n                viz\n                columnInfo\n              }\n            }\n            ... on DashboardTileParameterDetails {\n              tileId\n              md {\n                viz\n                columnInfo\n              }\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type DashboardVersionFragmentFragment = (\n          { __typename?: 'DashboardVersion' }\n          & { tiles: (\n            { __typename?: 'DashboardTileFilterDetails' }\n            & Pick<DashboardTileFilterDetails, 'tileId'>\n            & { md: (\n              { __typename?: 'TileFilterMetadata' }\n              & Pick<TileFilterMetadata, 'viz' | 'columnInfo'>\n            ) }\n          ) | (\n            { __typename?: 'DashboardTileParameterDetails' }\n            & Pick<DashboardTileParameterDetails, 'tileId'>\n            & { md: (\n              { __typename?: 'TileParameterMetadata' }\n              & Pick<TileParameterMetadata, 'viz' | 'columnInfo'>\n            ) }\n          ) }\n        );\n      `);\n    });\n\n    it('#3950 - Invalid output with fragments and skipTypename: true', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          animals: [Animal!]!\n        }\n\n        interface Animal {\n          id: ID!\n        }\n        type Duck implements Animal {\n          id: ID!\n        }\n        type Lion implements Animal {\n          id: ID!\n        }\n        type Puma implements Animal {\n          id: ID!\n        }\n        type Wolf implements Animal {\n          id: ID!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        fragment CatFragment on Animal {\n          ... on Lion {\n            id\n          }\n          ... on Puma {\n            id\n          }\n        }\n\n        query kitty {\n          animals {\n            ...CatFragment\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: query }],\n        {\n          skipTypename: true,\n        },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toMatchInlineSnapshot(`\n        \"type CatFragment_Duck_Fragment = Record<PropertyKey, never>;\n\n        type CatFragment_Lion_Fragment = { id: string };\n\n        type CatFragment_Puma_Fragment = { id: string };\n\n        type CatFragment_Wolf_Fragment = Record<PropertyKey, never>;\n\n        export type CatFragmentFragment =\n          | CatFragment_Duck_Fragment\n          | CatFragment_Lion_Fragment\n          | CatFragment_Puma_Fragment\n          | CatFragment_Wolf_Fragment\n        ;\n\n        export type KittyQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type KittyQuery = { animals: Array<\n            | { id: string }\n            | { id: string }\n            | Record<PropertyKey, never>\n          > };\n        \"\n      `);\n    });\n\n    it('#3950 - Invalid output with fragments and skipTypename: false', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          animals: [Animal!]!\n        }\n\n        interface Animal {\n          id: ID!\n        }\n        type Duck implements Animal {\n          id: ID!\n        }\n        type Lion implements Animal {\n          id: ID!\n        }\n        type Puma implements Animal {\n          id: ID!\n        }\n        type Wolf implements Animal {\n          id: ID!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        fragment CatFragment on Animal {\n          ... on Lion {\n            id\n          }\n          ... on Puma {\n            id\n          }\n        }\n\n        query kitty {\n          animals {\n            ...CatFragment\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: query }],\n        {\n          skipTypename: false,\n        },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toMatchInlineSnapshot(`\n        \"type CatFragment_Duck_Fragment = { __typename?: 'Duck' };\n\n        type CatFragment_Lion_Fragment = { __typename?: 'Lion', id: string };\n\n        type CatFragment_Puma_Fragment = { __typename?: 'Puma', id: string };\n\n        type CatFragment_Wolf_Fragment = { __typename?: 'Wolf' };\n\n        export type CatFragmentFragment =\n          | CatFragment_Duck_Fragment\n          | CatFragment_Lion_Fragment\n          | CatFragment_Puma_Fragment\n          | CatFragment_Wolf_Fragment\n        ;\n\n        export type KittyQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type KittyQuery = { __typename?: 'Query', animals: Array<\n            | { __typename?: 'Duck' }\n            | { __typename?: 'Lion', id: string }\n            | { __typename?: 'Puma', id: string }\n            | { __typename?: 'Wolf' }\n          > };\n        \"\n      `);\n    });\n\n    it('#2489 - Union that only covers one possible type with selection set and no typename', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type NotFoundError {\n          message: String!\n        }\n        type UserBannedError {\n          message: String!\n        }\n        type User {\n          id: ID!\n          login: String\n        }\n        union UserResult = NotFoundError | UserBannedError | User\n\n        type Query {\n          user: UserResult!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query user {\n          user {\n            ... on User {\n              id\n              login\n            }\n          }\n        }\n      `);\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: query }],\n        {\n          skipTypename: true,\n          preResolveTypes: false,\n        },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type UserQuery = { user: Pick<User, 'id' | 'login'> | Record<PropertyKey, never> };\n      `);\n    });\n\n    it('#4888 - Types for input Lists do not support coercion', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type User {\n          id: ID!\n        }\n\n        type Query {\n          search(testArray: [String], requireString: [String]!, innerRequired: [String!]!): [User!]\n        }\n      `);\n\n      const ast = parse(/* GraphQL */ `\n        query user($testArray: [String], $requireString: [String]!, $innerRequired: [String!]!) {\n          search(testArray: $testArray, requireString: $requireString, innerRequired: $innerRequired) {\n            id\n          }\n        }\n      `);\n      const config = { preResolveTypes: true };\n      const { content } = await plugin(schema, [{ location: '', document: ast }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n      export type UserQueryVariables = Exact<{\n        testArray?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>> | InputMaybe<Scalars['String']['input']>>;\n        requireString: Array<InputMaybe<Scalars['String']['input']>> | InputMaybe<Scalars['String']['input']>;\n        innerRequired: Array<Scalars['String']['input']> | Scalars['String']['input'];\n      }>;`);\n      await validate(content, config);\n    });\n\n    it('#5352 - Prevent array input coercion if arrayInputCoercion = false', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type User {\n          id: ID!\n        }\n\n        type Query {\n          search(testArray: [String], requireString: [String]!, innerRequired: [String!]!): [User!]\n        }\n      `);\n\n      const ast = parse(/* GraphQL */ `\n        query user($testArray: [String], $requireString: [String]!, $innerRequired: [String!]!) {\n          search(testArray: $testArray, requireString: $requireString, innerRequired: $innerRequired) {\n            id\n          }\n        }\n      `);\n      const config = { preResolveTypes: true, arrayInputCoercion: false };\n      const { content } = await plugin(schema, [{ location: '', document: ast }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n      export type UserQueryVariables = Exact<{\n        testArray?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;\n        requireString: Array<InputMaybe<Scalars['String']['input']>>;\n        innerRequired: Array<Scalars['String']['input']>;\n      }>;`);\n      await validate(content, config);\n    });\n\n    it('#5263 - inline fragment spread on interface field results in incorrect types', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface Entity {\n          id: ID!\n        }\n\n        interface NamedEntity implements Entity {\n          id: ID!\n          name: String!\n        }\n\n        type Session implements Entity {\n          id: ID!\n          data: String!\n        }\n\n        type User implements NamedEntity & Entity {\n          id: ID!\n          name: String!\n        }\n\n        type Query {\n          entity(id: ID!): Entity!\n        }\n      `);\n\n      const document = parse(/* GraphQL */ `\n        query entity {\n          entity(id: 1) {\n            id\n            ... on NamedEntity {\n              name\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n      export type EntityQuery = (\n        { __typename?: 'Query' }\n        & { entity: (\n          { __typename?: 'Session' }\n          & Pick<Session, 'id'>\n        ) | (\n          { __typename?: 'User' }\n          & Pick<User, 'name' | 'id'>\n        ) }\n      );\n      `);\n    });\n\n    describe('#6149 - operation fragment merging behavior', () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User!\n        }\n\n        type User {\n          id: ID!\n          name: String!\n          friends: [User!]!\n        }\n      `);\n\n      it('InlineFragmentQuery', async () => {\n        const document = parse(/* GraphQL */ `\n          query InlineFragmentQuery {\n            user {\n              ... on User {\n                friends {\n                  id\n                }\n              }\n              ... on User {\n                friends {\n                  name\n                }\n              }\n            }\n          }\n        `);\n\n        const { content } = await plugin(\n          schema,\n          [{ location: '', document }],\n          { preResolveTypes: false },\n          {\n            outputFile: 'graphql.ts',\n          }\n        );\n\n        expect(content).toBeSimilarStringTo(`\n          export type InlineFragmentQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n          export type InlineFragmentQueryQuery = (\n            { __typename?: 'Query' }\n            & { user: (\n              { __typename?: 'User' }\n              & { friends: Array<(\n                { __typename?: 'User' }\n                & Pick<User, 'id' | 'name'>\n              )> }\n            ) }\n          );\n        `);\n      });\n      it('SpreadFragmentQuery', async () => {\n        const document = parse(/* GraphQL */ `\n          fragment UserFriendsIdFragment on Query {\n            user {\n              friends {\n                id\n              }\n            }\n          }\n\n          fragment UserFriendsNameFragment on Query {\n            user {\n              friends {\n                name\n              }\n            }\n          }\n\n          query SpreadFragmentQuery {\n            ...UserFriendsIdFragment\n            ...UserFriendsNameFragment\n          }\n        `);\n\n        const { content } = await plugin(\n          schema,\n          [{ location: '', document }],\n          { preResolveTypes: false },\n          {\n            outputFile: 'graphql.ts',\n          }\n        );\n\n        expect(content).toBeSimilarStringTo(`\n          export type UserFriendsIdFragmentFragment = (\n            { __typename?: 'Query' }\n            & { user: (\n              { __typename?: 'User' }\n              & { friends: Array<(\n                { __typename?: 'User' }\n                & Pick<User, 'id'>\n              )> }\n            ) }\n          );\n\n          export type UserFriendsNameFragmentFragment = (\n            { __typename?: 'Query' }\n            & { user: (\n              { __typename?: 'User' }\n              & { friends: Array<(\n                { __typename?: 'User' }\n                & Pick<User, 'name'>\n              )> }\n            ) }\n          );\n\n          export type SpreadFragmentQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n          export type SpreadFragmentQueryQuery = (\n            { __typename?: 'Query' }\n            & { user: (\n              { __typename?: 'User' }\n              & { friends: Array<(\n                { __typename?: 'User' }\n                & Pick<User, 'id' | 'name'>\n              )> }\n            ) }\n          );\n\n        `);\n      });\n      it('SpreadFragmentWithSelectionQuery', async () => {\n        const document = parse(/* GraphQL */ `\n          fragment UserFriendsNameFragment on Query {\n            user {\n              friends {\n                name\n              }\n            }\n          }\n\n          query SpreadFragmentWithSelectionQuery {\n            user {\n              id\n              friends {\n                id\n              }\n            }\n            ...UserFriendsNameFragment\n          }\n        `);\n\n        const { content } = await plugin(\n          schema,\n          [{ location: '', document }],\n          { preResolveTypes: false },\n          {\n            outputFile: 'graphql.ts',\n          }\n        );\n\n        expect(content).toBeSimilarStringTo(`\n          export type UserFriendsNameFragmentFragment = (\n            { __typename?: 'Query' }\n            & { user: (\n              { __typename?: 'User' }\n              & { friends: Array<(\n                { __typename?: 'User' }\n                & Pick<User, 'name'>\n              )> }\n            ) }\n          );\n\n          export type SpreadFragmentWithSelectionQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n          export type SpreadFragmentWithSelectionQueryQuery = (\n            { __typename?: 'Query' }\n            & { user: (\n              { __typename?: 'User' }\n              & Pick<User, 'id'>\n              & { friends: Array<(\n                { __typename?: 'User' }\n                & Pick<User, 'id' | 'name'>\n              )> }\n            ) }\n          );\n        `);\n      });\n      it('SpreadFragmentWithSelectionQuery - flatten', async () => {\n        const document = parse(/* GraphQL */ `\n          fragment UserFriendsNameFragment on Query {\n            user {\n              friends {\n                name\n              }\n            }\n          }\n\n          query SpreadFragmentWithSelectionQuery {\n            user {\n              id\n              friends {\n                id\n              }\n            }\n            ...UserFriendsNameFragment\n          }\n        `);\n\n        const { content } = await plugin(\n          schema,\n          [{ location: '', document }],\n          { preResolveTypes: false },\n          {\n            outputFile: 'graphql.ts',\n          }\n        );\n\n        expect(content).toBeSimilarStringTo(`\n          export type UserFriendsNameFragmentFragment = (\n            { __typename?: 'Query' }\n            & { user: (\n              { __typename?: 'User' }\n              & { friends: Array<(\n                { __typename?: 'User' }\n                & Pick<User, 'name'>\n              )> }\n            ) }\n          );\n\n          export type SpreadFragmentWithSelectionQueryQueryVariables = Exact<{ [key: string]: never; }>;\n\n          export type SpreadFragmentWithSelectionQueryQuery = (\n            { __typename?: 'Query' }\n            & { user: (\n              { __typename?: 'User' }\n              & Pick<User, 'id'>\n              & { friends: Array<(\n                { __typename?: 'User' }\n                & Pick<User, 'id' | 'name'>\n              )> }\n            ) }\n          );\n        `);\n      });\n    });\n\n    it('#7811 - generates $fragmentName for fragment subtypes for fragment masking', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Character {\n          name: String\n        }\n\n        type Jedi {\n          name: String\n          side: String\n        }\n\n        type Droid {\n          model: String\n        }\n\n        union People = Character | Jedi | Droid\n\n        type Query {\n          people: People!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query GetPeople {\n          people {\n            ...PeopleInfo\n          }\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        fragment PeopleInfo on People {\n          ... on Character {\n            name\n          }\n\n          ... on Jedi {\n            side\n          }\n\n          ... on Droid {\n            model\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [\n          { location: '', document: query },\n          { location: '', document: fragment },\n        ],\n        { inlineFragmentTypes: 'mask' },\n        { outputFile: 'graphql.ts' }\n      );\n\n      expect(content).toMatchInlineSnapshot(`\n        \"export type GetPeopleQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type GetPeopleQuery = { __typename?: 'Query', people:\n            | (\n              { __typename?: 'Character' }\n              & { ' $fragmentRefs'?: { 'PeopleInfo_Character_Fragment': PeopleInfo_Character_Fragment } }\n            )\n            | (\n              { __typename?: 'Jedi' }\n              & { ' $fragmentRefs'?: { 'PeopleInfo_Jedi_Fragment': PeopleInfo_Jedi_Fragment } }\n            )\n            | (\n              { __typename?: 'Droid' }\n              & { ' $fragmentRefs'?: { 'PeopleInfo_Droid_Fragment': PeopleInfo_Droid_Fragment } }\n            )\n           };\n\n        type PeopleInfo_Character_Fragment = { __typename?: 'Character', name?: string | null } & { ' $fragmentName'?: 'PeopleInfo_Character_Fragment' };\n\n        type PeopleInfo_Jedi_Fragment = { __typename?: 'Jedi', side?: string | null } & { ' $fragmentName'?: 'PeopleInfo_Jedi_Fragment' };\n\n        type PeopleInfo_Droid_Fragment = { __typename?: 'Droid', model?: string | null } & { ' $fragmentName'?: 'PeopleInfo_Droid_Fragment' };\n\n        export type PeopleInfoFragment =\n          | PeopleInfo_Character_Fragment\n          | PeopleInfo_Jedi_Fragment\n          | PeopleInfo_Droid_Fragment\n        ;\n        \"\n      `);\n    });\n\n    it('#6874 - generates types when parent type differs from spread fragment member types and preResolveTypes=true', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Animal {\n          name: String!\n        }\n        type Bat implements Animal {\n          name: String!\n          features: BatFeatures!\n        }\n        type BatFeatures {\n          color: String!\n          wingspan: Int!\n        }\n        type Snake implements Animal {\n          name: String!\n          features: SnakeFeatures!\n        }\n        type SnakeFeatures {\n          color: String!\n          length: Int!\n        }\n        type Error {\n          message: String!\n        }\n        union SnakeResult = Snake | Error\n        type Query {\n          snake: SnakeResult!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query SnakeQuery {\n          snake {\n            ... on Snake {\n              name\n              ...AnimalFragment\n            }\n          }\n        }\n        fragment AnimalFragment on Animal {\n          ... on Bat {\n            features {\n              color\n              wingspan\n            }\n          }\n          ... on Snake {\n            features {\n              color\n              length\n            }\n          }\n        }\n      `);\n\n      const config = { preResolveTypes: true };\n\n      const { content } = await plugin(testSchema, [{ location: '', document: query }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      expect(content).toMatchSnapshot();\n    });\n\n    it('#8793 selecting __typename should not be optional', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Animal {\n          name: String!\n        }\n        type Bat implements Animal {\n          name: String!\n          features: BatFeatures!\n        }\n        type BatFeatures {\n          color: String!\n          wingspan: Int!\n        }\n        type Snake implements Animal {\n          name: String!\n          features: SnakeFeatures!\n        }\n        type SnakeFeatures {\n          color: String!\n          length: Int!\n        }\n        type Error {\n          message: String!\n        }\n        union SnakeResult = Snake | Error\n        type Query {\n          snake: SnakeResult!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query SnakeQuery {\n          __typename\n          snake {\n            __typename\n          }\n        }\n      `);\n\n      const config = { preResolveTypes: true };\n\n      const { content } = await plugin(testSchema, [{ location: '', document: query }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      expect(content).toMatchSnapshot();\n    });\n\n    it('#8461 - conditional directives are ignored on fields with alias', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type User {\n          firstName: String!\n          lastName: Int!\n          address: Address!\n        }\n\n        type Address {\n          postalCode: String!\n        }\n\n        type Query {\n          viewer: User!\n        }\n      `);\n\n      const query = parse(/* GraphQL */ `\n        query UserQuery($skipFirstName: Boolean!, $skipAddress: Boolean!) {\n          viewer {\n            givenName: firstName @skip(if: $skipFirstName)\n            lastName\n            mailingAddress: address @skip(if: $skipAddress) {\n              postalCode\n            }\n          }\n        }\n      `);\n\n      const config = { preResolveTypes: true };\n\n      const { content } = await plugin(testSchema, [{ location: '', document: query }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      expect(content).toBeSimilarStringTo(`\n        export type UserQueryQueryVariables = Exact<{\n          skipFirstName: Scalars['Boolean']['input'];\n          skipAddress: Scalars['Boolean']['input'];\n        }>;\n\n        export type UserQueryQuery = {\n          __typename?: 'Query',\n          viewer: {\n            __typename?: 'User',\n            lastName: number,\n            givenName?: string,\n            mailingAddress?: {\n              __typename?: 'Address',\n              postalCode: string\n            }\n          }\n        };\n      `);\n    });\n  });\n\n  describe('conditional directives handling', () => {\n    it('fields with @skip, @include should pre resolve into optional', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User!\n        }\n\n        type User {\n          name: String!\n          address: String!\n          nicknames: [String!]\n          parents: [User!]!\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        query user($showAddress: Boolean!) {\n          user {\n            name\n            address @include(if: $showAddress)\n            nicknames @include(if: $showNicknames)\n            parents @include(if: $showParents)\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        {\n          preResolveTypes: true,\n        },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n      export type UserQueryVariables = Exact<{\n        showAddress: Scalars['Boolean']['input'];\n      }>;\n\n      export type UserQuery = { __typename?: 'Query', user: { __typename?: 'User', name: string, address?: string, nicknames?: Array<string> | null, parents?: Array<User> } };`);\n    });\n\n    it('objects with @skip, @include should pre resolve into optional', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User!\n        }\n\n        type User {\n          id: String!\n          name: String!\n          address: Address!\n          friends: [User!]!\n          moreFriends: [User!]!\n        }\n\n        type Address {\n          city: String!\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        query user($showAddress: Boolean!, $showName: Boolean!) {\n          user {\n            id\n            name @include(if: $showName)\n            address @include(if: $showAddress) {\n              city\n            }\n            friends @include(if: $isFriendly) {\n              id\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        {\n          preResolveTypes: true,\n        },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n      export type UserQueryVariables = Exact<{\n        showAddress: Scalars['Boolean']['input'];\n        showName: Scalars['Boolean']['input'];\n      }>;\n      export type UserQuery = { __typename?: 'Query', user: { __typename?: 'User', id: string, name?: string, address?: { __typename?: 'Address', city: string }, friends?: Array<{ __typename?: 'User', id: string }> } };`);\n    });\n\n    it('fields with @skip, @include should make container resolve into MakeOptional type', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User!\n        }\n        type User {\n          id: String!\n          name: String!\n          address: Address!\n          friends: [User!]!\n        }\n        type Address {\n          city: String!\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        query user($showAddress: Boolean!, $showName: Boolean!) {\n          user {\n            id\n            name @include(if: $showName)\n            address @include(if: $showAddress) {\n              city\n            }\n            friends @include(if: $isFriendly) {\n              id\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        { preResolveTypes: false },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n      export type UserQueryVariables = Exact<{\n        showAddress: Scalars['Boolean']['input'];\n        showName: Scalars['Boolean']['input'];\n      }>;\n\n      export type UserQuery = (\n        { __typename?: 'Query' }\n        & { user: (\n          { __typename?: 'User' }\n          & MakeOptional<Pick<User, 'id' | 'name'>, 'name'>\n          & { address?: (\n            { __typename?: 'Address' }\n            & Pick<Address, 'city'>\n          ), friends?: Array<(\n            { __typename?: 'User' }\n            & Pick<User, 'id'>\n          )> }\n        ) }\n      );`);\n    });\n\n    it('On avoidOptionals:true, fields with @skip, @include should make container resolve into MakeMaybe type', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          user(id: ID!): User!\n        }\n\n        type User {\n          id: ID!\n          username: String!\n          email: String!\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        query user {\n          user(id: 1) {\n            id\n            username\n            email @skip(if: true)\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        {\n          avoidOptionals: true,\n          preResolveTypes: false,\n        },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type UserQueryVariables = Exact<{ [key: string]: never; }>;\n\n        export type UserQuery = (\n          { __typename?: 'Query' }\n          & { user: (\n            { __typename?: 'User' }\n            & MakeMaybe<Pick<User, 'id' | 'username' | 'email'>, 'email'>\n          ) }\n        );\n      `);\n    });\n\n    it('Should handle \"preResolveTypes\" and \"avoidOptionals\" together', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          user(id: ID!): User!\n        }\n\n        type User {\n          id: ID!\n          username: String!\n          email: String\n        }\n      `);\n      const operations = parse(/* GraphQL */ `\n        query user {\n          user(id: 1) {\n            id\n            username\n            email\n          }\n        }\n      `);\n      const config = { avoidOptionals: true, preResolveTypes: true };\n      const { content } = await plugin(schema, [{ location: '', document: operations }], config, {\n        outputFile: 'graphql.ts',\n      });\n\n      expect(content).toBeSimilarStringTo(\n        `export type UserQuery = { __typename?: 'Query', user: { __typename?: 'User', id: string, username: string, email: string | null } }`\n      );\n    });\n\n    it('On avoidOptionals:true, optionals (?) on types should be avoided', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          me: User!\n        }\n\n        type User {\n          messages: [Message!]!\n        }\n\n        type Message {\n          content: String!\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        query MyQuery($include: Boolean!) {\n          me {\n            messages @include(if: $include) {\n              content\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        {\n          avoidOptionals: true,\n          nonOptionalTypename: true,\n          preResolveTypes: false,\n        },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type MyQueryQuery = (\n          { __typename: 'Query' }\n          & { me: (\n            { __typename: 'User' }\n            & { messages?: Array<(\n              { __typename: 'Message' }\n              & Pick<Message, 'content'>\n            )> }\n          ) }\n        );\n      `);\n    });\n\n    it('inline fragment with conditional directives and avoidOptionals', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User\n          group: Group!\n        }\n\n        type User {\n          name: String\n        }\n\n        type Group {\n          id: Int!\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        query user($withUser: Boolean! = false) {\n          ... @include(if: $withUser) {\n            user {\n              name\n            }\n            group {\n              id\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        { preResolveTypes: true, avoidOptionals: true },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n      export type UserQuery = {\n        __typename?: 'Query',\n        user?: {\n          __typename?: 'User',\n          name: string | null\n        } | null,\n        group?: {\n          __typename?: 'Group',\n          id: number\n        }\n      };`);\n    });\n\n    it('resolve optionals according to maybeValue together with avoidOptionals and conditional directives', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User!\n        }\n\n        type User {\n          name: String!\n          age: Int\n          address: String!\n          nicknames: [String!]\n          parents: [User!]!\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        query user($showProperty: Boolean!) {\n          user {\n            name\n            age\n            address @include(if: $showProperty)\n            nicknames @include(if: $showProperty)\n            parents @include(if: $showProperty)\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        {\n          preResolveTypes: true,\n          maybeValue: \"T | 'specialType'\",\n          avoidOptionals: true,\n        },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n      expect(content).toBeSimilarStringTo(`\n      export type UserQuery = { __typename?: 'Query', user: { __typename?: 'User', name: string, age: number | 'specialType', address?: string, nicknames?: Array<string> | 'specialType', parents?: Array<User> } };\n      `);\n    });\n\n    it('inline fragment with conditional directives and avoidOptionals, without preResolveTypes', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type Query {\n          user: User\n          group: Group!\n        }\n\n        type User {\n          name: String\n        }\n\n        type Group {\n          id: Int!\n        }\n      `);\n\n      const fragment = parse(/* GraphQL */ `\n        query user($withUser: Boolean! = false) {\n          ... @include(if: $withUser) {\n            user {\n              name\n            }\n            group {\n              id\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        { preResolveTypes: false, avoidOptionals: true },\n        {\n          outputFile: 'graphql.ts',\n        }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n      export type UserQuery = (\n        { __typename?: 'Query' }\n        & { user?: Maybe<(\n          { __typename?: 'User' }\n          & Pick<User, 'name'>\n        )>, group?: (\n          { __typename?: 'Group' }\n          & Pick<Group, 'id'>\n        ) }\n      );`);\n    });\n  });\n\n  describe('incremental delivery directive handling', () => {\n    it('should generate an union of initial and deferred fields for fragments (preResolveTypes: true)', async () => {\n      const schema = buildSchema(`\n        type Address {\n          street1: String!\n        }\n\n        type Phone {\n          home: String!\n        }\n\n        type Employment {\n          title: String!\n        }\n\n        type User {\n          name: String!\n          email: String!\n          address: Address!\n          phone: Phone!\n          employment: Employment!\n          widgetCount: Int!\n          widgetPreference: String!\n          clearanceLevel: String!\n          favoriteFood: String!\n          leastFavoriteFood: String!\n        }\n\n        type Query {\n          user: User!\n        }\n      `);\n\n      const fragment = parse(`\n        fragment WidgetFragment on User {\n          widgetCount\n          widgetPreference\n        }\n\n        fragment FoodFragment on User {\n          favoriteFood\n          leastFavoriteFood\n        }\n\n        fragment EmploymentFragment on User {\n          employment {\n            title\n          }\n        }\n\n        query user {\n          user {\n            # Test inline fragment defer\n            ... @defer {\n              email\n            }\n\n            # Test inline fragment defer with nested selection set\n            ... @defer {\n              address {\n                street1\n              }\n            }\n\n            # Test named fragment defer\n            ...WidgetFragment @defer\n\n            # Test a secondary named fragment defer\n            ...FoodFragment @defer\n\n            # Not deferred fields, fragments, selection sets, etc are left alone\n            name\n            phone {\n              home\n            }\n            ...EmploymentFragment\n            ... {\n              clearanceLevel\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        { preResolveTypes: true },\n        { outputFile: 'graphql.ts' }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type UserQueryVariables = Exact<{ [key: string]: never; }>;\n        export type UserQuery = {\n          __typename?: 'Query',\n          user: {\n            __typename?: 'User',\n            clearanceLevel: string,\n            name: string,\n            phone: {\n              __typename?: 'Phone',\n              home: string\n            },\n            employment: {\n              __typename?: 'Employment',\n              title: string\n            }\n          } & ({ __typename?: 'User', email: string }\n              | { __typename?: 'User', email?: never })\n            & ({ __typename?: 'User', address: { __typename?: 'Address', street1: string } }\n              | { __typename?: 'User', address?: never })\n            & ({ __typename?: 'User', widgetCount: number, widgetPreference: string }\n              | { __typename?: 'User', widgetCount?: never, widgetPreference?: never })\n            & ({ __typename?: 'User', favoriteFood: string, leastFavoriteFood: string }\n              | { __typename?: 'User', favoriteFood?: never, leastFavoriteFood?: never }) };\n      `);\n    });\n\n    it('should generate an union of initial and deferred fields for fragments using MakeEmpty (preResolveTypes: false)', async () => {\n      const schema = buildSchema(`\n        type Address {\n          street1: String!\n        }\n\n        type Phone {\n          home: String!\n        }\n\n        type Employment {\n          title: String!\n        }\n\n        type User {\n          name: String!\n          email: String!\n          address: Address!\n          phone: Phone!\n          employment: Employment!\n          widgetCount: Int!\n          clearanceLevel: String!\n        }\n\n        type Query {\n          user: User!\n        }\n      `);\n\n      const fragment = parse(`\n        fragment WidgetFragment on User {\n          widgetCount\n        }\n\n        fragment EmploymentFragment on User {\n          employment {\n            title\n          }\n        }\n\n        query user {\n          user {\n            # Test inline fragment defer\n            ... @defer {\n              email\n            }\n\n            # Test inline fragment defer with nested selection set\n            ... @defer {\n              address {\n                street1\n              }\n            }\n\n            # Test named fragment defer\n            ...WidgetFragment @defer\n\n            # Not deferred fields, fragments, selection sets, etc are left alone\n            name\n            phone {\n              home\n            }\n            ...EmploymentFragment\n            ... {\n              clearanceLevel\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        { preResolveTypes: false },\n        { outputFile: 'graphql.ts' }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type WidgetFragmentFragment = (\n          { __typename?: 'User' }\n          & Pick<User, 'widgetCount'>\n        );\n\n        export type EmploymentFragmentFragment = (\n          { __typename?: 'User' }\n          & { employment: (\n            { __typename?: 'Employment' }\n            & Pick<Employment, 'title'>\n          ) }\n        );\n\n        export type UserQueryVariables = Exact<{ [key: string]: never; }>;\n\n        export type UserQuery = (\n          { __typename?: 'Query' }\n          & { user: (\n            { __typename?: 'User' }\n            & Pick<User, 'clearanceLevel' | 'name'>\n            & { phone: (\n              { __typename?: 'Phone' }\n              & Pick<Phone, 'home'>\n            ), employment: (\n              { __typename?: 'Employment' }\n              & Pick<Employment, 'title'>\n            ) }\n          ) & ((\n            { __typename?: 'User' }\n            & Pick<User, 'email'>\n          ) | (\n            { __typename?: 'User' }\n            & MakeEmpty<User, 'email'>\n          )) & ((\n            { __typename?: 'User' }\n            & { address: (\n              { __typename?: 'Address' }\n              & Pick<Address, 'street1'>\n            ) }\n          ) | (\n            { __typename?: 'User' }\n            & { address?: (\n              { __typename?: 'Address' }\n              & Pick<Address, 'street1'>\n            ) }\n          )) & ((\n            { __typename?: 'User' }\n            & Pick<User, 'widgetCount'>\n          ) | (\n            { __typename?: 'User' }\n            & MakeEmpty<User, 'widgetCount'>\n          )) }\n        );\n      `);\n    });\n\n    it('should generate an union of initial and deferred fields for fragments MakeEmpty (avoidOptionals: true)', async () => {\n      const schema = buildSchema(`\n        type Address {\n          street1: String!\n        }\n\n        type Phone {\n          home: String!\n        }\n\n        type Employment {\n          title: String!\n        }\n\n        type User {\n          name: String!\n          email: String!\n          address: Address!\n          phone: Phone!\n          employment: Employment!\n          widgetName: String!\n          widgetCount: Int!\n          clearanceLevel: String!\n        }\n\n        type Query {\n          user: User!\n        }\n      `);\n\n      const fragment = parse(`\n        fragment WidgetFragment on User {\n          widgetName\n          widgetCount\n        }\n\n        fragment EmploymentFragment on User {\n          employment {\n            title\n          }\n        }\n\n        query user {\n          user {\n            # Test inline fragment defer\n            ... @defer {\n              email\n            }\n\n            # Test inline fragment defer with nested selection set\n            ... @defer {\n              address {\n                street1\n              }\n            }\n\n            # Test named fragment defer\n            ...WidgetFragment @defer\n\n            # Not deferred fields, fragments, selection sets, etc are left alone\n            name\n            phone {\n              home\n            }\n            ...EmploymentFragment\n            ... {\n              clearanceLevel\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        {\n          avoidOptionals: true,\n          preResolveTypes: false,\n        },\n        { outputFile: 'graphql.ts' }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type WidgetFragmentFragment = (\n          { __typename?: 'User' }\n          & Pick<User, 'widgetName' | 'widgetCount'>\n        );\n\n        export type EmploymentFragmentFragment = (\n          { __typename?: 'User' }\n          & { employment: (\n            { __typename?: 'Employment' }\n            & Pick<Employment, 'title'>\n          ) }\n        );\n\n        export type UserQueryVariables = Exact<{ [key: string]: never; }>;\n\n        export type UserQuery = (\n          { __typename?: 'Query' }\n          & { user: (\n            { __typename?: 'User' }\n            & Pick<User, 'clearanceLevel' | 'name'>\n            & { phone: (\n              { __typename?: 'Phone' }\n              & Pick<Phone, 'home'>\n            ), employment: (\n              { __typename?: 'Employment' }\n              & Pick<Employment, 'title'>\n            ) }\n          ) & ((\n            { __typename?: 'User' }\n            & Pick<User, 'email'>\n          ) | (\n            { __typename?: 'User' }\n            & MakeEmpty<User, 'email'>\n          )) & ((\n            { __typename?: 'User' }\n            & { address: (\n              { __typename?: 'Address' }\n              & Pick<Address, 'street1'>\n            ) }\n          ) | (\n            { __typename?: 'User' }\n            & { address?: (\n              { __typename?: 'Address' }\n              & Pick<Address, 'street1'>\n            ) }\n          )) & ((\n            { __typename?: 'User' }\n            & Pick<User, 'widgetName' | 'widgetCount'>\n          ) | (\n            { __typename?: 'User' }\n            & MakeEmpty<User, 'widgetName' | 'widgetCount'>\n          )) }\n        );\n      `);\n    });\n\n    it('should support \"preResolveTypes: true\" and \"avoidOptionals: true\" together', async () => {\n      const schema = buildSchema(`\n        type Address {\n          street1: String!\n        }\n\n        type Phone {\n          home: String!\n        }\n\n        type Employment {\n          title: String!\n        }\n\n        type User {\n          name: String!\n          email: String!\n          address: Address!\n          phone: Phone!\n          employment: Employment!\n          widgetCount: Int!\n          clearanceLevel: String!\n        }\n\n        type Query {\n          user: User!\n        }\n      `);\n\n      const fragment = parse(`\n        fragment WidgetFragment on User {\n          widgetCount\n        }\n\n        fragment EmploymentFragment on User {\n          employment {\n            title\n          }\n        }\n\n        query user {\n          user {\n            # Test inline fragment defer\n            ... @defer {\n              email\n            }\n\n            # Test inline fragment defer with nested selection set\n            ... @defer {\n              address {\n                street1\n              }\n            }\n\n            # Test named fragment defer\n            ...WidgetFragment @defer\n\n            # Not deferred fields, fragments, selection sets, etc are left alone\n            name\n            phone {\n              home\n            }\n            ...EmploymentFragment\n            ... {\n              clearanceLevel\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        {\n          avoidOptionals: true,\n          preResolveTypes: true,\n        },\n        { outputFile: 'graphql.ts' }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type UserQueryVariables = Exact<{ [key: string]: never; }>;\n        export type UserQuery = {\n          __typename?: 'Query',\n          user: {\n            __typename?: 'User',\n            clearanceLevel: string,\n            name: string,\n            phone: { __typename?: 'Phone', home: string },\n            employment: { __typename?: 'Employment', title: string }\n          } & ({ __typename?: 'User', email: string }\n              | { __typename?: 'User', email?: never })\n            & ({ __typename?: 'User', address: { __typename?: 'Address', street1: string } }\n              | { __typename?: 'User', address?: never })\n            & ({ __typename?: 'User', widgetCount: number }\n              | { __typename?: 'User', widgetCount?: never })\n          };\n      `);\n    });\n\n    it('should resolve optionals according to maybeValue together with avoidOptionals and deferred fragments', async () => {\n      const schema = buildSchema(`\n        type Address {\n          street1: String\n        }\n\n        type Phone {\n          home: String!\n        }\n\n        type Employment {\n          title: String!\n        }\n\n        type User {\n          name: String!\n          email: String!\n          address: Address!\n          phone: Phone!\n          employment: Employment!\n          widgetName: String!\n          widgetCount: Int!\n          clearanceLevel: String!\n        }\n\n        type Query {\n          user: User!\n        }\n      `);\n\n      const fragment = parse(`\n        fragment WidgetFragment on User {\n          widgetName\n          widgetCount\n        }\n\n        fragment EmploymentFragment on User {\n          employment {\n            title\n          }\n        }\n\n        query user {\n          user {\n            # Test inline fragment defer\n            ... @defer {\n              email\n            }\n\n            # Test inline fragment defer with nested selection set\n            ... @defer {\n              address {\n                street1\n              }\n            }\n\n            # Test named fragment defer\n            ...WidgetFragment @defer\n\n            # Not deferred fields, fragments, selection sets, etc are left alone\n            name\n            phone {\n              home\n            }\n            ...EmploymentFragment\n            ... {\n              clearanceLevel\n            }\n          }\n        }\n      `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        {\n          preResolveTypes: true,\n          maybeValue: \"T | 'specialType'\",\n          avoidOptionals: true,\n        },\n        { outputFile: 'graphql.ts' }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n        export type UserQueryVariables = Exact<{ [key: string]: never; }>;\n        export type UserQuery = {\n          __typename?: 'Query',\n          user: {\n            __typename?: 'User',\n            clearanceLevel: string,\n            name: string,\n            phone: { __typename?: 'Phone', home: string },\n            employment: { __typename?: 'Employment', title: string }\n          } & ({ __typename?: 'User', email: string }\n              | { __typename?: 'User', email?: never })\n            & ({ __typename?: 'User', address: { __typename?: 'Address', street1: string | 'specialType' } }\n              | { __typename?: 'User', address?: never })\n            & ({ __typename?: 'User', widgetName: string, widgetCount: number }\n              | { __typename?: 'User', widgetName?: never, widgetCount?: never })\n          };\n      `);\n    });\n\n    it('should generate correct types with inlineFragmentTypes: \"mask\"\"', async () => {\n      const schema = buildSchema(`\n      type Address {\n        street1: String!\n      }\n\n      type Phone {\n        home: String!\n      }\n\n      type Employment {\n        title: String!\n      }\n\n      type User {\n        name: String!\n        email: String!\n        address: Address!\n        phone: Phone!\n        employment: Employment!\n        widgetCount: Int!\n        widgetPreference: String!\n        clearanceLevel: String!\n        favoriteFood: String!\n        leastFavoriteFood: String!\n      }\n\n      type Query {\n        user: User!\n      }\n    `);\n\n      const fragment = parse(`\n      fragment WidgetFragment on User {\n        widgetCount\n        widgetPreference\n      }\n\n      fragment FoodFragment on User {\n        favoriteFood\n        leastFavoriteFood\n      }\n\n      fragment EmploymentFragment on User {\n        employment {\n          title\n        }\n      }\n\n      query user {\n        user {\n          # Test inline fragment defer\n          ... @defer {\n            email\n          }\n\n          # Test inline fragment defer with nested selection set\n          ... @defer {\n            address {\n              street1\n            }\n          }\n\n          # Test named fragment defer\n          ...WidgetFragment @defer\n\n          # Test a secondary named fragment defer\n          ...FoodFragment @defer\n\n          # Not deferred fields, fragments, selection sets, etc are left alone\n          name\n          phone {\n            home\n          }\n          ...EmploymentFragment\n          ... {\n            clearanceLevel\n          }\n        }\n      }\n    `);\n\n      const { content } = await plugin(\n        schema,\n        [{ location: '', document: fragment }],\n        { preResolveTypes: true, inlineFragmentTypes: 'mask' },\n        { outputFile: 'graphql.ts' }\n      );\n\n      expect(content).toBeSimilarStringTo(`\n      export type WidgetFragmentFragment = { __typename?: 'User', widgetCount: number, widgetPreference: string } & { ' $fragmentName'?: 'WidgetFragmentFragment' };\n\n      export type FoodFragmentFragment = { __typename?: 'User', favoriteFood: string, leastFavoriteFood: string } & { ' $fragmentName'?: 'FoodFragmentFragment' };\n\n      export type EmploymentFragmentFragment = { __typename?: 'User', employment: { __typename?: 'Employment', title: string } } & { ' $fragmentName'?: 'EmploymentFragmentFragment' };\n\n      export type UserQueryVariables = Exact<{ [key: string]: never; }>;\n\n      export type UserQuery = {\n        __typename?: 'Query',\n        user: (\n        {\n          __typename?: 'User',\n          clearanceLevel: string,\n          name: string,\n          phone: { __typename?: 'Phone', home: string }\n        } & { ' $fragmentRefs'?: { 'EmploymentFragmentFragment': EmploymentFragmentFragment } }\n      ) & ({ __typename?: 'User', email: string } | { __typename?: 'User', email?: never }) & ({ __typename?: 'User', address: { __typename?: 'Address', street1: string } } | { __typename?: 'User', address?: never }) & (\n        { __typename?: 'User' }\n        & { ' $fragmentRefs'?: { 'WidgetFragmentFragment': Incremental<WidgetFragmentFragment> } }\n      ) & (\n        { __typename?: 'User' }\n        & { ' $fragmentRefs'?: { 'FoodFragmentFragment': Incremental<FoodFragmentFragment> } }\n      ) };\n    `);\n    });\n  });\n\n  it('handles unnamed queries', async () => {\n    const ast = parse(/* GraphQL */ `\n      query {\n        notifications {\n          id\n        }\n      }\n    `);\n\n    const result = await plugin(\n      schema,\n      [{ location: 'test-file.ts', document: ast }],\n      { preResolveTypes: false },\n      { outputFile: '' }\n    );\n    expect(result.content).toBeSimilarStringTo(`\n      export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never; }>;\n\n      export type Unnamed_1_Query = (\n          { __typename?: 'Query' }\n        & { notifications: Array<(\n            { __typename?: 'TextNotification' }\n          & Pick<TextNotification, 'id'>\n        ) | (\n            { __typename?: 'ImageNotification' }\n          & Pick<ImageNotification, 'id'>\n        )> }\n      );\n    `);\n  });\n\n  describe('inlineFragmentTypes option', () => {\n    it(\"'combine' yields correct types\", async () => {\n      const ast = parse(/* GraphQL */ `\n        query {\n          me {\n            ...UserFragment\n          }\n        }\n        fragment UserFragment on User {\n          id\n        }\n      `);\n      const result = await plugin(\n        schema,\n        [{ location: 'test-file.ts', document: ast }],\n        { inlineFragmentTypes: 'combine' },\n        { outputFile: '' }\n      );\n      expect(result.content).toBeSimilarStringTo(`\n        export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type Unnamed_1_Query = { __typename?: 'Query', me?: (\n            { __typename?: 'User' }\n            & UserFragmentFragment\n          ) | null };\n\n        export type UserFragmentFragment = { __typename?: 'User', id: string };\n      `);\n    });\n\n    it(\"'inline' yields correct types\", async () => {\n      const ast = parse(/* GraphQL */ `\n        query {\n          me {\n            ...UserFragment\n          }\n        }\n        fragment UserFragment on User {\n          id\n        }\n      `);\n      const result = await plugin(\n        schema,\n        [{ location: 'test-file.ts', document: ast }],\n        { inlineFragmentTypes: 'inline' },\n        { outputFile: '' }\n      );\n      expect(result.content).toBeSimilarStringTo(`\n        export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type Unnamed_1_Query = { __typename?: 'Query', me?: { __typename?: 'User', id: string } | null };\n\n        export type UserFragmentFragment = { __typename?: 'User', id: string };\n      `);\n    });\n\n    it(\"'mask' yields correct types\", async () => {\n      const ast = parse(/* GraphQL */ `\n        query {\n          me {\n            ...UserFragment\n          }\n        }\n        fragment UserFragment on User {\n          id\n        }\n      `);\n      const result = await plugin(\n        schema,\n        [{ location: 'test-file.ts', document: ast }],\n        { inlineFragmentTypes: 'mask' },\n        { outputFile: '' }\n      );\n      expect(result.content).toBeSimilarStringTo(`\n        export type Unnamed_1_QueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type Unnamed_1_Query = { __typename?: 'Query', me?: (\n            { __typename?: 'User' }\n            & { ' $fragmentRefs'?: { 'UserFragmentFragment': UserFragmentFragment } }\n          ) | null };\n\n        export type UserFragmentFragment = { __typename?: 'User', id: string } & { ' $fragmentName'?: 'UserFragmentFragment' };\n      `);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/operations/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'typescript-operations',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/CHANGELOG.md",
    "content": "# @graphql-codegen/typescript-resolvers\n\n## 5.1.7\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-codegen/visitor-plugin-common@^6.2.3` ↗︎](https://www.npmjs.com/package/@graphql-codegen/visitor-plugin-common/v/6.2.3) (from `6.2.3`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/utils@^11.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/11.0.0) (from `^10.0.0`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/plugin-helpers@6.1.1\n  - @graphql-codegen/typescript@5.0.9\n  - @graphql-codegen/visitor-plugin-common@6.2.4\n\n## 5.1.6\n\n### Patch Changes\n\n- Updated dependencies [[`6038634`](https://github.com/dotansimha/graphql-code-generator/commit/60386344081917f2884db933309821603a2be2bf)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.3\n  - @graphql-codegen/typescript@5.0.8\n\n## 5.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`f588d91`](https://github.com/dotansimha/graphql-code-generator/commit/f588d91ac43ea0aa5931915ce980d2e6876bb59c)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.2\n  - @graphql-codegen/typescript@5.0.7\n\n## 5.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`b995ed1`](https://github.com/dotansimha/graphql-code-generator/commit/b995ed13a49379ea05e0e313fac68b557527523a)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.1\n  - @graphql-codegen/typescript@5.0.6\n\n## 5.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`f821e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f821e8ab9351f23a9f7e5d5e6fc69c8e8868cad8), [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.0\n  - @graphql-codegen/plugin-helpers@6.1.0\n  - @graphql-codegen/typescript@5.0.5\n\n## 5.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`51a1a72`](https://github.com/dotansimha/graphql-code-generator/commit/51a1a7280578d43681391df11d320a8416c0b41d)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.2\n  - @graphql-codegen/typescript@5.0.4\n\n## 5.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`6715330`](https://github.com/dotansimha/graphql-code-generator/commit/67153304646694d75aee24afd70c3fce12e9f1f2)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.1\n  - @graphql-codegen/typescript@5.0.3\n\n## 5.1.0\n\n### Minor Changes\n\n- [#10449](https://github.com/dotansimha/graphql-code-generator/pull/10449) [`8258f1f`](https://github.com/dotansimha/graphql-code-generator/commit/8258f1f6012c106d02ef28bca9ec424f70c4aa26) Thanks [@eddeee888](https://github.com/eddeee888)! - Add `addInterfaceFieldResolverTypes` option to support custom Interface resolver inheritance behaviour (such as the one enabled by [makeExecutableSchema's inheritResolversFromInterfaces](https://the-guild.dev/graphql/tools/docs/generate-schema#makeexecutableschema))\n\n### Patch Changes\n\n- Updated dependencies [[`8258f1f`](https://github.com/dotansimha/graphql-code-generator/commit/8258f1f6012c106d02ef28bca9ec424f70c4aa26)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.0\n  - @graphql-codegen/typescript@5.0.2\n\n## 5.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`accdab6`](https://github.com/dotansimha/graphql-code-generator/commit/accdab69106605241933e9d66d64dc7077656f30)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.1\n  - @graphql-codegen/typescript@5.0.1\n\n## 5.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - BREAKING CHANGES: Do not generate \\_\\_isTypeOf for non-implementing types or non-union members\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - BREAKING CHANGE: Use Record<PropertyKey, never> instead of {} for empty object type\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Ensure Federation Interfaces have `__resolveReference` if they are resolvable entities\n\n  BREAKING CHANGES: Deprecate `onlyResolveTypeForInterfaces` because majority of use cases cannot implement resolvers in Interfaces. Interface normal resolvers are not generated by default. Use `addInterfaceFieldResolverTypes` option released in `@graphql-codegen/typescript-resolvers@5.1.0` to support custom Interface resolver inheritance behaviour (such as the one enabled by [makeExecutableSchema's inheritResolversFromInterfaces](https://the-guild.dev/graphql/tools/docs/generate-schema#makeexecutableschema))\n  BREAKING CHANGES: Deprecate `generateInternalResolversIfNeeded.__resolveReference` because types do not have `__resolveReference` if they are not Federation entities or are not resolvable. Users should not have to manually set this option. This option was put in to wait for this major version.\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - BREAKING CHANGE: Improve Federation Entity's resolvers' parent param type: These types were using reference types inline. This makes it hard to handle mappers. The Parent type now all comes from ParentResolverTypes to make handling mappers and parent types simpler.\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix `mappers` usage with Federation\n\n  `mappers` was previously used as `__resolveReference`'s first param (usually called \"reference\"). However, this is incorrect because `reference` interface comes directly from `@key` and `@requires` directives. This patch fixes the issue by creating a new `FederationTypes` type and use it as the base for federation entity types when being used to type entity references.\n\n  BREAKING CHANGES: No longer generate `UnwrappedObject` utility type, as this was used to support the wrong previously generated type.\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Minor Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Report to meta user defined objects whether they have isTypeOf resolver\n\n### Patch Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Update @requires type\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix fields or object types marked with @external being wrongly generated\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.0\n  - @graphql-codegen/plugin-helpers@6.0.0\n  - @graphql-codegen/typescript@5.0.0\n\n## 4.5.2\n\n### Patch Changes\n\n- [#10419](https://github.com/dotansimha/graphql-code-generator/pull/10419) [`2fc3869`](https://github.com/dotansimha/graphql-code-generator/commit/2fc3869de216554fa896359a082066eaa18e8634) Thanks [@chdanielmueller](https://github.com/chdanielmueller)! - Fix enum resolver for partially mapped enumValues\n\n## 4.5.1\n\n### Patch Changes\n\n- [#10330](https://github.com/dotansimha/graphql-code-generator/pull/10330) [`c5efba3`](https://github.com/dotansimha/graphql-code-generator/commit/c5efba34a7b422720be9ce32937dd19fb0784bae) Thanks [@jnoordsij](https://github.com/jnoordsij)! - Make graphql-sock optional peerDep\n\n## 4.5.0\n\n### Minor Changes\n\n- [#10315](https://github.com/dotansimha/graphql-code-generator/pull/10315) [`f6909d1`](https://github.com/dotansimha/graphql-code-generator/commit/f6909d1797c15b79a0afb7ec089471763a485bfc) Thanks [@eddeee888](https://github.com/eddeee888)! - Implement semanticNonNull custom directive\n\n### Patch Changes\n\n- Updated dependencies [[`f6909d1`](https://github.com/dotansimha/graphql-code-generator/commit/f6909d1797c15b79a0afb7ec089471763a485bfc)]:\n  - @graphql-codegen/visitor-plugin-common@5.8.0\n  - @graphql-codegen/typescript@4.1.6\n\n## 4.4.4\n\n### Patch Changes\n\n- Updated dependencies [[`d8566c0`](https://github.com/dotansimha/graphql-code-generator/commit/d8566c015943ea4dbcaeaf57d3d8406553ae230a)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.1\n  - @graphql-codegen/typescript@4.1.5\n\n## 4.4.3\n\n### Patch Changes\n\n- Updated dependencies [[`6d7c1d7`](https://github.com/dotansimha/graphql-code-generator/commit/6d7c1d7c0a4662acdc0efafd4234229ad0a8dd3c)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.0\n  - @graphql-codegen/typescript@4.1.4\n\n## 4.4.2\n\n### Patch Changes\n\n- [#10230](https://github.com/dotansimha/graphql-code-generator/pull/10230) [`60dd72f`](https://github.com/dotansimha/graphql-code-generator/commit/60dd72fb103fd7fd70b4e1def98da29588865517) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix generateInternalResolversIfNeeded.\\_\\_resolveReference making the resolver required\n\n  `__resolveReference`'s default behaviour when not declared is to pass the ref to subsequent resolvers i.e. becoming the `parent`. So, it means we don't have to make this resolver required.\n\n  This patch makes `__resolveReference` optional when `generateInternalResolversIfNeeded.__resolveReference` is set to true.\n\n- Updated dependencies [[`60dd72f`](https://github.com/dotansimha/graphql-code-generator/commit/60dd72fb103fd7fd70b4e1def98da29588865517)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.1\n  - @graphql-codegen/typescript@4.1.3\n\n## 4.4.1\n\n### Patch Changes\n\n- [#10187](https://github.com/dotansimha/graphql-code-generator/pull/10187) [`1617e3c`](https://github.com/dotansimha/graphql-code-generator/commit/1617e3cf38f3059cc5ea88b540033f521f03725a) Thanks [@gilgardosh](https://github.com/gilgardosh)! - Fix: type naming for imported enums\n\n- Updated dependencies [[`1617e3c`](https://github.com/dotansimha/graphql-code-generator/commit/1617e3cf38f3059cc5ea88b540033f521f03725a), [`fa64fbf`](https://github.com/dotansimha/graphql-code-generator/commit/fa64fbf8a44e1cee7ae17806dcd178dc7350c4ba)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.0\n  - @graphql-codegen/typescript@4.1.2\n\n## 4.4.0\n\n### Minor Changes\n\n- [#9989](https://github.com/dotansimha/graphql-code-generator/pull/9989) [`55a1e9e`](https://github.com/dotansimha/graphql-code-generator/commit/55a1e9e63830df17ed40602ea7e322bbf48b17bc) Thanks [@eddeee888](https://github.com/eddeee888)! - Add `generateInternalResolversIfNeeded` option\n\n  This option can be used to generate more correct types for internal resolvers. For example, only generate `__resolveReference` if the federation object has a resolvable `@key`.\n\n  In the future, this option can be extended to support other internal resolvers e.g. `__isTypeOf` is only generated for implementing types and union members.\n\n- [#10141](https://github.com/dotansimha/graphql-code-generator/pull/10141) [`a235051`](https://github.com/dotansimha/graphql-code-generator/commit/a23505180ac2f275a55ece27162ec9bfcdc52e03) Thanks [@eddeee888](https://github.com/eddeee888)! - Add avoidCheckingAbstractTypesRecursively to avoid checking and generating abstract types recursively\n\n  For users that already sets recursive default mappers e.g. `Partial<{T}>` or `DeepPartial<{T}>`, having both options on will cause a nested loop which eventually crashes Codegen. In such case, setting `avoidCheckingAbstractTypesRecursively: true` allows users to continue to use recursive default mappers as before.\n\n### Patch Changes\n\n- Updated dependencies [[`55a1e9e`](https://github.com/dotansimha/graphql-code-generator/commit/55a1e9e63830df17ed40602ea7e322bbf48b17bc), [`a235051`](https://github.com/dotansimha/graphql-code-generator/commit/a23505180ac2f275a55ece27162ec9bfcdc52e03)]:\n  - @graphql-codegen/visitor-plugin-common@5.5.0\n  - @graphql-codegen/plugin-helpers@5.1.0\n  - @graphql-codegen/typescript@4.1.1\n\n## 4.3.0\n\n### Minor Changes\n\n- [#10077](https://github.com/dotansimha/graphql-code-generator/pull/10077) [`3f4f546`](https://github.com/dotansimha/graphql-code-generator/commit/3f4f5466ff168ad822b9a00d83d3779078e6d8c4) Thanks [@eddeee888](https://github.com/eddeee888)! - Extend `config.avoidOptions` to support query, mutation and subscription\n\n  Previously, `config.avoidOptions.resolvers` was being used to make query, mutation and subscription fields non-optional.\n  Now, `config.avoidOptions.query`, `config.avoidOptions.mutation` and `config.avoidOptions.subscription` can be used to target the respective types.\n\n### Patch Changes\n\n- Updated dependencies [[`3f4f546`](https://github.com/dotansimha/graphql-code-generator/commit/3f4f5466ff168ad822b9a00d83d3779078e6d8c4)]:\n  - @graphql-codegen/visitor-plugin-common@5.4.0\n  - @graphql-codegen/typescript@4.1.0\n\n## 4.2.1\n\n### Patch Changes\n\n- [#10014](https://github.com/dotansimha/graphql-code-generator/pull/10014) [`79fee3c`](https://github.com/dotansimha/graphql-code-generator/commit/79fee3cada20d683d250aad5aa5fef9d6ed9f4d2) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix object types with fields being abstract types not pointing to resolver types correctly\n\n- Updated dependencies [[`79fee3c`](https://github.com/dotansimha/graphql-code-generator/commit/79fee3cada20d683d250aad5aa5fef9d6ed9f4d2)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.1\n  - @graphql-codegen/typescript@4.0.9\n\n## 4.2.0\n\n### Minor Changes\n\n- [#10007](https://github.com/dotansimha/graphql-code-generator/pull/10007) [`808ada5`](https://github.com/dotansimha/graphql-code-generator/commit/808ada595d83d39cad045da5824cac6378e9eca3) Thanks [@eddeee888](https://github.com/eddeee888)! - Add generated resolvers map type name to typescript-resolvers plugin meta\n\n### Patch Changes\n\n- Updated dependencies [[`808ada5`](https://github.com/dotansimha/graphql-code-generator/commit/808ada595d83d39cad045da5824cac6378e9eca3), [`14ce39e`](https://github.com/dotansimha/graphql-code-generator/commit/14ce39e41dfee38c652be736664177fa2b1df421)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.0\n  - @graphql-codegen/typescript@4.0.8\n\n## 4.1.0\n\n### Minor Changes\n\n- [#9961](https://github.com/dotansimha/graphql-code-generator/pull/9961) [`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e) Thanks [@eddeee888](https://github.com/eddeee888)! - Update typescript-resolvers to report generated resolver types in the run to meta field in the output\n\n### Patch Changes\n\n- [#9944](https://github.com/dotansimha/graphql-code-generator/pull/9944) [`156cc2b`](https://github.com/dotansimha/graphql-code-generator/commit/156cc2b9a2a5129beba121cfa987b04e29899431) Thanks [@eddeee888](https://github.com/eddeee888)! - Add \\_ prefix to generated `RefType` in `ResolversInterfaceTypes` and `ResolversUnionTypes` as it is sometimes unused\n\n- [#9962](https://github.com/dotansimha/graphql-code-generator/pull/9962) [`b49457b`](https://github.com/dotansimha/graphql-code-generator/commit/b49457b5f29328d2dc23c642788a2e697cb8966e) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix interface mappers not working in nested/self-referencing scenarios\n\n- Updated dependencies [[`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`156cc2b`](https://github.com/dotansimha/graphql-code-generator/commit/156cc2b9a2a5129beba121cfa987b04e29899431), [`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`b49457b`](https://github.com/dotansimha/graphql-code-generator/commit/b49457b5f29328d2dc23c642788a2e697cb8966e)]:\n  - @graphql-codegen/plugin-helpers@5.0.4\n  - @graphql-codegen/visitor-plugin-common@5.2.0\n  - @graphql-codegen/typescript@4.0.7\n\n## 4.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`920b443`](https://github.com/dotansimha/graphql-code-generator/commit/920b443a401b8cc4811f64ec5b25fc7b4ae32b53), [`ed9c205`](https://github.com/dotansimha/graphql-code-generator/commit/ed9c205d15d7f14ed73e54aecf40e4fad5664e9d)]:\n  - @graphql-codegen/visitor-plugin-common@5.1.0\n  - @graphql-codegen/typescript@4.0.6\n\n## 4.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`53f270a`](https://github.com/dotansimha/graphql-code-generator/commit/53f270acfa1da992e0f9d2e50921bb588392f8a5)]:\n  - @graphql-codegen/visitor-plugin-common@5.0.0\n  - @graphql-codegen/typescript@4.0.5\n\n## 4.0.4\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.2\n  - @graphql-codegen/typescript@4.0.4\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 4.0.3\n\n### Patch Changes\n\n- [#9673](https://github.com/dotansimha/graphql-code-generator/pull/9673) [`7718a8113`](https://github.com/dotansimha/graphql-code-generator/commit/7718a8113dc6282475cb738f1e28698b8221fa2f) Thanks [@maclockard](https://github.com/maclockard)! - Respect avoidOptionals when all arguments are optional\n\n- Updated dependencies [[`7718a8113`](https://github.com/dotansimha/graphql-code-generator/commit/7718a8113dc6282475cb738f1e28698b8221fa2f)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.1\n  - @graphql-codegen/typescript@4.0.3\n\n## 4.0.2\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n  - @graphql-codegen/typescript@4.0.2\n  - @graphql-codegen/visitor-plugin-common@4.1.0\n\n## 4.0.1\n\n### Patch Changes\n\n- [#9497](https://github.com/dotansimha/graphql-code-generator/pull/9497) [`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a) Thanks [@eddeee888](https://github.com/eddeee888)! - Revert default ID scalar input type to string\n\n  We changed the ID Scalar input type from `string` to `string | number` in the latest major version of `typescript` plugin. This causes issues for server plugins (e.g. typescript-resolvers) that depends on `typescript` plugin. This is because the scalar type needs to be manually inverted on setup which is confusing.\n\n- Updated dependencies [[`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a)]:\n  - @graphql-codegen/visitor-plugin-common@4.0.1\n  - @graphql-codegen/typescript@4.0.1\n\n## 4.0.0\n\n### Major Changes\n\n- [#9375](https://github.com/dotansimha/graphql-code-generator/pull/9375) [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929) Thanks [@eddeee888](https://github.com/eddeee888)! - Implement Scalars with input/output types\n\n  In GraphQL, Scalar types can be different for client and server. For example, given the native GraphQL ID:\n\n  - A client may send `string` or `number` in the input\n  - A client receives `string` in its selection set (i.e output)\n  - A server receives `string` in the resolver (GraphQL parses `string` or `number` received from the client to `string`)\n  - A server may return `string` or `number` (GraphQL serializes the value to `string` before sending it to the client )\n\n  Currently, we represent every Scalar with only one type. This is what codegen generates as base type:\n\n  ```ts\n  export type Scalars = {\n    ID: string\n  }\n  ```\n\n  Then, this is used in both input and output type e.g.\n\n  ```ts\n  export type Book = {\n    __typename?: 'Book'\n    id: Scalars['ID'] // Output's ID can be `string` 👍\n  }\n\n  export type QueryBookArgs = {\n    id: Scalars['ID'] // Input's ID can be `string` or `number`. However, the type is only `string` here 👎\n  }\n  ```\n\n  This PR extends each Scalar to have input and output:\n\n  ```ts\n  export type Scalars = {\n    ID: {\n      input: string | number\n      output: string\n    }\n  }\n  ```\n\n  Then, each input/output GraphQL type can correctly refer to the correct input/output scalar type:\n\n  ```ts\n  export type Book = {\n    __typename?: 'Book'\n    id: Scalars['ID']['output'] // Output's ID can be `string` 👍\n  }\n\n  export type QueryBookArgs = {\n    id: Scalars['ID']['input'] // Input's ID can be `string` or `number` 👍\n  }\n  ```\n\n  Note that for `typescript-resolvers`, the type of ID needs to be inverted. However, the referenced types in GraphQL input/output types should still work correctly:\n\n  ```ts\n  export type Scalars = {\n    ID: {\n      input: string;\n      output: string | number;\n    }\n  }\n\n  export type Book = {\n    __typename?: \"Book\";\n    id: Scalars[\"ID\"]['output']; // Resolvers can return `string` or `number` in ID fields 👍\n  };\n\n  export type QueryBookArgs = {\n    id: Scalars[\"ID\"]['input']; // Resolvers receive `string` in ID fields 👍\n  };\n\n  export type ResolversTypes = {\n    ID: ID: ResolverTypeWrapper<Scalars['ID']['output']>; // Resolvers can return `string` or `number` in ID fields 👍\n  }\n\n  export type ResolversParentTypes = {\n    ID: Scalars['ID']['output']; // Resolvers receive `string` or `number` from parents 👍\n  };\n  ```\n\n  ***\n\n  Config changes:\n\n  1. Scalars option can now take input/output types:\n\n  ```ts\n  config: {\n    scalars: {\n      ID: {\n        input: 'string',\n        output: 'string | number'\n      }\n    }\n  }\n  ```\n\n  2. If a string is given (instead of an object with input/output fields), it will be used as both input and output types:\n\n  ```ts\n  config: {\n    scalars: {\n      ID: 'string' // This means `string` will be used for both ID's input and output types\n    }\n  }\n  ```\n\n  3. BREAKING CHANGE: External module Scalar types need to be an object with input/output fields\n\n  ```ts\n  config: {\n    scalars: {\n      ID: './path/to/scalar-module'\n    }\n  }\n  ```\n\n  If correctly, wired up, the following will be generated:\n\n  ```ts\n  // Previously, imported `ID` type can be a primitive type, now it must be an object with input/output fields\n  import { ID } from './path/to/scalar-module'\n\n  export type Scalars = {\n    ID: { input: ID['input']; output: ID['output'] }\n  }\n  ```\n\n  ***\n\n  BREAKING CHANGE: This changes Scalar types which could be referenced in other plugins. If you are a plugin maintainer and reference Scalar, please update your plugin to use the correct input/output types.\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Minor Changes\n\n- [#9196](https://github.com/dotansimha/graphql-code-generator/pull/9196) [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96) Thanks [@beerose](https://github.com/beerose)! - Add `@defer` directive support\n\n  When a query includes a deferred fragment field, the server will return a partial response with the non-deferred fields first, followed by the remaining fields once they have been resolved.\n\n  Once start using the `@defer` directive in your queries, the generated code will automatically include support for the directive.\n\n  ```jsx\n  // src/index.tsx\n  import { graphql } from './gql'\n  const OrdersFragment = graphql(`\n    fragment OrdersFragment on User {\n      orders {\n        id\n        total\n      }\n    }\n  `)\n  const GetUserQuery = graphql(`\n    query GetUser($id: ID!) {\n      user(id: $id) {\n        id\n        name\n        ...OrdersFragment @defer\n      }\n    }\n  `)\n  ```\n\n  The generated type for `GetUserQuery` will have information that the fragment is _incremental,_ meaning it may not be available right away.\n\n  ```tsx\n  // gql/graphql.ts\n  export type GetUserQuery = { __typename?: 'Query'; id: string; name: string } & ({\n    __typename?: 'Query'\n  } & {\n    ' $fragmentRefs'?: { OrdersFragment: Incremental<OrdersFragment> }\n  })\n  ```\n\n  Apart from generating code that includes support for the `@defer` directive, the Codegen also exports a utility function called `isFragmentReady`. You can use it to conditionally render components based on whether the data for a deferred\n  fragment is available:\n\n  ```jsx\n  const OrdersList = (props: { data: FragmentType<typeof OrdersFragment> }) => {\n    const data = useFragment(OrdersFragment, props.data);\n    return (\n      // render orders list\n    )\n  };\n\n  function App() {\n    const { data } = useQuery(GetUserQuery);\n    return (\n      {data && (\n        <>\n          {isFragmentReady(GetUserQuery, OrdersFragment, data)\n  \t\t\t\t\t&& <OrdersList data={data} />}\n        </>\n      )}\n    );\n  }\n  export default App;\n  ```\n\n- [#9339](https://github.com/dotansimha/graphql-code-generator/pull/9339) [`50471e651`](https://github.com/dotansimha/graphql-code-generator/commit/50471e6514557db827cd26157262401c6c600a8c) Thanks [@AaronMoat](https://github.com/AaronMoat)! - Add excludeTypes config to resolversNonOptionalTypename\n\n  This disables the adding of `__typename` in resolver types for any specified typename. This could be useful e.g. if you're wanting to enable this for all new types going forward but not do a big migration.\n\n  Usage example:\n\n  ```typescript\n  const config: CodegenConfig = {\n    schema: 'src/schema/**/*.graphql',\n    generates: {\n      'src/schema/types.ts': {\n        plugins: ['typescript', 'typescript-resolvers'],\n        config: {\n          resolversNonOptionalTypename: {\n            unionMember: true,\n            excludeTypes: ['MyType']\n          }\n        }\n      }\n    }\n  }\n  ```\n\n- [#9229](https://github.com/dotansimha/graphql-code-generator/pull/9229) [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c) Thanks [@eddeee888](https://github.com/eddeee888)! - Use generic to simplify ResolversUnionTypes\n\n  This follows the `ResolversInterfaceTypes`'s approach where the `RefType` generic is used to refer back to `ResolversTypes` or `ResolversParentTypes` in cases of nested Union types\n\n- [#9304](https://github.com/dotansimha/graphql-code-generator/pull/9304) [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823) Thanks [@esfomeado](https://github.com/esfomeado)! - Added support for disabling suffixes on Enums.\n\n- [#9229](https://github.com/dotansimha/graphql-code-generator/pull/9229) [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c) Thanks [@eddeee888](https://github.com/eddeee888)! - Extract interfaces to ResolversInterfaceTypes and add to resolversNonOptionalTypename\n\n  1. `ResolversInterfaceTypes` is a new type that keeps track of a GraphQL interface and its implementing types.\n\n  For example, consider this schema:\n\n  ```graphql\n  extend type Query {\n    character(id: ID!): CharacterNode\n  }\n\n  interface CharacterNode {\n    id: ID!\n  }\n\n  type Wizard implements CharacterNode {\n    id: ID!\n    screenName: String!\n    spells: [String!]!\n  }\n\n  type Fighter implements CharacterNode {\n    id: ID!\n    screenName: String!\n    powerLevel: Int!\n  }\n  ```\n\n  The generated types will look like this:\n\n  ```ts\n  export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = {\n    CharacterNode: Fighter | Wizard\n  }\n\n  export type ResolversTypes = {\n    // other types...\n    CharacterNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['CharacterNode']>\n    Fighter: ResolverTypeWrapper<Fighter>\n    Wizard: ResolverTypeWrapper<Wizard>\n    // other types...\n  }\n\n  export type ResolversParentTypes = {\n    // other types...\n    CharacterNode: ResolversInterfaceTypes<ResolversParentTypes>['CharacterNode']\n    Fighter: Fighter\n    Wizard: Wizard\n    // other types...\n  }\n  ```\n\n  The `RefType` generic is used to reference back to `ResolversTypes` and `ResolversParentTypes` in some cases such as field returning a Union.\n\n  2. `resolversNonOptionalTypename` also affects `ResolversInterfaceTypes`\n\n  Using the schema above, if we use `resolversNonOptionalTypename` option:\n\n  ```typescript\n  const config: CodegenConfig = {\n    schema: 'src/schema/**/*.graphql',\n    generates: {\n      'src/schema/types.ts': {\n        plugins: ['typescript', 'typescript-resolvers'],\n        config: {\n          resolversNonOptionalTypename: true // Or `resolversNonOptionalTypename: { interfaceImplementingType: true }`\n        }\n      }\n    }\n  }\n  ```\n\n  Then, the generated type looks like this:\n\n  ```ts\n  export type ResolversInterfaceTypes<RefType extends Record<string, unknown>> = {\n    CharacterNode: (Fighter & { __typename: 'Fighter' }) | (Wizard & { __typename: 'Wizard' })\n  }\n\n  export type ResolversTypes = {\n    // other types...\n    CharacterNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['CharacterNode']>\n    Fighter: ResolverTypeWrapper<Fighter>\n    Wizard: ResolverTypeWrapper<Wizard>\n    // other types...\n  }\n\n  export type ResolversParentTypes = {\n    // other types...\n    CharacterNode: ResolversInterfaceTypes<ResolversParentTypes>['CharacterNode']\n    Fighter: Fighter\n    Wizard: Wizard\n    // other types...\n  }\n  ```\n\n### Patch Changes\n\n- [#9449](https://github.com/dotansimha/graphql-code-generator/pull/9449) [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^10.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.0.0) (from `^9.0.0`, in `dependencies`)\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96), [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`50471e651`](https://github.com/dotansimha/graphql-code-generator/commit/50471e6514557db827cd26157262401c6c600a8c), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c), [`ca02ad172`](https://github.com/dotansimha/graphql-code-generator/commit/ca02ad172a0e8f52570fdef4271ec286d883236d), [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0), [`5950f5a68`](https://github.com/dotansimha/graphql-code-generator/commit/5950f5a6843cdd92b9d5b8ced3a97b68eadf9f30), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n  - @graphql-codegen/visitor-plugin-common@4.0.0\n  - @graphql-codegen/typescript@4.0.0\n\n## 3.2.1\n\n### Patch Changes\n\n- [#9231](https://github.com/dotansimha/graphql-code-generator/pull/9231) [`402cb8ac0`](https://github.com/dotansimha/graphql-code-generator/commit/402cb8ac0f0c347b186d295c4b69c19e25a65d00) Thanks [@eddeee888](https://github.com/eddeee888)! - Implement resolversNonOptionalTypename for mapper cases\n\n- Updated dependencies [[`386cf9044`](https://github.com/dotansimha/graphql-code-generator/commit/386cf9044a41d87ed45069b22d26b30f4b262a85), [`402cb8ac0`](https://github.com/dotansimha/graphql-code-generator/commit/402cb8ac0f0c347b186d295c4b69c19e25a65d00)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.1\n  - @graphql-codegen/typescript@3.0.4\n\n## 3.2.0\n\n### Minor Changes\n\n- [#9146](https://github.com/dotansimha/graphql-code-generator/pull/9146) [`9f4d9c5a4`](https://github.com/dotansimha/graphql-code-generator/commit/9f4d9c5a479d34da25df8e060a8c2b3b162647dd) Thanks [@eddeee888](https://github.com/eddeee888)! - [typescript-resolvers] Add `resolversNonOptionalTypename` config option.\n\n  This is extending on `ResolversUnionTypes` implemented in https://github.com/dotansimha/graphql-code-generator/pull/9069\n\n  `resolversNonOptionalTypename` adds non-optional `__typename` to union members of `ResolversUnionTypes`, without affecting the union members' base intefaces.\n\n  A common use case for non-optional `__typename` of union members is using it as the common field to work out the final schema type. This makes implementing the union's `__resolveType` very simple as we can use `__typename` to decide which union member the resolved object is. Without this, we have to check the existence of field/s on the incoming object which could be verbose.\n\n  For example, consider this schema:\n\n  ```graphql\n  type Query {\n    book(id: ID!): BookPayload!\n  }\n\n  type Book {\n    id: ID!\n    isbn: String!\n  }\n\n  type BookResult {\n    node: Book\n  }\n\n  type PayloadError {\n    message: String!\n  }\n\n  union BookPayload = BookResult | PayloadError\n  ```\n\n  _With optional `__typename`:_ We need to check existence of certain fields to resolve type in the union resolver:\n\n  ```ts\n  // Query/book.ts\n  export const book = async () => {\n    try {\n      const book = await fetchBook()\n      // 1. No `__typename` in resolver results...\n      return {\n        node: book\n      }\n    } catch (e) {\n      return {\n        message: 'Failed to fetch book'\n      }\n    }\n  }\n\n  // BookPayload.ts\n  export const BookPayload = {\n    __resolveType: parent => {\n      // 2. ... means more checks in `__resolveType`\n      if ('message' in parent) {\n        return 'PayloadError'\n      }\n      return 'BookResult'\n    }\n  }\n  ```\n\n  _With non-optional `__typename`:_ Resolvers declare the type. This which gives us better TypeScript support in resolvers and simplify `__resolveType` implementation:\n\n  ```ts\n  // Query/book.ts\n  export const book = async () => {\n    try {\n      const book = await fetchBook()\n      // 1. `__typename` is declared in resolver results...\n      return {\n        __typename: 'BookResult', // 1a. this also types `node` for us 🎉\n        node: book\n      }\n    } catch (e) {\n      return {\n        __typename: 'PayloadError',\n        message: 'Failed to fetch book'\n      }\n    }\n  }\n\n  // BookPayload.ts\n  export const BookPayload = {\n    __resolveType: parent => parent.__typename // 2. ... means a very simple check in `__resolveType`\n  }\n  ```\n\n  _Using `resolversNonOptionalTypename`:_ add it into `typescript-resolvers` plugin config:\n\n  ```ts\n  // codegen.ts\n  const config: CodegenConfig = {\n    schema: 'src/schema/**/*.graphql',\n    generates: {\n      'src/schema/types.ts': {\n        plugins: ['typescript', 'typescript-resolvers'],\n        config: {\n          resolversNonOptionalTypename: true // Or `resolversNonOptionalTypename: { unionMember: true }`\n        }\n      }\n    }\n  }\n  ```\n\n### Patch Changes\n\n- [#9206](https://github.com/dotansimha/graphql-code-generator/pull/9206) [`e56790104`](https://github.com/dotansimha/graphql-code-generator/commit/e56790104ae56d6c5b48ef71823345bd09d3b835) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix `ResolversUnionTypes` being used in `ResolversParentTypes`\n\n  Previously, objects with mappable fields are converted to Omit format that references its own type group or `ResolversTypes` or `ResolversParentTypes` e.g.\n\n  ```ts\n  export type ResolversTypes = {\n    Book: ResolverTypeWrapper<BookMapper>\n    BookPayload: ResolversTypes['BookResult'] | ResolversTypes['StandardError']\n    // Note: `result` on the next line references `ResolversTypes[\"Book\"]`\n    BookResult: ResolverTypeWrapper<Omit<BookResult, 'result'> & { result?: Maybe<ResolversTypes['Book']> }>\n    StandardError: ResolverTypeWrapper<StandardError>\n  }\n\n  export type ResolversParentTypes = {\n    Book: BookMapper\n    BookPayload: ResolversParentTypes['BookResult'] | ResolversParentTypes['StandardError']\n    // Note: `result` on the next line references `ResolversParentTypes[\"Book\"]`\n    BookResult: Omit<BookResult, 'result'> & { result?: Maybe<ResolversParentTypes['Book']> }\n    StandardError: StandardError\n  }\n  ```\n\n  In https://github.com/dotansimha/graphql-code-generator/pull/9069, we extracted resolver union types to its own group:\n\n  ```ts\n  export type ResolversUnionTypes = {\n    // Note: `result` on the next line references `ResolversTypes[\"Book\"]` which is only correct for the `ResolversTypes` case\n    BookPayload: (Omit<BookResult, 'result'> & { result?: Maybe<ResolversTypes['Book']> }) | StandardError\n  }\n\n  export type ResolversTypes = {\n    Book: ResolverTypeWrapper<BookMapper>\n    BookPayload: ResolverTypeWrapper<ResolversUnionTypes['BookPayload']>\n    BookResult: ResolverTypeWrapper<Omit<BookResult, 'result'> & { result?: Maybe<ResolversTypes['Book']> }>\n    StandardError: ResolverTypeWrapper<StandardError>\n  }\n\n  export type ResolversParentTypes = {\n    Book: BookMapper\n    BookPayload: ResolversUnionTypes['BookPayload']\n    BookResult: Omit<BookResult, 'result'> & { result?: Maybe<ResolversParentTypes['Book']> }\n    StandardError: StandardError\n  }\n  ```\n\n  This change creates an extra `ResolversUnionParentTypes` that is referenced by `ResolversParentTypes` to ensure backwards compatibility:\n\n  ```ts\n  export type ResolversUnionTypes = {\n    BookPayload: (Omit<BookResult, 'result'> & { result?: Maybe<ResolversParentTypes['Book']> }) | StandardError\n  }\n\n  // ... and the reference is changed in ResolversParentTypes:\n  export type ResolversParentTypes = {\n    // ... other fields\n    BookPayload: ResolversUnionParentTypes['BookPayload']\n  }\n  ```\n\n- [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087) Thanks [@saihaj](https://github.com/saihaj)! - Resolve issue with nesting fields in `@provides` directive being prevented\n\n- Updated dependencies [[`e56790104`](https://github.com/dotansimha/graphql-code-generator/commit/e56790104ae56d6c5b48ef71823345bd09d3b835), [`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29), [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087), [`92d86b009`](https://github.com/dotansimha/graphql-code-generator/commit/92d86b009579edf70f60b0b8e28658af93ff9fd1), [`acb647e4e`](https://github.com/dotansimha/graphql-code-generator/commit/acb647e4efbddecf732b6e55dc47ac40c9bdaf08), [`9f4d9c5a4`](https://github.com/dotansimha/graphql-code-generator/commit/9f4d9c5a479d34da25df8e060a8c2b3b162647dd)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.0\n  - @graphql-codegen/plugin-helpers@4.2.0\n  - @graphql-codegen/typescript@3.0.3\n\n## 3.1.1\n\n### Patch Changes\n\n- [#9110](https://github.com/dotansimha/graphql-code-generator/pull/9110) [`ba0610bbd`](https://github.com/dotansimha/graphql-code-generator/commit/ba0610bbd4578d8a82078014766f56d8ae5fcf7a) Thanks [@gilgardosh](https://github.com/gilgardosh)! - Custom mappers with placeholder will apply omit\n\n- [#9069](https://github.com/dotansimha/graphql-code-generator/pull/9069) [`4b49f6fbe`](https://github.com/dotansimha/graphql-code-generator/commit/4b49f6fbed802907b460bfb7b6e9a85f88c555bc) Thanks [@eddeee888](https://github.com/eddeee888)! - Extract union types to ResolversUnionTypes\n\n- Updated dependencies [[`ba0610bbd`](https://github.com/dotansimha/graphql-code-generator/commit/ba0610bbd4578d8a82078014766f56d8ae5fcf7a), [`4b49f6fbe`](https://github.com/dotansimha/graphql-code-generator/commit/4b49f6fbed802907b460bfb7b6e9a85f88c555bc), [`b343626c9`](https://github.com/dotansimha/graphql-code-generator/commit/b343626c978b9ee0f14e314cea6c01ae3dad057c)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.2\n  - @graphql-codegen/typescript@3.0.2\n\n## 3.1.0\n\n### Minor Changes\n\n- [#8853](https://github.com/dotansimha/graphql-code-generator/pull/8853) [`b13aa7449`](https://github.com/dotansimha/graphql-code-generator/commit/b13aa7449637eaf28976ea7e31730b0290609919) Thanks [@KGAdamCook](https://github.com/KGAdamCook)! - Updated customResolveInfo to use the correct importType for external imports\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n  - @graphql-codegen/typescript@3.0.1\n  - @graphql-codegen/visitor-plugin-common@3.0.1\n\n## 3.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- [#8871](https://github.com/dotansimha/graphql-code-generator/pull/8871) [`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5) Thanks [@B2o5T](https://github.com/B2o5T)! - eslint fixes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.0\n  - @graphql-codegen/plugin-helpers@4.0.0\n  - @graphql-codegen/typescript@3.0.0\n\n## 2.7.13\n\n### Patch Changes\n\n- Updated dependencies [[`a98198524`](https://github.com/dotansimha/graphql-code-generator/commit/a9819852443884b43de7c15040ccffc205f9177a)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.8\n  - @graphql-codegen/typescript@2.8.8\n\n## 2.7.12\n\n### Patch Changes\n\n- Updated dependencies [[`eb454d06c`](https://github.com/dotansimha/graphql-code-generator/commit/eb454d06c977f11f7d4a7b0b07eb80f8fd590560)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.7\n  - @graphql-codegen/typescript@2.8.7\n\n## 2.7.11\n\n### Patch Changes\n\n- [#8771](https://github.com/dotansimha/graphql-code-generator/pull/8771) [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/9.0.0) (from `^8.8.0`, in `dependencies`)\n- Updated dependencies [[`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`6c6b6f2df`](https://github.com/dotansimha/graphql-code-generator/commit/6c6b6f2df88a3a37b437a25320dab5590f033316)]:\n  - @graphql-codegen/plugin-helpers@3.1.2\n  - @graphql-codegen/visitor-plugin-common@2.13.6\n  - @graphql-codegen/typescript@2.8.6\n\n## 2.7.10\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81), [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n  - @graphql-codegen/visitor-plugin-common@2.13.5\n  - @graphql-codegen/typescript@2.8.5\n\n## 2.7.9\n\n### Patch Changes\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n  - @graphql-codegen/visitor-plugin-common@2.13.4\n  - @graphql-codegen/typescript@2.8.4\n\n## 2.7.8\n\n### Patch Changes\n\n- Updated dependencies [[`62f655452`](https://github.com/dotansimha/graphql-code-generator/commit/62f6554520955dd675e11c920f35ef9bf0aaeffe)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.3\n  - @graphql-codegen/typescript@2.8.3\n\n## 2.7.7\n\n### Patch Changes\n\n- Updated dependencies [[`ef4c2c9c2`](https://github.com/dotansimha/graphql-code-generator/commit/ef4c2c9c233c68830f10eb4c167c7cceead27122)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.2\n  - @graphql-codegen/typescript@2.8.2\n\n## 2.7.6\n\n### Patch Changes\n\n- Updated dependencies [[`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.1\n  - @graphql-codegen/plugin-helpers@2.7.2\n  - @graphql-codegen/typescript@2.8.1\n\n## 2.7.5\n\n### Patch Changes\n\n- Updated dependencies [[`a46b8d99c`](https://github.com/dotansimha/graphql-code-generator/commit/a46b8d99c797283d773ec14163c62be9c84d4c2b)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.0\n  - @graphql-codegen/typescript@2.7.5\n\n## 2.7.4\n\n### Patch Changes\n\n- Updated dependencies [[`1bd7f771c`](https://github.com/dotansimha/graphql-code-generator/commit/1bd7f771ccb949a5a37395c7c57cb41c19340714)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.2\n  - @graphql-codegen/typescript@2.7.4\n\n## 2.7.3\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f), [`47d0a57e2`](https://github.com/dotansimha/graphql-code-generator/commit/47d0a57e27dd0d2334670bfc6c81c45e00ff4e74)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.1\n  - @graphql-codegen/typescript@2.7.3\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 2.7.2\n\n### Patch Changes\n\n- Updated dependencies [2cbcbb371]\n  - @graphql-codegen/visitor-plugin-common@2.12.0\n  - @graphql-codegen/plugin-helpers@2.6.0\n  - @graphql-codegen/typescript@2.7.2\n\n## 2.7.1\n\n### Patch Changes\n\n- 525ad580b: Revert breaking change for Next.js applications that are incapable of resolving an import with a `.js` extension.\n- Updated dependencies [525ad580b]\n  - @graphql-codegen/visitor-plugin-common@2.11.1\n  - @graphql-codegen/typescript@2.7.1\n\n## 2.7.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [68bb30e19]\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/visitor-plugin-common@2.11.0\n  - @graphql-codegen/typescript@2.7.0\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 2.6.7\n\n### Patch Changes\n\n- Updated dependencies [aa1e6eafd]\n- Updated dependencies [a42fcbfe4]\n- Updated dependencies [8b10f22be]\n  - @graphql-codegen/typescript@2.6.0\n  - @graphql-codegen/visitor-plugin-common@2.10.0\n\n## 2.6.6\n\n### Patch Changes\n\n- Updated dependencies [d16bebacb]\n  - @graphql-codegen/visitor-plugin-common@2.9.1\n  - @graphql-codegen/typescript@2.5.1\n\n## 2.6.5\n\n### Patch Changes\n\n- Updated dependencies [c3d7b7226]\n  - @graphql-codegen/visitor-plugin-common@2.9.0\n  - @graphql-codegen/typescript@2.5.0\n\n## 2.6.4\n\n### Patch Changes\n\n- Updated dependencies [f1fb77bd4]\n  - @graphql-codegen/visitor-plugin-common@2.8.0\n  - @graphql-codegen/typescript@2.4.11\n\n## 2.6.3\n\n### Patch Changes\n\n- Updated dependencies [9a5f31cb6]\n  - @graphql-codegen/typescript@2.4.10\n  - @graphql-codegen/visitor-plugin-common@2.7.6\n\n## 2.6.2\n\n### Patch Changes\n\n- Updated dependencies [2966686e9]\n  - @graphql-codegen/visitor-plugin-common@2.7.5\n  - @graphql-codegen/typescript@2.4.9\n\n## 2.6.1\n\n### Patch Changes\n\n- 337fd4f77: WP: [typescript-resolvers] Add directiveContextTypes option\n- Updated dependencies [337fd4f77]\n  - @graphql-codegen/visitor-plugin-common@2.7.4\n  - @graphql-codegen/typescript@2.4.8\n\n## 2.6.0\n\n### Minor Changes\n\n- a3b348cd7: feat(resolvers): add factory signature to 'selectionSet' param of stitching resolvers\n\n## 2.5.4\n\n### Patch Changes\n\n- Updated dependencies [54718c039]\n  - @graphql-codegen/typescript@2.4.7\n  - @graphql-codegen/visitor-plugin-common@2.7.3\n\n## 2.5.3\n\n### Patch Changes\n\n- 1f5aaf097: Fix #7566 external resolver name export for directiveResolverMappings\n- Updated dependencies [11d05e361]\n  - @graphql-codegen/visitor-plugin-common@2.7.2\n  - @graphql-codegen/typescript@2.4.6\n\n## 2.5.2\n\n### Patch Changes\n\n- Updated dependencies [fd55e2039]\n  - @graphql-codegen/visitor-plugin-common@2.7.1\n  - @graphql-codegen/typescript@2.4.5\n\n## 2.5.1\n\n### Patch Changes\n\n- Updated dependencies [1479233df]\n  - @graphql-codegen/visitor-plugin-common@2.7.0\n  - @graphql-codegen/typescript@2.4.4\n\n## 2.5.0\n\n### Minor Changes\n\n- bef4376d5: fix: RequireFields generic making all other fields optional\n\n### Patch Changes\n\n- c8ef37ae0: fix(typescript-resolvers): Fix optional field types\n- Updated dependencies [c8ef37ae0]\n- Updated dependencies [754a33715]\n- Updated dependencies [bef4376d5]\n- Updated dependencies [be7cb3a82]\n  - @graphql-codegen/visitor-plugin-common@2.6.0\n  - @graphql-codegen/plugin-helpers@2.4.0\n  - @graphql-codegen/typescript@2.4.3\n\n## 2.4.3\n\n### Patch Changes\n\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/visitor-plugin-common@2.5.2\n  - @graphql-codegen/typescript@2.4.2\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 2.4.2\n\n### Patch Changes\n\n- Updated dependencies [a9f1f1594]\n- Updated dependencies [9ea6621ec]\n  - @graphql-codegen/visitor-plugin-common@2.5.1\n  - @graphql-codegen/typescript@2.4.1\n\n## 2.4.1\n\n### Patch Changes\n\n- 3d57ec666: loosen return type of SubscriptionSubscribeFn from `PromiseOrValue<AsyncIterator>` to `PromiseOrValue<AsyncIterable>`. This fixes type conflicts with libraries such as `ix/asynciterable` and is what `graphql-js` expects.\n\n## 2.4.0\n\n### Minor Changes\n\n- 97ddb487a: feat: GraphQL v16 compatibility\n\n### Patch Changes\n\n- Updated dependencies [97ddb487a]\n  - @graphql-codegen/visitor-plugin-common@2.5.0\n  - @graphql-codegen/typescript@2.3.0\n  - @graphql-codegen/plugin-helpers@2.3.0\n\n## 2.3.2\n\n### Patch Changes\n\n- Updated dependencies [ad02cb9b8]\n  - @graphql-codegen/visitor-plugin-common@2.4.0\n  - @graphql-codegen/typescript@2.2.4\n\n## 2.3.1\n\n### Patch Changes\n\n- Updated dependencies [b9e85adae]\n- Updated dependencies [7c60e5acc]\n- Updated dependencies [3c2c847be]\n  - @graphql-codegen/visitor-plugin-common@2.3.0\n  - @graphql-codegen/plugin-helpers@2.2.0\n  - @graphql-codegen/typescript@2.2.3\n\n## 2.3.0\n\n### Minor Changes\n\n- 46b38d9c1: Add makeResolverTypeCallable property to config which allows a resolver function to be called\n\n## 2.2.1\n\n### Patch Changes\n\n- Updated dependencies [0b090e31a]\n  - @graphql-codegen/visitor-plugin-common@2.2.1\n  - @graphql-codegen/typescript@2.2.2\n\n## 2.2.0\n\n### Minor Changes\n\n- 5086791ac: Allow overwriting the resolver type signature based on directive usages.\n\n  **WARNING:** Using this option does only change the generated type definitions.\n\n  For actually ensuring that a type is correct at runtime you will have to use schema transforms (e.g. with [@graphql-tools/utils mapSchema](https://www.graphql-tools.com/docs/schema-directives)) that apply those rules! Otherwise, you might end up with a runtime type mismatch which could cause unnoticed bugs or runtime errors.\n\n  Example configuration:\n\n  ```yaml\n  config:\n    # This was possible before\n    customResolverFn: ../resolver-types.ts#UnauthenticatedResolver\n    # This is new\n    directiveResolverMappings:\n      authenticated: ../resolvers-types.ts#AuthenticatedResolver\n  ```\n\n  Example mapping file (`resolver-types.ts`):\n\n  ```ts\n  export type UnauthenticatedContext = {\n    user: null\n  }\n\n  export type AuthenticatedContext = {\n    user: { id: string }\n  }\n\n  export type UnauthenticatedResolver<TResult, TParent, _TContext, TArgs> = (\n    parent: TParent,\n    args: TArgs,\n    context: UnauthenticatedContext,\n    info: GraphQLResolveInfo\n  ) => Promise<TResult> | TResult\n\n  export type AuthenticatedResolver<TResult, TParent, _TContext, TArgs> = (\n    parent: TParent,\n    args: TArgs,\n    context: AuthenticatedContext,\n    info: GraphQLResolveInfo\n  ) => Promise<TResult> | TResult\n  ```\n\n  Example Schema:\n\n  ```graphql\n  directive @authenticated on FIELD_DEFINITION\n\n  type Query {\n    yee: String\n    foo: String @authenticated\n  }\n  ```\n\n### Patch Changes\n\n- Updated dependencies [d6c2d4c09]\n- Updated dependencies [feeae1c66]\n- Updated dependencies [8261e4161]\n- Updated dependencies [5086791ac]\n  - @graphql-codegen/visitor-plugin-common@2.2.0\n  - @graphql-codegen/typescript@2.2.0\n\n## 2.1.2\n\n### Patch Changes\n\n- Updated dependencies [6470e6cc9]\n- Updated dependencies [263570e50]\n- Updated dependencies [35199dedf]\n  - @graphql-codegen/visitor-plugin-common@2.1.2\n  - @graphql-codegen/plugin-helpers@2.1.1\n  - @graphql-codegen/typescript@2.1.2\n\n## 2.1.1\n\n### Patch Changes\n\n- Updated dependencies [aabeff181]\n  - @graphql-codegen/visitor-plugin-common@2.1.1\n  - @graphql-codegen/typescript@2.1.1\n\n## 2.1.0\n\n### Minor Changes\n\n- 39773f59b: enhance(plugins): use getDocumentNodeFromSchema and other utilities from @graphql-tools/utils\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- 24185985a: bump graphql-tools package versions\n- 440172cfe: export config types\n- Updated dependencies [290170262]\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/visitor-plugin-common@2.1.0\n  - @graphql-codegen/plugin-helpers@2.1.0\n  - @graphql-codegen/typescript@2.1.0\n\n## 2.0.0\n\n### Major Changes\n\n- d80efdec4: Set `noSchemaStitching: true` by default.\n\n  If you need the resolvers signature to support schema-stitching, please add to your config:\n\n  ```yaml\n  noSchemaStitching: false\n  ```\n\n- d80efdec4: Remove deprecated `IDirectiveResolvers` and `IResolvers` signatures\n\n  Please use `DirectiveResolvers` and `Resolvers` types instead.\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- Updated dependencies [d80efdec4]\n- Updated dependencies [d80efdec4]\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/visitor-plugin-common@2.0.0\n  - @graphql-codegen/typescript@2.0.0\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 1.20.0\n\n### Minor Changes\n\n- 8e4d5826: Add a new type for StitchResolver without selectionSet\n- 9005cc17: add `allowEnumStringTypes` option for allowing string literals as valid return types from resolvers in addition to enum values.\\_\n\n### Patch Changes\n\n- df19a4ed: Allow multiple `{T}` instances in defaultMapper\n- Updated dependencies [df19a4ed]\n- Updated dependencies [470336a1]\n- Updated dependencies [9005cc17]\n  - @graphql-codegen/visitor-plugin-common@1.22.0\n  - @graphql-codegen/plugin-helpers@1.18.8\n  - @graphql-codegen/typescript@1.23.0\n\n## 1.19.5\n\n### Patch Changes\n\n- Updated dependencies [6762aff5]\n  - @graphql-codegen/visitor-plugin-common@1.21.3\n  - @graphql-codegen/typescript@1.22.4\n\n## 1.19.4\n\n### Patch Changes\n\n- Updated dependencies [6aaecf1c]\n  - @graphql-codegen/visitor-plugin-common@1.21.2\n  - @graphql-codegen/typescript@1.22.3\n\n## 1.19.3\n\n### Patch Changes\n\n- Updated dependencies [cf1e5abc]\n  - @graphql-codegen/visitor-plugin-common@1.21.1\n  - @graphql-codegen/typescript@1.22.2\n\n## 1.19.2\n\n### Patch Changes\n\n- dfd25caf: chore(deps): bump graphql-tools versions\n- Updated dependencies [dfd25caf]\n- Updated dependencies [8da7dff6]\n  - @graphql-codegen/visitor-plugin-common@1.21.0\n  - @graphql-codegen/plugin-helpers@1.18.7\n  - @graphql-codegen/typescript@1.22.1\n\n## 1.19.1\n\n### Patch Changes\n\n- d9212aa0: fix(visitor-plugin-common): guard for a runtime type error\n- Updated dependencies [d9212aa0]\n- Updated dependencies [f0b5ea53]\n- Updated dependencies [097bea2f]\n  - @graphql-codegen/visitor-plugin-common@1.20.0\n  - @graphql-codegen/typescript@1.22.0\n  - @graphql-codegen/plugin-helpers@1.18.5\n\n## 1.19.0\n\n### Minor Changes\n\n- d4942d04: NEW CONFIG (`onlyResolveTypeForInterfaces`): Allow to generate only \\_\\_resolveType for interfaces\n\n### Patch Changes\n\n- 29b75b1e: enhance(namingConvention): use change-case-all instead of individual packages for naming convention\n- Updated dependencies [e947f8e3]\n- Updated dependencies [29b75b1e]\n- Updated dependencies [d4942d04]\n- Updated dependencies [1f6f3db6]\n- Updated dependencies [29b75b1e]\n  - @graphql-codegen/visitor-plugin-common@1.19.0\n  - @graphql-codegen/typescript@1.21.1\n  - @graphql-codegen/plugin-helpers@1.18.3\n\n## 1.18.2\n\n### Patch Changes\n\n- 5749cb8a: chore: fix type-level incompatibilities of the `avoidOptionals`\n- Updated dependencies [34b8087e]\n- Updated dependencies [5749cb8a]\n- Updated dependencies [5a12fe58]\n  - @graphql-codegen/typescript@1.21.0\n  - @graphql-codegen/visitor-plugin-common@1.18.3\n\n## 1.18.1\n\n### Patch Changes\n\n- fd5843a7: Fixed a bug where some import namespacing is missed when generating resolver types.\n- Updated dependencies [64293437]\n- Updated dependencies [fd5843a7]\n- Updated dependencies [d75051f5]\n  - @graphql-codegen/visitor-plugin-common@1.17.22\n\n## 1.18.0\n\n### Minor Changes\n\n- 8356f8a2: Added a new config flag for customizing `isTypeOf` and `resolveType` prefix (`internalResolversPrefix`)\n\n### Patch Changes\n\n- Updated dependencies [8356f8a2]\n- Updated dependencies [1d6a593f]\n  - @graphql-codegen/visitor-plugin-common@1.17.21\n  - @graphql-codegen/typescript@1.19.0\n\n## 1.17.12\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/visitor-plugin-common@1.17.20\n  - @graphql-codegen/typescript@1.18.1\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 1.17.11\n\n### Patch Changes\n\n- faa13973: Fixed issues with mappers setup\n- Updated dependencies [faa13973]\n  - @graphql-codegen/visitor-plugin-common@1.17.18\n\n## 1.17.10\n\n### Patch Changes\n\n- d2cde3d5: fixed isTypeOf resolvers signature\n- 89a6aa80: Fixes issues with typesSuffix and arguments type name\n- Updated dependencies [d2cde3d5]\n- Updated dependencies [89a6aa80]\n- Updated dependencies [f603b8f8]\n- Updated dependencies [7ad7a1ae]\n- Updated dependencies [da8bdd17]\n  - @graphql-codegen/visitor-plugin-common@1.17.15\n  - @graphql-codegen/typescript@1.17.10\n  - @graphql-codegen/plugin-helpers@1.17.9\n\n## 1.17.9\n\n### Patch Changes\n\n- ed7f6b97: Fix issues with mappers not being applied for interfaces or unions\n\n## 1.17.8\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- af3803b8: only transform federated parent types when they contain @external directive\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n  - @graphql-codegen/visitor-plugin-common@1.17.13\n  - @graphql-codegen/plugin-helpers@1.17.8\n  - @graphql-codegen/typescript@1.17.8\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/typescript-resolvers\",\n  \"version\": \"5.1.7\",\n  \"description\": \"GraphQL Code Generator plugin for generating TypeScript types for resolvers signature\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/plugins/typescript/resolvers\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"^6.1.1\",\n    \"@graphql-codegen/typescript\": \"^5.0.9\",\n    \"@graphql-codegen/visitor-plugin-common\": \"^6.2.4\",\n    \"@graphql-tools/utils\": \"^11.0.0\",\n    \"auto-bind\": \"~4.0.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\",\n    \"graphql-sock\": \"^1.0.0\"\n  },\n  \"peerDependenciesMeta\": {\n    \"graphql-sock\": {\n      \"optional\": true\n    }\n  },\n  \"devDependencies\": {\n    \"graphql-subscriptions\": \"3.0.0\",\n    \"graphql-sock\": \"1.0.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/src/config.ts",
    "content": "import { RawResolversConfig } from '@graphql-codegen/visitor-plugin-common';\n\n/**\n * @description This plugin generates TypeScript signature for `resolve` functions of your GraphQL API.\n * You can use this plugin to generate simple resolvers signature based on your GraphQL types, or you can change its behavior be providing custom model types (mappers).\n *\n * You can find a blog post explaining the usage of this plugin here: https://the-guild.dev/blog/better-type-safety-for-resolvers-with-graphql-codegen\n *\n */\nexport interface TypeScriptResolversPluginConfig extends RawResolversConfig {\n  /**\n   * @description Adds an index signature to any generates resolver.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-resolvers'],\n   *        config: {\n   *          useIndexSignature: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  useIndexSignature?: boolean;\n  /**\n   * @description Disables/Enables Schema Stitching support.\n   * By default, the resolver signature does not include the support for schema-stitching.\n   * Set to `false` to enable that.\n   *\n   * @default true\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-resolvers'],\n   *        config: {\n   *          noSchemaStitching: false\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  noSchemaStitching?: boolean;\n  /**\n   * @description Set to `true` in order to wrap field definitions with `FieldWrapper`.\n   * This is useful to allow return types such as Promises and functions. Needed for\n   * compatibility with `federation: true` when\n   * @default true\n   */\n  wrapFieldDefinitions?: boolean;\n  /**\n   * @description You can provide your custom GraphQLResolveInfo instead of the default one from graphql-js\n   * @default \"graphql#GraphQLResolveInfo\"\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-resolvers'],\n   *        config: {\n   *          customResolveInfo: './my-types#MyResolveInfo'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  customResolveInfo?: string;\n  /**\n   * @description You can provide your custom ResolveFn instead the default. It has to be a type that uses the generics `<TResult, TParent, TContext, TArgs>`\n   * @default \"(parent: TParent, args: TArgs, context: TContext, info: GraphQLResolveInfo) => Promise<TResult> | TResult\"\n   *\n   * @exampleMarkdown\n   * ## Custom Signature\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-resolvers'],\n   *        config: {\n   *          customResolverFn: './my-types#MyResolveFn'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ## With Graphile\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-resolvers'],\n   *        config: {\n   *          customResolverFn: './my-types#MyResolveFn'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      \"path/to/file.ts\": {\n   *        \"plugins\": [\n   *            {\n   *                \"add\": {\n   *                    \"content\": \"import { GraphileHelpers } from 'graphile-utils/node8plus/fieldHelpers';\"\n   *                }\n   *            },\n   *            \"typescript\",\n   *            \"typescript-resolvers\"\n   *        ],\n   *        \"config\": {\n   *            \"customResolverFn\": \"(\\n  parent: TParent,\\n  args: TArgs,\\n  context: TContext,\\n  info: GraphQLResolveInfo & { graphile: GraphileHelpers<TParent> }\\n) => Promise<TResult> | TResult;\\n\"\n   *        }\n   *      }\n   *    }\n   *  };\n   *  export default config;\n   * ```\n   *\n   */\n  customResolverFn?: string;\n  /**\n   * @description Map the usage of a directive into using a specific resolver.\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-resolvers'],\n   *        config: {\n   *          customResolverFn: '../resolver-types.ts#UnauthenticatedResolver',\n   *          directiveResolverMappings: {\n   *            authenticated: '../resolvers-types.ts#AuthenticatedResolver',\n   *          },\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  directiveResolverMappings?: Record<string, string>;\n  /**\n   * @description Allow you to override the `ParentType` generic in each resolver, by avoid enforcing the base type of the generated generic type.\n   *\n   * This will generate `ParentType = Type` instead of `ParentType extends Type = Type` in each resolver.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-resolvers'],\n   *        config: {\n   *          allowParentTypeOverride: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   */\n  allowParentTypeOverride?: boolean;\n  /**\n   * @description Sets `info` argument of resolver function to be optional field. Useful for testing.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-resolvers'],\n   *        config: {\n   *          optionalInfoArgument: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   *\n   */\n  optionalInfoArgument?: boolean;\n  /**\n   * @description Set to `true` in order to allow the Resolver type to be callable\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-resolvers'],\n   *        config: {\n   *          makeResolverTypeCallable: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  makeResolverTypeCallable?: boolean;\n}\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/src/index.ts",
    "content": "import {\n  addFederationReferencesToSchema,\n  getCachedDocumentNodeFromSchema,\n  oldVisit,\n  PluginFunction,\n  Types,\n} from '@graphql-codegen/plugin-helpers';\nimport { parseMapper, type RootResolver } from '@graphql-codegen/visitor-plugin-common';\nimport { GraphQLSchema } from 'graphql';\nimport { TypeScriptResolversPluginConfig } from './config.js';\nimport { TypeScriptResolversVisitor } from './visitor.js';\n\nconst capitalize = (s: string): string => s.charAt(0).toUpperCase() + s.slice(1);\n\nexport const plugin: PluginFunction<\n  TypeScriptResolversPluginConfig,\n  Types.ComplexPluginOutput<{\n    generatedResolverTypes: RootResolver['generatedResolverTypes'];\n  }>\n> = async (schema: GraphQLSchema, documents: Types.DocumentFile[], config: TypeScriptResolversPluginConfig) => {\n  const imports = [];\n  if (!config.customResolveInfo) {\n    imports.push('GraphQLResolveInfo');\n  }\n  const showUnusedMappers = typeof config.showUnusedMappers === 'boolean' ? config.showUnusedMappers : true;\n  const noSchemaStitching = typeof config.noSchemaStitching === 'boolean' ? config.noSchemaStitching : true;\n\n  const indexSignature = config.useIndexSignature\n    ? [\n        'export type WithIndex<TObject> = TObject & Record<string, any>;',\n        'export type ResolversObject<TObject> = WithIndex<TObject>;',\n      ].join('\\n')\n    : '';\n  const importType = config.useTypeImports ? 'import type' : 'import';\n  const emptyObjectType = `Record<PropertyKey, never>`;\n  const prepend: string[] = [];\n  const defsToInclude: string[] = [];\n  const directiveResolverMappings = {} as Record<string, string>;\n\n  if (config.directiveResolverMappings) {\n    for (const [directiveName, mapper] of Object.entries(config.directiveResolverMappings)) {\n      const parsedMapper = parseMapper(mapper);\n      const capitalizedDirectiveName = capitalize(directiveName);\n      const resolverFnName = `ResolverFn${capitalizedDirectiveName}`;\n      const resolverFnUsage = `${resolverFnName}<TResult, TParent, TContext, TArgs>`;\n      const resolverWithResolveUsage = `Resolver${capitalizedDirectiveName}WithResolve<TResult, TParent, TContext, TArgs>`;\n      const resolverWithResolve = `\nexport type Resolver${capitalizedDirectiveName}WithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ${resolverFnName}<TResult, TParent, TContext, TArgs>;\n};`;\n      const resolverTypeName = `Resolver${capitalizedDirectiveName}`;\n      const resolverType = `export type ${resolverTypeName}<TResult, TParent = ${emptyObjectType}, TContext = ${emptyObjectType}, TArgs = ${emptyObjectType}> =`;\n\n      if (parsedMapper.isExternal) {\n        if (parsedMapper.default) {\n          prepend.push(`${importType} ${resolverFnName} from '${parsedMapper.source}';`);\n        } else {\n          prepend.push(\n            `${importType} { ${parsedMapper.import} ${\n              parsedMapper.import === resolverFnName ? '' : `as ${resolverFnName} `\n            }} from '${parsedMapper.source}';`\n          );\n        }\n        prepend.push(`export${config.useTypeImports ? ' type' : ''} { ${resolverFnName} };`);\n      } else {\n        defsToInclude.push(`export type ${resolverFnName}<TResult, TParent, TContext, TArgs> = ${parsedMapper.type}`);\n      }\n\n      if (config.makeResolverTypeCallable) {\n        defsToInclude.push(`${resolverType} ${resolverFnUsage};`);\n      } else {\n        defsToInclude.push(resolverWithResolve, `${resolverType} ${resolverFnUsage} | ${resolverWithResolveUsage};`);\n      }\n\n      directiveResolverMappings[directiveName] = resolverTypeName;\n    }\n  }\n\n  let { transformedSchema, federationMeta } = config.federation\n    ? addFederationReferencesToSchema(schema)\n    : { transformedSchema: schema, federationMeta: {} };\n\n  transformedSchema = config.customDirectives?.semanticNonNull\n    ? await semanticToStrict(transformedSchema)\n    : transformedSchema;\n\n  const visitor = new TypeScriptResolversVisitor(\n    { ...config, directiveResolverMappings },\n    transformedSchema,\n    federationMeta\n  );\n\n  const namespacedImportPrefix = visitor.config.namespacedImportName ? `${visitor.config.namespacedImportName}.` : '';\n\n  const astNode = getCachedDocumentNodeFromSchema(transformedSchema);\n\n  // runs visitor\n  const visitorResult = oldVisit(astNode, { leave: visitor });\n\n  const optionalSignForInfoArg = visitor.config.optionalInfoArgument ? '?' : '';\n  const legacyStitchingResolverType = `\nexport type LegacyStitchingResolver<TResult, TParent, TContext, TArgs> = {\n  fragment: string;\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};`;\n  const newStitchingResolverType = `\nexport type NewStitchingResolver<TResult, TParent, TContext, TArgs> = {\n  selectionSet: string | ((fieldNode: FieldNode) => SelectionSetNode);\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};`;\n  const stitchingResolverType = `export type StitchingResolver<TResult, TParent, TContext, TArgs> = LegacyStitchingResolver<TResult, TParent, TContext, TArgs> | NewStitchingResolver<TResult, TParent, TContext, TArgs>;`;\n  const resolverWithResolve = `\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};`;\n  const resolverType = `export type Resolver<TResult, TParent = ${emptyObjectType}, TContext = ${emptyObjectType}, TArgs = ${emptyObjectType}> =`;\n  const resolverFnUsage = `ResolverFn<TResult, TParent, TContext, TArgs>`;\n  const resolverWithResolveUsage = `ResolverWithResolve<TResult, TParent, TContext, TArgs>`;\n  const stitchingResolverUsage = `StitchingResolver<TResult, TParent, TContext, TArgs>`;\n\n  if (visitor.hasFederation()) {\n    defsToInclude.push(\n      `export type ReferenceResolver<TResult, TReference, TContext> = (\n      reference: TReference,\n      context: TContext,\n      info${optionalSignForInfoArg}: GraphQLResolveInfo\n    ) => Promise<TResult> | TResult;`,\n      `\n      type ScalarCheck<T, S> = S extends true ? T : NullableCheck<T, S>;\n      type NullableCheck<T, S> = ${namespacedImportPrefix}Maybe<T> extends T ? ${namespacedImportPrefix}Maybe<ListCheck<NonNullable<T>, S>> : ListCheck<T, S>;\n      type ListCheck<T, S> = T extends (infer U)[] ? NullableCheck<U, S>[] : GraphQLRecursivePick<T, S>;\n      export type GraphQLRecursivePick<T, S> = { [K in keyof T & keyof S]: ScalarCheck<T[K], S[K]> };\n    `\n    );\n  }\n\n  if (!config.makeResolverTypeCallable) {\n    defsToInclude.push(resolverWithResolve);\n  }\n\n  if (noSchemaStitching) {\n    const defs = config.makeResolverTypeCallable\n      ? // Resolver = ResolverFn\n        `${resolverType} ${resolverFnUsage};`\n      : // Resolver = ResolverFn | ResolverWithResolve\n        `${resolverType} ${resolverFnUsage} | ${resolverWithResolveUsage};`;\n    defsToInclude.push(defs);\n  } else {\n    // StitchingResolver\n    // Resolver =\n    // | ResolverFn\n    // | ResolverWithResolve\n    // | StitchingResolver;\n    defsToInclude.push(\n      [\n        legacyStitchingResolverType,\n        newStitchingResolverType,\n        stitchingResolverType,\n        resolverType,\n        `  | ${resolverFnUsage}`,\n        config.makeResolverTypeCallable ? `` : `  | ${resolverWithResolveUsage}`,\n        `  | ${stitchingResolverUsage};`,\n      ].join('\\n')\n    );\n    imports.push('SelectionSetNode', 'FieldNode');\n  }\n\n  if (config.customResolverFn) {\n    const parsedMapper = parseMapper(config.customResolverFn);\n    if (parsedMapper.isExternal) {\n      if (parsedMapper.default) {\n        prepend.push(`${importType} ResolverFn from '${parsedMapper.source}';`);\n      } else {\n        prepend.push(\n          `${importType} { ${parsedMapper.import} ${\n            parsedMapper.import === 'ResolverFn' ? '' : 'as ResolverFn '\n          }} from '${parsedMapper.source}';`\n        );\n      }\n      prepend.push(`export${config.useTypeImports ? ' type' : ''} { ResolverFn };`);\n    } else {\n      prepend.push(`export type ResolverFn<TResult, TParent, TContext, TArgs> = ${parsedMapper.type}`);\n    }\n  } else {\n    const defaultResolverFn = `\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info${optionalSignForInfoArg}: GraphQLResolveInfo\n) => Promise<TResult> | TResult;`;\n\n    defsToInclude.push(defaultResolverFn);\n  }\n\n  const header = `${indexSignature}\n\n${visitor.getResolverTypeWrapperSignature()}\n\n${defsToInclude.join('\\n')}\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info${optionalSignForInfoArg}: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info${optionalSignForInfoArg}: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<TResult, TKey extends string, TParent = ${emptyObjectType}, TContext = ${emptyObjectType}, TArgs = ${emptyObjectType}> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = ${emptyObjectType}, TContext = ${emptyObjectType}> = (\n  parent: TParent,\n  context: TContext,\n  info${optionalSignForInfoArg}: GraphQLResolveInfo\n) => ${namespacedImportPrefix}Maybe<TTypes> | Promise<${namespacedImportPrefix}Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = ${emptyObjectType}, TContext = ${emptyObjectType}> = (obj: T, context: TContext, info${optionalSignForInfoArg}: GraphQLResolveInfo) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<TResult = ${emptyObjectType}, TParent = ${emptyObjectType}, TContext = ${emptyObjectType}, TArgs = ${emptyObjectType}> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info${optionalSignForInfoArg}: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n`;\n\n  const federationTypes = visitor.buildFederationTypes();\n  const federationReferenceTypes = visitor.buildFederationReferenceTypes();\n  const resolversTypeMapping = visitor.buildResolversTypes();\n  const resolversParentTypeMapping = visitor.buildResolversParentTypes();\n  const resolversUnionTypesMapping = visitor.buildResolversUnionTypes();\n  const resolversInterfaceTypesMapping = visitor.buildResolversInterfaceTypes();\n  const { getRootResolver, getAllDirectiveResolvers, mappersImports, unusedMappers, hasScalars } = visitor;\n\n  if (hasScalars()) {\n    imports.push('GraphQLScalarType', 'GraphQLScalarTypeConfig');\n  }\n\n  if (showUnusedMappers && unusedMappers.length) {\n    // eslint-disable-next-line no-console\n    console.warn(`Unused mappers: ${unusedMappers.join(',')}`);\n  }\n\n  if (imports.length) {\n    prepend.push(`${importType} { ${imports.join(', ')} } from 'graphql';`);\n  }\n\n  if (config.customResolveInfo) {\n    const parsedMapper = parseMapper(config.customResolveInfo);\n    if (parsedMapper.isExternal) {\n      if (parsedMapper.default) {\n        prepend.push(`${importType} GraphQLResolveInfo from '${parsedMapper.source}'`);\n      }\n      prepend.push(\n        `${importType} { ${parsedMapper.import} ${\n          parsedMapper.import === 'GraphQLResolveInfo' ? '' : 'as GraphQLResolveInfo'\n        } } from '${parsedMapper.source}';`\n      );\n    } else {\n      prepend.push(`type GraphQLResolveInfo = ${parsedMapper.type}`);\n    }\n  }\n\n  prepend.push(...mappersImports, ...visitor.globalDeclarations);\n\n  const rootResolver = getRootResolver();\n\n  return {\n    prepend,\n    content: [\n      header,\n      federationTypes,\n      federationReferenceTypes,\n      resolversUnionTypesMapping,\n      resolversInterfaceTypesMapping,\n      resolversTypeMapping,\n      resolversParentTypeMapping,\n      ...visitorResult.definitions.filter(d => typeof d === 'string'),\n      rootResolver.content,\n      getAllDirectiveResolvers(),\n    ].join('\\n'),\n    meta: {\n      generatedResolverTypes: rootResolver.generatedResolverTypes,\n    },\n  };\n};\n\nexport { TypeScriptResolversPluginConfig, TypeScriptResolversVisitor };\n\nconst semanticToStrict = async (schema: GraphQLSchema): Promise<GraphQLSchema> => {\n  try {\n    const sock = await import('graphql-sock');\n    return sock.semanticToStrict(schema);\n  } catch {\n    throw new Error(\n      \"To use the `customDirective.semanticNonNull` option, you must install the 'graphql-sock' package.\"\n    );\n  }\n};\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/src/visitor.ts",
    "content": "import { TypeScriptOperationVariablesToObject } from '@graphql-codegen/typescript';\nimport {\n  BaseResolversVisitor,\n  DeclarationKind,\n  DEFAULT_SCALARS,\n  getConfigValue,\n  normalizeAvoidOptionals,\n  ParsedResolversConfig,\n} from '@graphql-codegen/visitor-plugin-common';\nimport type { FederationMeta } from '@graphql-codegen/plugin-helpers';\nimport autoBind from 'auto-bind';\nimport { EnumTypeDefinitionNode, GraphQLSchema, ListTypeNode, NamedTypeNode, NonNullTypeNode } from 'graphql';\nimport { TypeScriptResolversPluginConfig } from './config.js';\n\nexport const ENUM_RESOLVERS_SIGNATURE =\n  'export type EnumResolverSignature<T, AllowedValues = any> = { [key in keyof T]?: AllowedValues };';\n\nexport interface ParsedTypeScriptResolversConfig extends ParsedResolversConfig {\n  useIndexSignature: boolean;\n  wrapFieldDefinitions: boolean;\n  allowParentTypeOverride: boolean;\n  optionalInfoArgument: boolean;\n}\n\nexport class TypeScriptResolversVisitor extends BaseResolversVisitor<\n  TypeScriptResolversPluginConfig,\n  ParsedTypeScriptResolversConfig\n> {\n  constructor(pluginConfig: TypeScriptResolversPluginConfig, schema: GraphQLSchema, federationMeta: FederationMeta) {\n    super(\n      pluginConfig,\n      {\n        avoidOptionals: normalizeAvoidOptionals(pluginConfig.avoidOptionals),\n        useIndexSignature: getConfigValue(pluginConfig.useIndexSignature, false),\n        wrapFieldDefinitions: getConfigValue(pluginConfig.wrapFieldDefinitions, false),\n        allowParentTypeOverride: getConfigValue(pluginConfig.allowParentTypeOverride, false),\n        optionalInfoArgument: getConfigValue(pluginConfig.optionalInfoArgument, false),\n      } as ParsedTypeScriptResolversConfig,\n      schema,\n      DEFAULT_SCALARS,\n      federationMeta\n    );\n    autoBind(this);\n    this.setVariablesTransformer(\n      new TypeScriptOperationVariablesToObject(\n        this.scalars,\n        this.convertName,\n        this.config.avoidOptionals,\n        this.config.immutableTypes,\n        this.config.namespacedImportName,\n        [],\n        this.config.enumPrefix,\n        this.config.enumSuffix,\n        this.config.enumValues\n      )\n    );\n\n    if (this.config.useIndexSignature) {\n      this._declarationBlockConfig = {\n        blockTransformer(block) {\n          return `ResolversObject<${block}>`;\n        },\n      };\n    }\n  }\n\n  protected transformParentGenericType(parentType: string): string {\n    if (this.config.allowParentTypeOverride) {\n      return `ParentType = ${parentType}`;\n    }\n\n    return `ParentType extends ${parentType} = ${parentType}`;\n  }\n\n  protected formatRootResolver(schemaTypeName: string, resolverType: string, declarationKind: DeclarationKind): string {\n    const avoidOptionals = this.config.avoidOptionals.resolvers;\n    return `${schemaTypeName}${avoidOptionals ? '' : '?'}: ${resolverType}${this.getPunctuation(declarationKind)}`;\n  }\n\n  private clearOptional(str: string): string {\n    if (str.startsWith('Maybe')) {\n      return str.replace(/Maybe<(.*?)>$/, '$1');\n    }\n\n    return str;\n  }\n\n  ListType(node: ListTypeNode): string {\n    return `Maybe<${super.ListType(node)}>`;\n  }\n\n  protected wrapWithListType(str: string): string {\n    return `${this.config.immutableTypes ? 'ReadonlyArray' : 'Array'}<${str}>`;\n  }\n\n  NamedType(node: NamedTypeNode): string {\n    return `Maybe<${super.NamedType(node)}>`;\n  }\n\n  NonNullType(node: NonNullTypeNode): string {\n    const baseValue = super.NonNullType(node);\n\n    return this.clearOptional(baseValue);\n  }\n\n  protected getPunctuation(_declarationKind: DeclarationKind): string {\n    return ';';\n  }\n\n  protected buildEnumResolverContentBlock(node: EnumTypeDefinitionNode, mappedEnumType: string): string {\n    const valuesMap = `{ ${(node.values || [])\n      .map(v => `${v.name.value}${this.config.avoidOptionals.resolvers ? '' : '?'}: any`)\n      .join(', ')} }`;\n\n    this._globalDeclarations.add(ENUM_RESOLVERS_SIGNATURE);\n\n    return `EnumResolverSignature<${valuesMap}, ${mappedEnumType}>`;\n  }\n\n  protected buildEnumResolversExplicitMappedValues(\n    node: EnumTypeDefinitionNode,\n    valuesMapping: { [valueName: string]: string | number }\n  ): string {\n    return `{ ${(node.values || [])\n      .map(v => {\n        const valueName = v.name.value;\n        const mappedValue = valuesMapping[valueName] ?? valueName;\n        const hasMapping = !!valuesMapping[valueName];\n\n        return `${valueName}${hasMapping || this.config.avoidOptionals.resolvers ? '' : '?'}: ${\n          typeof mappedValue === 'number' ? mappedValue : `'${mappedValue}'`\n        }`;\n      })\n      .join(', ')} }`;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/__snapshots__/ts-resolvers.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`TypeScript Resolvers Plugin > Config > allowParentTypeOverride - should allow to have less strict resolvers by overrding parent type 1`] = `\n\"export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\nimport { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql';\nexport type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;\nexport type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string; }\n  String: { input: string; output: string; }\n  Boolean: { input: boolean; output: boolean; }\n  Int: { input: number; output: number; }\n  Float: { input: number; output: number; }\n  MyScalar: { input: any; output: any; }\n};\n\nexport type MyType = {\n  __typename?: 'MyType';\n  foo: Scalars['String']['output'];\n  otherType?: Maybe<MyOtherType>;\n  withArgs?: Maybe<Scalars['String']['output']>;\n  unionChild?: Maybe<ChildUnion>;\n};\n\n\nexport type MyTypeWithArgsArgs = {\n  arg?: InputMaybe<Scalars['String']['input']>;\n  arg2: Scalars['String']['input'];\n};\n\nexport type Child = {\n  __typename?: 'Child';\n  bar: Scalars['String']['output'];\n  parent?: Maybe<MyType>;\n};\n\nexport type MyOtherType = {\n  __typename?: 'MyOtherType';\n  bar: Scalars['String']['output'];\n};\n\nexport type ChildUnion = Child | MyOtherType;\n\nexport type Query = {\n  __typename?: 'Query';\n  something: MyType;\n};\n\nexport type Subscription = {\n  __typename?: 'Subscription';\n  somethingChanged?: Maybe<MyOtherType>;\n};\n\nexport type Node = {\n  id: Scalars['ID']['output'];\n};\n\nexport type SomeNode = Node & {\n  __typename?: 'SomeNode';\n  id: Scalars['ID']['output'];\n};\n\nexport type AnotherNode = {\n  id: Scalars['ID']['output'];\n};\n\nexport type WithChild = {\n  unionChild?: Maybe<ChildUnion>;\n  node?: Maybe<AnotherNode>;\n};\n\nexport type WithChildren = {\n  unionChildren: Array<ChildUnion>;\n  nodes: Array<AnotherNode>;\n};\n\nexport type AnotherNodeWithChild = AnotherNode & WithChild & {\n  __typename?: 'AnotherNodeWithChild';\n  id: Scalars['ID']['output'];\n  unionChild?: Maybe<ChildUnion>;\n  interfaceChild?: Maybe<Node>;\n};\n\nexport type AnotherNodeWithAll = AnotherNode & WithChild & WithChildren & {\n  __typename?: 'AnotherNodeWithAll';\n  id: Scalars['ID']['output'];\n  unionChild?: Maybe<ChildUnion>;\n  unionChildren: Array<ChildUnion>;\n  interfaceChild?: Maybe<Node>;\n  interfaceChildren: Array<Node>;\n};\n\nexport type MyUnion = MyType | MyOtherType;\nexport type WithIndex<TObject> = TObject & Record<string, any>;\nexport type ResolversObject<TObject> = WithIndex<TObject>;\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<TResult, TKey extends string, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<TResult = Record<PropertyKey, never>, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n\n\n/** Mapping of union types */\nexport type ResolversUnionTypes<_RefType extends Record<string, unknown>> = ResolversObject<{\n  ChildUnion:\n    | ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } )\n    | ( MyOtherType )\n  ;\n  MyUnion:\n    | ( Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> } )\n    | ( MyOtherType )\n  ;\n}>;\n\n/** Mapping of interface types */\nexport type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = ResolversObject<{\n  Node: ( SomeNode );\n  AnotherNode:\n    | ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } )\n    | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } )\n  ;\n  WithChild:\n    | ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } )\n    | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } )\n  ;\n  WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n}>;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = ResolversObject<{\n  MyType: ResolverTypeWrapper<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']> }>;\n  String: ResolverTypeWrapper<Scalars['String']['output']>;\n  Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n  MyOtherType: ResolverTypeWrapper<MyOtherType>;\n  ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n  Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n  ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n  SomeNode: ResolverTypeWrapper<SomeNode>;\n  AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n  WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n  WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n  AnotherNodeWithChild: ResolverTypeWrapper<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']> }>;\n  AnotherNodeWithAll: ResolverTypeWrapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n  MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n  MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n  Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n}>;\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = ResolversObject<{\n  MyType: Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']> };\n  String: Scalars['String']['output'];\n  Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n  MyOtherType: MyOtherType;\n  ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n  Query: Record<PropertyKey, never>;\n  Subscription: Record<PropertyKey, never>;\n  Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n  ID: Scalars['ID']['output'];\n  SomeNode: SomeNode;\n  AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n  WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n  WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n  AnotherNodeWithChild: Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']> };\n  AnotherNodeWithAll: Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n  MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n  MyScalar: Scalars['MyScalar']['output'];\n  Int: Scalars['Int']['output'];\n  Boolean: Scalars['Boolean']['output'];\n}>;\n\nexport type MyDirectiveDirectiveArgs = {\n  arg: Scalars['Int']['input'];\n  arg2: Scalars['String']['input'];\n  arg3: Scalars['Boolean']['input'];\n};\n\nexport type MyDirectiveDirectiveResolver<Result, Parent, ContextType = any, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;\n\nexport type AuthenticatedDirectiveArgs = { };\n\nexport type AuthenticatedDirectiveResolver<Result, Parent, ContextType = any, Args = AuthenticatedDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;\n\nexport type MyTypeResolvers<ContextType = any, ParentType = ResolversParentTypes['MyType']> = ResolversObject<{\n  foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n  withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n  unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type ChildResolvers<ContextType = any, ParentType = ResolversParentTypes['Child']> = ResolversObject<{\n  bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  parent?: Resolver<Maybe<ResolversTypes['MyType']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type MyOtherTypeResolvers<ContextType = any, ParentType = ResolversParentTypes['MyOtherType']> = ResolversObject<{\n  bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type ChildUnionResolvers<ContextType = any, ParentType = ResolversParentTypes['ChildUnion']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'Child' | 'MyOtherType', ParentType, ContextType>;\n}>;\n\nexport type QueryResolvers<ContextType = any, ParentType = ResolversParentTypes['Query']> = ResolversObject<{\n  something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n}>;\n\nexport type SubscriptionResolvers<ContextType = any, ParentType = ResolversParentTypes['Subscription']> = ResolversObject<{\n  somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n}>;\n\nexport type NodeResolvers<ContextType = any, ParentType = ResolversParentTypes['Node']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n}>;\n\nexport type SomeNodeResolvers<ContextType = any, ParentType = ResolversParentTypes['SomeNode']> = ResolversObject<{\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type AnotherNodeResolvers<ContextType = any, ParentType = ResolversParentTypes['AnotherNode']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'AnotherNodeWithChild' | 'AnotherNodeWithAll', ParentType, ContextType>;\n}>;\n\nexport type WithChildResolvers<ContextType = any, ParentType = ResolversParentTypes['WithChild']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'AnotherNodeWithChild' | 'AnotherNodeWithAll', ParentType, ContextType>;\n}>;\n\nexport type WithChildrenResolvers<ContextType = any, ParentType = ResolversParentTypes['WithChildren']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'AnotherNodeWithAll', ParentType, ContextType>;\n}>;\n\nexport type AnotherNodeWithChildResolvers<ContextType = any, ParentType = ResolversParentTypes['AnotherNodeWithChild']> = ResolversObject<{\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  interfaceChild?: Resolver<Maybe<ResolversTypes['Node']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type AnotherNodeWithAllResolvers<ContextType = any, ParentType = ResolversParentTypes['AnotherNodeWithAll']> = ResolversObject<{\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  unionChildren?: Resolver<Array<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  interfaceChild?: Resolver<Maybe<ResolversTypes['Node']>, ParentType, ContextType>;\n  interfaceChildren?: Resolver<Array<ResolversTypes['Node']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type MyUnionResolvers<ContextType = any, ParentType = ResolversParentTypes['MyUnion']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n}>;\n\nexport interface MyScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['MyScalar'], any> {\n  name: 'MyScalar';\n}\n\nexport type Resolvers<ContextType = any> = ResolversObject<{\n  MyType?: MyTypeResolvers<ContextType>;\n  Child?: ChildResolvers<ContextType>;\n  MyOtherType?: MyOtherTypeResolvers<ContextType>;\n  ChildUnion?: ChildUnionResolvers<ContextType>;\n  Query?: QueryResolvers<ContextType>;\n  Subscription?: SubscriptionResolvers<ContextType>;\n  Node?: NodeResolvers<ContextType>;\n  SomeNode?: SomeNodeResolvers<ContextType>;\n  AnotherNode?: AnotherNodeResolvers<ContextType>;\n  WithChild?: WithChildResolvers<ContextType>;\n  WithChildren?: WithChildrenResolvers<ContextType>;\n  AnotherNodeWithChild?: AnotherNodeWithChildResolvers<ContextType>;\n  AnotherNodeWithAll?: AnotherNodeWithAllResolvers<ContextType>;\n  MyUnion?: MyUnionResolvers<ContextType>;\n  MyScalar?: GraphQLScalarType;\n}>;\n\nexport type DirectiveResolvers<ContextType = any> = ResolversObject<{\n  myDirective?: MyDirectiveDirectiveResolver<any, any, ContextType>;\n  authenticated?: AuthenticatedDirectiveResolver<any, any, ContextType>;\n}>;\n\n        export const myTypeResolvers: MyTypeResolvers<{}, { parentOverride: boolean }> = {\n          foo: (parentValue) => {\n            const a: boolean = parentValue.parentOverride;\n\n            return a.toString();\n          }\n        };\n      \"\n`;\n\nexports[`TypeScript Resolvers Plugin > Config > namespacedImportName - should work correctly with imported namespaced type 1`] = `\n\"import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql';\nexport type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;\nexport type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };\nexport type WithIndex<TObject> = TObject & Record<string, any>;\nexport type ResolversObject<TObject> = WithIndex<TObject>;\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<TResult, TKey extends string, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Types.Maybe<TTypes> | Promise<Types.Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<TResult = Record<PropertyKey, never>, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n\n\n/** Mapping of union types */\nexport type ResolversUnionTypes<_RefType extends Record<string, unknown>> = ResolversObject<{\n  ChildUnion:\n    | ( Omit<Types.Child, 'parent'> & { parent?: Types.Maybe<_RefType['MyType']> } )\n    | ( Types.MyOtherType )\n  ;\n  MyUnion:\n    | ( Omit<Types.MyType, 'unionChild'> & { unionChild?: Types.Maybe<_RefType['ChildUnion']> } )\n    | ( Types.MyOtherType )\n  ;\n}>;\n\n/** Mapping of interface types */\nexport type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = ResolversObject<{\n  Node: ( Types.SomeNode );\n  AnotherNode:\n    | ( Omit<Types.AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Types.Maybe<_RefType['ChildUnion']>, interfaceChild?: Types.Maybe<_RefType['Node']> } )\n    | ( Omit<Types.AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Types.Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Types.Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } )\n  ;\n  WithChild:\n    | ( Omit<Types.AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Types.Maybe<_RefType['ChildUnion']>, interfaceChild?: Types.Maybe<_RefType['Node']> } )\n    | ( Omit<Types.AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Types.Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Types.Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } )\n  ;\n  WithChildren: ( Omit<Types.AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Types.Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Types.Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n}>;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = ResolversObject<{\n  MyType: ResolverTypeWrapper<Omit<Types.MyType, 'unionChild'> & { unionChild?: Types.Maybe<ResolversTypes['ChildUnion']> }>;\n  String: ResolverTypeWrapper<Types.Scalars['String']['output']>;\n  Child: ResolverTypeWrapper<Omit<Types.Child, 'parent'> & { parent?: Types.Maybe<ResolversTypes['MyType']> }>;\n  MyOtherType: ResolverTypeWrapper<Types.MyOtherType>;\n  ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n  Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n  ID: ResolverTypeWrapper<Types.Scalars['ID']['output']>;\n  SomeNode: ResolverTypeWrapper<Types.SomeNode>;\n  AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n  WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n  WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n  AnotherNodeWithChild: ResolverTypeWrapper<Omit<Types.AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Types.Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Types.Maybe<ResolversTypes['Node']> }>;\n  AnotherNodeWithAll: ResolverTypeWrapper<Omit<Types.AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Types.Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Types.Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n  MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n  MyScalar: ResolverTypeWrapper<Types.Scalars['MyScalar']['output']>;\n  Int: ResolverTypeWrapper<Types.Scalars['Int']['output']>;\n  Boolean: ResolverTypeWrapper<Types.Scalars['Boolean']['output']>;\n}>;\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = ResolversObject<{\n  MyType: Omit<Types.MyType, 'unionChild'> & { unionChild?: Types.Maybe<ResolversParentTypes['ChildUnion']> };\n  String: Types.Scalars['String']['output'];\n  Child: Omit<Types.Child, 'parent'> & { parent?: Types.Maybe<ResolversParentTypes['MyType']> };\n  MyOtherType: Types.MyOtherType;\n  ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n  Query: Record<PropertyKey, never>;\n  Subscription: Record<PropertyKey, never>;\n  Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n  ID: Types.Scalars['ID']['output'];\n  SomeNode: Types.SomeNode;\n  AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n  WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n  WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n  AnotherNodeWithChild: Omit<Types.AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Types.Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Types.Maybe<ResolversParentTypes['Node']> };\n  AnotherNodeWithAll: Omit<Types.AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Types.Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Types.Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n  MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n  MyScalar: Types.Scalars['MyScalar']['output'];\n  Int: Types.Scalars['Int']['output'];\n  Boolean: Types.Scalars['Boolean']['output'];\n}>;\n\nexport type MyDirectiveDirectiveArgs = {\n  arg: Types.Scalars['Int']['input'];\n  arg2: Types.Scalars['String']['input'];\n  arg3: Types.Scalars['Boolean']['input'];\n};\n\nexport type MyDirectiveDirectiveResolver<Result, Parent, ContextType = any, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;\n\nexport type AuthenticatedDirectiveArgs = { };\n\nexport type AuthenticatedDirectiveResolver<Result, Parent, ContextType = any, Args = AuthenticatedDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;\n\nexport type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = ResolversObject<{\n  foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  otherType?: Resolver<Types.Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n  withArgs?: Resolver<Types.Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<Types.MyTypeWithArgsArgs, 'arg2'>>;\n  unionChild?: Resolver<Types.Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type ChildResolvers<ContextType = any, ParentType extends ResolversParentTypes['Child'] = ResolversParentTypes['Child']> = ResolversObject<{\n  bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  parent?: Resolver<Types.Maybe<ResolversTypes['MyType']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type MyOtherTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = ResolversObject<{\n  bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type ChildUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['ChildUnion'] = ResolversParentTypes['ChildUnion']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'Child' | 'MyOtherType', ParentType, ContextType>;\n}>;\n\nexport type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = ResolversObject<{\n  something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n}>;\n\nexport type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = ResolversObject<{\n  somethingChanged?: SubscriptionResolver<Types.Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n}>;\n\nexport type NodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n}>;\n\nexport type SomeNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = ResolversObject<{\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type AnotherNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['AnotherNode'] = ResolversParentTypes['AnotherNode']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'AnotherNodeWithChild' | 'AnotherNodeWithAll', ParentType, ContextType>;\n}>;\n\nexport type WithChildResolvers<ContextType = any, ParentType extends ResolversParentTypes['WithChild'] = ResolversParentTypes['WithChild']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'AnotherNodeWithChild' | 'AnotherNodeWithAll', ParentType, ContextType>;\n}>;\n\nexport type WithChildrenResolvers<ContextType = any, ParentType extends ResolversParentTypes['WithChildren'] = ResolversParentTypes['WithChildren']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'AnotherNodeWithAll', ParentType, ContextType>;\n}>;\n\nexport type AnotherNodeWithChildResolvers<ContextType = any, ParentType extends ResolversParentTypes['AnotherNodeWithChild'] = ResolversParentTypes['AnotherNodeWithChild']> = ResolversObject<{\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  unionChild?: Resolver<Types.Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  interfaceChild?: Resolver<Types.Maybe<ResolversTypes['Node']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type AnotherNodeWithAllResolvers<ContextType = any, ParentType extends ResolversParentTypes['AnotherNodeWithAll'] = ResolversParentTypes['AnotherNodeWithAll']> = ResolversObject<{\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  unionChild?: Resolver<Types.Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  unionChildren?: Resolver<Array<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  interfaceChild?: Resolver<Types.Maybe<ResolversTypes['Node']>, ParentType, ContextType>;\n  interfaceChildren?: Resolver<Array<ResolversTypes['Node']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type MyUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n}>;\n\nexport interface MyScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['MyScalar'], any> {\n  name: 'MyScalar';\n}\n\nexport type Resolvers<ContextType = any> = ResolversObject<{\n  MyType?: MyTypeResolvers<ContextType>;\n  Child?: ChildResolvers<ContextType>;\n  MyOtherType?: MyOtherTypeResolvers<ContextType>;\n  ChildUnion?: ChildUnionResolvers<ContextType>;\n  Query?: QueryResolvers<ContextType>;\n  Subscription?: SubscriptionResolvers<ContextType>;\n  Node?: NodeResolvers<ContextType>;\n  SomeNode?: SomeNodeResolvers<ContextType>;\n  AnotherNode?: AnotherNodeResolvers<ContextType>;\n  WithChild?: WithChildResolvers<ContextType>;\n  WithChildren?: WithChildrenResolvers<ContextType>;\n  AnotherNodeWithChild?: AnotherNodeWithChildResolvers<ContextType>;\n  AnotherNodeWithAll?: AnotherNodeWithAllResolvers<ContextType>;\n  MyUnion?: MyUnionResolvers<ContextType>;\n  MyScalar?: GraphQLScalarType;\n}>;\n\nexport type DirectiveResolvers<ContextType = any> = ResolversObject<{\n  myDirective?: MyDirectiveDirectiveResolver<any, any, ContextType>;\n  authenticated?: AuthenticatedDirectiveResolver<any, any, ContextType>;\n}>;\n\"\n`;\n\nexports[`TypeScript Resolvers Plugin > Config > optionalInfoArgument - should allow to have optional info argument 1`] = `\n\"export type Maybe<T> = T | null;\nexport type InputMaybe<T> = Maybe<T>;\nexport type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\nexport type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\nexport type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\nexport type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\nexport type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\nimport { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql';\nexport type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;\nexport type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> };\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string; }\n  String: { input: string; output: string; }\n  Boolean: { input: boolean; output: boolean; }\n  Int: { input: number; output: number; }\n  Float: { input: number; output: number; }\n  MyScalar: { input: any; output: any; }\n};\n\nexport type MyType = {\n  __typename?: 'MyType';\n  foo: Scalars['String']['output'];\n  otherType?: Maybe<MyOtherType>;\n  withArgs?: Maybe<Scalars['String']['output']>;\n  unionChild?: Maybe<ChildUnion>;\n};\n\n\nexport type MyTypeWithArgsArgs = {\n  arg?: InputMaybe<Scalars['String']['input']>;\n  arg2: Scalars['String']['input'];\n};\n\nexport type Child = {\n  __typename?: 'Child';\n  bar: Scalars['String']['output'];\n  parent?: Maybe<MyType>;\n};\n\nexport type MyOtherType = {\n  __typename?: 'MyOtherType';\n  bar: Scalars['String']['output'];\n};\n\nexport type ChildUnion = Child | MyOtherType;\n\nexport type Query = {\n  __typename?: 'Query';\n  something: MyType;\n};\n\nexport type Subscription = {\n  __typename?: 'Subscription';\n  somethingChanged?: Maybe<MyOtherType>;\n};\n\nexport type Node = {\n  id: Scalars['ID']['output'];\n};\n\nexport type SomeNode = Node & {\n  __typename?: 'SomeNode';\n  id: Scalars['ID']['output'];\n};\n\nexport type AnotherNode = {\n  id: Scalars['ID']['output'];\n};\n\nexport type WithChild = {\n  unionChild?: Maybe<ChildUnion>;\n  node?: Maybe<AnotherNode>;\n};\n\nexport type WithChildren = {\n  unionChildren: Array<ChildUnion>;\n  nodes: Array<AnotherNode>;\n};\n\nexport type AnotherNodeWithChild = AnotherNode & WithChild & {\n  __typename?: 'AnotherNodeWithChild';\n  id: Scalars['ID']['output'];\n  unionChild?: Maybe<ChildUnion>;\n  interfaceChild?: Maybe<Node>;\n};\n\nexport type AnotherNodeWithAll = AnotherNode & WithChild & WithChildren & {\n  __typename?: 'AnotherNodeWithAll';\n  id: Scalars['ID']['output'];\n  unionChild?: Maybe<ChildUnion>;\n  unionChildren: Array<ChildUnion>;\n  interfaceChild?: Maybe<Node>;\n  interfaceChildren: Array<Node>;\n};\n\nexport type MyUnion = MyType | MyOtherType;\nexport type WithIndex<TObject> = TObject & Record<string, any>;\nexport type ResolversObject<TObject> = WithIndex<TObject>;\n\nexport type ResolverTypeWrapper<T> = Promise<T> | T;\n\n\nexport type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n};\nexport type Resolver<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info?: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info?: GraphQLResolveInfo\n) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\nexport type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info?: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\nexport interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n  resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n}\n\nexport interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n  subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n  resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n}\n\nexport type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n  | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n  | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\nexport type SubscriptionResolver<TResult, TKey extends string, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> =\n  | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n  | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\nexport type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n  parent: TParent,\n  context: TContext,\n  info?: GraphQLResolveInfo\n) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\nexport type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (obj: T, context: TContext, info?: GraphQLResolveInfo) => boolean | Promise<boolean>;\n\nexport type NextResolverFn<T> = () => Promise<T>;\n\nexport type DirectiveResolverFn<TResult = Record<PropertyKey, never>, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> = (\n  next: NextResolverFn<TResult>,\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info?: GraphQLResolveInfo\n) => TResult | Promise<TResult>;\n\n\n\n/** Mapping of union types */\nexport type ResolversUnionTypes<_RefType extends Record<string, unknown>> = ResolversObject<{\n  ChildUnion:\n    | ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } )\n    | ( MyOtherType )\n  ;\n  MyUnion:\n    | ( Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> } )\n    | ( MyOtherType )\n  ;\n}>;\n\n/** Mapping of interface types */\nexport type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = ResolversObject<{\n  Node: ( SomeNode );\n  AnotherNode:\n    | ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } )\n    | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } )\n  ;\n  WithChild:\n    | ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } )\n    | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } )\n  ;\n  WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n}>;\n\n/** Mapping between all available schema types and the resolvers types */\nexport type ResolversTypes = ResolversObject<{\n  MyType: ResolverTypeWrapper<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']> }>;\n  String: ResolverTypeWrapper<Scalars['String']['output']>;\n  Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n  MyOtherType: ResolverTypeWrapper<MyOtherType>;\n  ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n  Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n  Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n  ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n  SomeNode: ResolverTypeWrapper<SomeNode>;\n  AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n  WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n  WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n  AnotherNodeWithChild: ResolverTypeWrapper<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']> }>;\n  AnotherNodeWithAll: ResolverTypeWrapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n  MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n  MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n  Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n  Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n}>;\n\n/** Mapping between all available schema types and the resolvers parents */\nexport type ResolversParentTypes = ResolversObject<{\n  MyType: Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']> };\n  String: Scalars['String']['output'];\n  Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n  MyOtherType: MyOtherType;\n  ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n  Query: Record<PropertyKey, never>;\n  Subscription: Record<PropertyKey, never>;\n  Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n  ID: Scalars['ID']['output'];\n  SomeNode: SomeNode;\n  AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n  WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n  WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n  AnotherNodeWithChild: Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']> };\n  AnotherNodeWithAll: Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n  MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n  MyScalar: Scalars['MyScalar']['output'];\n  Int: Scalars['Int']['output'];\n  Boolean: Scalars['Boolean']['output'];\n}>;\n\nexport type MyDirectiveDirectiveArgs = {\n  arg: Scalars['Int']['input'];\n  arg2: Scalars['String']['input'];\n  arg3: Scalars['Boolean']['input'];\n};\n\nexport type MyDirectiveDirectiveResolver<Result, Parent, ContextType = any, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;\n\nexport type AuthenticatedDirectiveArgs = { };\n\nexport type AuthenticatedDirectiveResolver<Result, Parent, ContextType = any, Args = AuthenticatedDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;\n\nexport type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = ResolversObject<{\n  foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n  withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n  unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type ChildResolvers<ContextType = any, ParentType extends ResolversParentTypes['Child'] = ResolversParentTypes['Child']> = ResolversObject<{\n  bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  parent?: Resolver<Maybe<ResolversTypes['MyType']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type MyOtherTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = ResolversObject<{\n  bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type ChildUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['ChildUnion'] = ResolversParentTypes['ChildUnion']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'Child' | 'MyOtherType', ParentType, ContextType>;\n}>;\n\nexport type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = ResolversObject<{\n  something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n}>;\n\nexport type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = ResolversObject<{\n  somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n}>;\n\nexport type NodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n}>;\n\nexport type SomeNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = ResolversObject<{\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type AnotherNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['AnotherNode'] = ResolversParentTypes['AnotherNode']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'AnotherNodeWithChild' | 'AnotherNodeWithAll', ParentType, ContextType>;\n}>;\n\nexport type WithChildResolvers<ContextType = any, ParentType extends ResolversParentTypes['WithChild'] = ResolversParentTypes['WithChild']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'AnotherNodeWithChild' | 'AnotherNodeWithAll', ParentType, ContextType>;\n}>;\n\nexport type WithChildrenResolvers<ContextType = any, ParentType extends ResolversParentTypes['WithChildren'] = ResolversParentTypes['WithChildren']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'AnotherNodeWithAll', ParentType, ContextType>;\n}>;\n\nexport type AnotherNodeWithChildResolvers<ContextType = any, ParentType extends ResolversParentTypes['AnotherNodeWithChild'] = ResolversParentTypes['AnotherNodeWithChild']> = ResolversObject<{\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  interfaceChild?: Resolver<Maybe<ResolversTypes['Node']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type AnotherNodeWithAllResolvers<ContextType = any, ParentType extends ResolversParentTypes['AnotherNodeWithAll'] = ResolversParentTypes['AnotherNodeWithAll']> = ResolversObject<{\n  id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n  unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  unionChildren?: Resolver<Array<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  interfaceChild?: Resolver<Maybe<ResolversTypes['Node']>, ParentType, ContextType>;\n  interfaceChildren?: Resolver<Array<ResolversTypes['Node']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n}>;\n\nexport type MyUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = ResolversObject<{\n  __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n}>;\n\nexport interface MyScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['MyScalar'], any> {\n  name: 'MyScalar';\n}\n\nexport type Resolvers<ContextType = any> = ResolversObject<{\n  MyType?: MyTypeResolvers<ContextType>;\n  Child?: ChildResolvers<ContextType>;\n  MyOtherType?: MyOtherTypeResolvers<ContextType>;\n  ChildUnion?: ChildUnionResolvers<ContextType>;\n  Query?: QueryResolvers<ContextType>;\n  Subscription?: SubscriptionResolvers<ContextType>;\n  Node?: NodeResolvers<ContextType>;\n  SomeNode?: SomeNodeResolvers<ContextType>;\n  AnotherNode?: AnotherNodeResolvers<ContextType>;\n  WithChild?: WithChildResolvers<ContextType>;\n  WithChildren?: WithChildrenResolvers<ContextType>;\n  AnotherNodeWithChild?: AnotherNodeWithChildResolvers<ContextType>;\n  AnotherNodeWithAll?: AnotherNodeWithAllResolvers<ContextType>;\n  MyUnion?: MyUnionResolvers<ContextType>;\n  MyScalar?: GraphQLScalarType;\n}>;\n\nexport type DirectiveResolvers<ContextType = any> = ResolversObject<{\n  myDirective?: MyDirectiveDirectiveResolver<any, any, ContextType>;\n  authenticated?: AuthenticatedDirectiveResolver<any, any, ContextType>;\n}>;\n\"\n`;\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/ts-resolvers.config.avoidOptionals.spec.ts",
    "content": "import { resolversTestingSchema, resolversTestingValidate } from '@graphql-codegen/testing';\nimport { buildSchema } from 'graphql';\nimport type { Types } from '@graphql-codegen/plugin-helpers';\nimport { plugin } from '../src/index.js';\n\ndescribe('TypeScript Resolvers Plugin - config.avoidOptionals', () => {\n  it('should generate basic type resolvers if config.avoidOptionals = true', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      { avoidOptionals: true },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveArgs = {\n      arg: Scalars['Int']['input'];\n      arg2: Scalars['String']['input'];\n      arg3: Scalars['Boolean']['input'];\n    };`);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveResolver<Result, Parent, ContextType = any, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyOtherTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = {\n        bar: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content)\n      .toBeSimilarStringTo(`export interface MyScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['MyScalar'], any> {\n      name: 'MyScalar';\n    }`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        otherType: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SomeNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = {\n        id: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        somethingChanged: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n      };\n    `);\n\n    await resolversTestingValidate(result);\n  });\n\n  it('#7005 - avoidOptionals should preserve optional resolvers', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        users(filter: UserFilterInput = {}): [User!]!\n        ping: String!\n      }\n\n      input UserFilterInput {\n        status: String = \"ACTIVE\"\n      }\n\n      type User {\n        id: ID!\n      }\n    `);\n\n    const output = (await plugin(\n      testSchema,\n      [],\n      {\n        avoidOptionals: {\n          defaultValue: true,\n          field: true,\n          inputValue: true,\n          object: true,\n          resolvers: false,\n        },\n      } as any,\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(output.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        users?: Resolver<Array<ResolversTypes['User']>, ParentType, ContextType, RequireFields<QueryUsersArgs, 'filter'>>;\n        ping?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('#9438 - avoidOptionals should not wrap arguments with partial', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        users(filter: UserFilterInput): [User!]!\n      }\n\n      input UserFilterInput {\n        status: String = \"ACTIVE\"\n      }\n\n      type User {\n        id: ID!\n      }\n    `);\n\n    const output = (await plugin(\n      testSchema,\n      [],\n      {\n        avoidOptionals: {\n          defaultValue: true,\n          field: true,\n          inputValue: true,\n          object: true,\n          resolvers: false,\n        },\n      } as any,\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(output.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        users?: Resolver<Array<ResolversTypes['User']>, ParentType, ContextType, QueryUsersArgs>;\n      };\n    `);\n  });\n\n  it('should keep non-optional arguments non-optional - issue #2323', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      enum OrderBy {\n        name\n        id\n      }\n\n      input Filter {\n        contain: String\n      }\n\n      type Node {\n        id: ID!\n        name: String!\n      }\n\n      type Connection {\n        nodes: [Node]\n      }\n\n      type Query {\n        list(after: String, orderBy: OrderBy = name, filter: Filter!): Connection!\n      }\n    `);\n\n    const output = (await plugin(\n      testSchema,\n      [],\n      {\n        avoidOptionals: false,\n        maybeValue: 'T | undefined',\n      } as any,\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    // filter should be non-optional\n    expect(output.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        list?: Resolver<ResolversTypes['Connection'], ParentType, ContextType, RequireFields<QueryListArgs, 'orderBy' | 'filter'>>;\n      };\n    `);\n  });\n});\n\ndescribe('TypeScript Resolvers Plugin - config.avoidOptionals - query, mutation, subscription', () => {\n  const testSchema = buildSchema(/* GraphQL */ `\n    type Query {\n      user: User\n      currentAppVersion: String!\n    }\n\n    type Mutation {\n      updateUser: User!\n      flagUser: User!\n    }\n\n    type Subscription {\n      userUpdates: User!\n      appVersionUpdates: String!\n    }\n\n    type User {\n      id: ID!\n    }\n  `);\n\n  it('avoids non-optional Query fields if config.avoidOptionals.query = true', async () => {\n    const output = (await plugin(\n      testSchema,\n      [],\n      { avoidOptionals: { query: true } },\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(output.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        user: Resolver<Maybe<ResolversTypes['User']>, ParentType, ContextType>;\n        currentAppVersion: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(output.content).toBeSimilarStringTo(`\n      export type MutationResolvers<ContextType = any, ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']> = {\n        updateUser?: Resolver<ResolversTypes['User'], ParentType, ContextType>;\n        flagUser?: Resolver<ResolversTypes['User'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(output.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        userUpdates?: SubscriptionResolver<ResolversTypes['User'], \"userUpdates\", ParentType, ContextType>;\n        appVersionUpdates?: SubscriptionResolver<ResolversTypes['String'], \"appVersionUpdates\", ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('avoids non-optional Mutation fields if config.avoidOptionals.mutation = true', async () => {\n    const output = (await plugin(\n      testSchema,\n      [],\n      { avoidOptionals: { mutation: true } },\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(output.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        user?: Resolver<Maybe<ResolversTypes['User']>, ParentType, ContextType>;\n        currentAppVersion?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(output.content).toBeSimilarStringTo(`\n      export type MutationResolvers<ContextType = any, ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']> = {\n        updateUser: Resolver<ResolversTypes['User'], ParentType, ContextType>;\n        flagUser: Resolver<ResolversTypes['User'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(output.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        userUpdates?: SubscriptionResolver<ResolversTypes['User'], \"userUpdates\", ParentType, ContextType>;\n        appVersionUpdates?: SubscriptionResolver<ResolversTypes['String'], \"appVersionUpdates\", ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('avoids non-optional Subscription fields if config.avoidOptionals.subscription = true', async () => {\n    const output = (await plugin(\n      testSchema,\n      [],\n      { avoidOptionals: { subscription: true } },\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(output.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        user?: Resolver<Maybe<ResolversTypes['User']>, ParentType, ContextType>;\n        currentAppVersion?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(output.content).toBeSimilarStringTo(`\n      export type MutationResolvers<ContextType = any, ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']> = {\n        updateUser?: Resolver<ResolversTypes['User'], ParentType, ContextType>;\n        flagUser?: Resolver<ResolversTypes['User'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(output.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        userUpdates: SubscriptionResolver<ResolversTypes['User'], \"userUpdates\", ParentType, ContextType>;\n        appVersionUpdates: SubscriptionResolver<ResolversTypes['String'], \"appVersionUpdates\", ParentType, ContextType>;\n      };\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/ts-resolvers.config.customDirectives.spec.ts",
    "content": "import { buildSchema } from 'graphql';\nimport '@graphql-codegen/testing';\nimport { plugin } from '../src/index.js';\n\ndescribe('customDirectives.sematicNonNull', () => {\n  it('allowSemanticNonNull - should build strict type if annotated by @semanticNonNull directive', async () => {\n    const testingSchema = buildSchema(/* GraphQL */ `\n      directive @semanticNonNull(levels: [Int] = [0]) on FIELD_DEFINITION\n\n      type TestingType {\n        field: String @semanticNonNull\n        fieldLevel0: String @semanticNonNull(levels: [0])\n        fieldLevel1: String @semanticNonNull(levels: [1])\n        fieldBothLevels: String @semanticNonNull(levels: [0, 1])\n        list: [String] @semanticNonNull\n        listLevel0: [String] @semanticNonNull(levels: [0])\n        listLevel1: [String] @semanticNonNull(levels: [1])\n        listBothLevels: [String] @semanticNonNull(levels: [0, 1])\n        nonNullableList: [String]! @semanticNonNull\n        nonNullableListLevel0: [String]! @semanticNonNull(levels: [0])\n        nonNullableListLevel1: [String]! @semanticNonNull(levels: [1])\n        nonNullableListBothLevels: [String]! @semanticNonNull(levels: [0, 1])\n        listWithNonNullableItem: [String!] @semanticNonNull\n        listWithNonNullableItemLevel0: [String!] @semanticNonNull(levels: [0])\n        listWithNonNullableItemLevel1: [String!] @semanticNonNull(levels: [1])\n        listWithNonNullableItemBothLevels: [String!] @semanticNonNull(levels: [0, 1])\n        nonNullableListWithNonNullableItem: [String!]! @semanticNonNull\n        nonNullableListWithNonNullableItemLevel0: [String!]! @semanticNonNull(levels: [0])\n        nonNullableListWithNonNullableItemLevel1: [String!]! @semanticNonNull(levels: [1])\n        nonNullableListWithNonNullableItemBothLevels: [String!]! @semanticNonNull(levels: [0, 1])\n      }\n    `);\n\n    const result = await plugin(\n      testingSchema,\n      [],\n      {\n        customDirectives: { semanticNonNull: true },\n      },\n      { outputFile: '' }\n    );\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type TestingTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['TestingType'] = ResolversParentTypes['TestingType']> = {\n        field?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        fieldLevel0?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        fieldLevel1?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n        fieldBothLevels?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        list?: Resolver<Array<Maybe<ResolversTypes['String']>>, ParentType, ContextType>;\n        listLevel0?: Resolver<Array<Maybe<ResolversTypes['String']>>, ParentType, ContextType>;\n        listLevel1?: Resolver<Maybe<Array<ResolversTypes['String']>>, ParentType, ContextType>;\n        listBothLevels?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;\n        nonNullableList?: Resolver<Array<Maybe<ResolversTypes['String']>>, ParentType, ContextType>;\n        nonNullableListLevel0?: Resolver<Array<Maybe<ResolversTypes['String']>>, ParentType, ContextType>;\n        nonNullableListLevel1?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;\n        nonNullableListBothLevels?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;\n        listWithNonNullableItem?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;\n        listWithNonNullableItemLevel0?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;\n        listWithNonNullableItemLevel1?: Resolver<Maybe<Array<ResolversTypes['String']>>, ParentType, ContextType>;\n        listWithNonNullableItemBothLevels?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;\n        nonNullableListWithNonNullableItem?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;\n        nonNullableListWithNonNullableItemLevel0?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;\n        nonNullableListWithNonNullableItemLevel1?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;\n        nonNullableListWithNonNullableItemBothLevels?: Resolver<Array<ResolversTypes['String']>, ParentType, ContextType>;\n      };\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/ts-resolvers.config.resolversNonOptionalTypename.spec.ts",
    "content": "import { resolversTestingSchema } from '@graphql-codegen/testing';\nimport { plugin } from '../src/index.js';\n\ndescribe('TypeScript Resolvers Plugin - config.resolversNonOptionalTypename', () => {\n  it('excludes types', async () => {\n    const result = await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        resolversNonOptionalTypename: {\n          unionMember: true,\n          interfaceImplementingType: true,\n          excludeTypes: ['ChildUnion', 'AnotherNode', 'Node'],\n        },\n      },\n      { outputFile: '' }\n    );\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } ) | ( MyOtherType );\n        MyUnion: ( Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> } & { __typename: 'MyType' } ) | ( MyOtherType & { __typename: 'MyOtherType' } );\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChild: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } & { __typename: 'AnotherNodeWithChild' } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n      };\n    `);\n  });\n\n  it('adds non-optional typenames to implemented types', async () => {\n    const result = await plugin(resolversTestingSchema, [], { resolversNonOptionalTypename: true }, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } & { __typename: 'Child' } ) | ( MyOtherType & { __typename: 'MyOtherType' } );\n        MyUnion: ( Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> } & { __typename: 'MyType' } ) | ( MyOtherType & { __typename: 'MyOtherType' } );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode & { __typename: 'SomeNode' } );\n        AnotherNode: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } & { __typename: 'AnotherNodeWithChild' } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n        WithChild: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } & { __typename: 'AnotherNodeWithChild' } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n      };\n    `);\n  });\n\n  it('adds non-optional typenames to ResolversUnionTypes', async () => {\n    const result = await plugin(\n      resolversTestingSchema,\n      [],\n      { resolversNonOptionalTypename: { unionMember: true } },\n      { outputFile: '' }\n    );\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } & { __typename: 'Child' } ) | ( MyOtherType & { __typename: 'MyOtherType' } );\n        MyUnion: ( Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> } & { __typename: 'MyType' } ) | ( MyOtherType & { __typename: 'MyOtherType' } );\n      };\n    `);\n  });\n\n  it('adds non-optional typenames to ResolversUnionTypes for mappers with no placeholder', async () => {\n    const result = await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        resolversNonOptionalTypename: { unionMember: true },\n        mappers: { Child: 'ChildMapper', MyType: 'MyTypeMapper' },\n      },\n      { outputFile: '' }\n    );\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( ChildMapper & { __typename: 'Child' } ) | ( MyOtherType & { __typename: 'MyOtherType' } );\n        MyUnion: ( MyTypeMapper & { __typename: 'MyType' } ) | ( MyOtherType & { __typename: 'MyOtherType' } );\n      };\n    `);\n  });\n\n  it('adds non-optional typenames to ResolversUnionTypes for mappers with placeholder', async () => {\n    const result = await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        resolversNonOptionalTypename: { unionMember: true },\n        mappers: { Child: 'Wrapper<{T}>', MyType: 'MyWrapper<{T}>' },\n      },\n      { outputFile: '' }\n    );\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Wrapper<Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> }> & { __typename: 'Child' } ) | ( MyOtherType & { __typename: 'MyOtherType' } );\n        MyUnion: ( MyWrapper<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> }> & { __typename: 'MyType' } ) | ( MyOtherType & { __typename: 'MyOtherType' } );\n      };\n    `);\n  });\n\n  it('adds non-optional typenames to ResolversUnionTypes for default mappers with placeholder', async () => {\n    const result = await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        resolversNonOptionalTypename: { unionMember: true },\n        defaultMapper: 'Partial<{T}>',\n      },\n      { outputFile: '' }\n    );\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Partial<Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> }> & { __typename: 'Child' } ) | ( Partial<MyOtherType> & { __typename: 'MyOtherType' } );\n        MyUnion: ( Partial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> }> & { __typename: 'MyType' } ) | ( Partial<MyOtherType> & { __typename: 'MyOtherType' } );\n      };\n    `);\n  });\n\n  it('does not create ResolversUnionTypes for default mappers with no placeholder', async () => {\n    const result = await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        resolversNonOptionalTypename: { unionMember: true },\n        defaultMapper: '{}',\n      },\n      { outputFile: '' }\n    );\n\n    expect(result.content).not.toBeSimilarStringTo('export type ResolversUnionTypes');\n    expect(result.content).not.toBeSimilarStringTo('export type ResolversUnionParentTypes');\n  });\n\n  it('adds non-optional typenames to ResolversInterfaceTypes', async () => {\n    const result = await plugin(\n      resolversTestingSchema,\n      [],\n      { resolversNonOptionalTypename: { interfaceImplementingType: true } },\n      { outputFile: '' }\n    );\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode & { __typename: 'SomeNode' } );\n        AnotherNode: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } & { __typename: 'AnotherNodeWithChild' } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n        WithChild: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } & { __typename: 'AnotherNodeWithChild' } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n      };\n    `);\n  });\n\n  it('adds non-optional typenames to ResolversInterfaceTypes for mappers with no placeholder', async () => {\n    const result = await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        resolversNonOptionalTypename: { interfaceImplementingType: true },\n        mappers: { AnotherNodeWithChild: 'AnotherNodeWithChildMapper' },\n      },\n      { outputFile: '' }\n    );\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode & { __typename: 'SomeNode' } );\n        AnotherNode: ( AnotherNodeWithChildMapper & { __typename: 'AnotherNodeWithChild' } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n        WithChild: ( AnotherNodeWithChildMapper & { __typename: 'AnotherNodeWithChild' } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n      };\n    `);\n  });\n\n  it('adds non-optional typenames to ResolversInterfaceTypes for mappers with placeholder', async () => {\n    const result = await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        resolversNonOptionalTypename: { interfaceImplementingType: true },\n        mappers: { AnotherNodeWithChild: 'Wrapper<{T}>' },\n      },\n      { outputFile: '' }\n    );\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode & { __typename: 'SomeNode' } );\n        AnotherNode: ( Wrapper<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> & { __typename: 'AnotherNodeWithChild' } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n        WithChild: ( Wrapper<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> & { __typename: 'AnotherNodeWithChild' } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } & { __typename: 'AnotherNodeWithAll' } );\n      };\n    `);\n  });\n\n  it('adds non-optional typenames to ResolversInterfaceTypes for default mappers with placeholder', async () => {\n    const result = await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        resolversNonOptionalTypename: { interfaceImplementingType: true },\n        defaultMapper: 'Partial<{T}>',\n      },\n      { outputFile: '' }\n    );\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( Partial<SomeNode> & { __typename: 'SomeNode' } );\n        AnotherNode: ( Partial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> & { __typename: 'AnotherNodeWithChild' } ) | ( Partial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> }> & { __typename: 'AnotherNodeWithAll' } );\n        WithChild: ( Partial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> & { __typename: 'AnotherNodeWithChild' } ) | ( Partial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> }> & { __typename: 'AnotherNodeWithAll' } );\n        WithChildren: ( Partial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> }> & { __typename: 'AnotherNodeWithAll' } );\n      };\n    `);\n  });\n\n  it('does not create ResolversInterfaceTypes for default mappers with no placeholder', async () => {\n    const result = await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        resolversNonOptionalTypename: { interfaceImplementingType: true },\n        defaultMapper: 'unknown',\n      },\n      { outputFile: '' }\n    );\n\n    expect(result.content).not.toBeSimilarStringTo('export type ResolversInterfaceTypes');\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/ts-resolvers.federation.interface.spec.ts",
    "content": "import '@graphql-codegen/testing';\nimport { generate } from './utils';\n\ndescribe('TypeScript Resolvers Plugin + Apollo Federation - Interface', () => {\n  it('generates __resolveReference for Interfaces with @key', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        me: Person\n      }\n\n      interface Person @key(fields: \"id\") {\n        id: ID!\n        name: PersonName!\n      }\n\n      type User implements Person @key(fields: \"id\") {\n        id: ID!\n        name: PersonName!\n      }\n\n      type Admin implements Person @key(fields: \"id\") {\n        id: ID!\n        name: PersonName!\n        canImpersonate: Boolean!\n      }\n\n      type PersonName {\n        first: String!\n        last: String!\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).toMatchInlineSnapshot(`\n      \"import { GraphQLResolveInfo } from 'graphql';\n\n\n      export type ResolverTypeWrapper<T> = Promise<T> | T;\n\n      export type ReferenceResolver<TResult, TReference, TContext> = (\n            reference: TReference,\n            context: TContext,\n            info: GraphQLResolveInfo\n          ) => Promise<TResult> | TResult;\n\n            type ScalarCheck<T, S> = S extends true ? T : NullableCheck<T, S>;\n            type NullableCheck<T, S> = Maybe<T> extends T ? Maybe<ListCheck<NonNullable<T>, S>> : ListCheck<T, S>;\n            type ListCheck<T, S> = T extends (infer U)[] ? NullableCheck<U, S>[] : GraphQLRecursivePick<T, S>;\n            export type GraphQLRecursivePick<T, S> = { [K in keyof T & keyof S]: ScalarCheck<T[K], S[K]> };\n          \n\n      export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n        resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n      };\n      export type Resolver<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\n      export type ResolverFn<TResult, TParent, TContext, TArgs> = (\n        parent: TParent,\n        args: TArgs,\n        context: TContext,\n        info: GraphQLResolveInfo\n      ) => Promise<TResult> | TResult;\n\n      export type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n        parent: TParent,\n        args: TArgs,\n        context: TContext,\n        info: GraphQLResolveInfo\n      ) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\n      export type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n        parent: TParent,\n        args: TArgs,\n        context: TContext,\n        info: GraphQLResolveInfo\n      ) => TResult | Promise<TResult>;\n\n      export interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n        subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n        resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n      }\n\n      export interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n        subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n        resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n      }\n\n      export type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n        | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n        | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\n      export type SubscriptionResolver<TResult, TKey extends string, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> =\n        | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n        | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\n      export type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n        parent: TParent,\n        context: TContext,\n        info: GraphQLResolveInfo\n      ) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\n      export type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise<boolean>;\n\n      export type NextResolverFn<T> = () => Promise<T>;\n\n      export type DirectiveResolverFn<TResult = Record<PropertyKey, never>, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> = (\n        next: NextResolverFn<TResult>,\n        parent: TParent,\n        args: TArgs,\n        context: TContext,\n        info: GraphQLResolveInfo\n      ) => TResult | Promise<TResult>;\n\n      /** Mapping of federation types */\n      export type FederationTypes = {\n        Person: Person;\n        User: User;\n        Admin: Admin;\n      };\n\n      /** Mapping of federation reference types */\n      export type FederationReferenceTypes = {\n        Person:\n          ( { __typename: 'Person' }\n          & GraphQLRecursivePick<FederationTypes['Person'], {\"id\":true}> );\n        User:\n          ( { __typename: 'User' }\n          & GraphQLRecursivePick<FederationTypes['User'], {\"id\":true}> );\n        Admin:\n          ( { __typename: 'Admin' }\n          & GraphQLRecursivePick<FederationTypes['Admin'], {\"id\":true}> );\n      };\n\n\n      /** Mapping of interface types */\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Person:\n          | ( User )\n          | ( Admin )\n        ;\n      };\n\n      /** Mapping between all available schema types and the resolvers types */\n      export type ResolversTypes = {\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Person: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Person']>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        User: ResolverTypeWrapper<User>;\n        Admin: ResolverTypeWrapper<Admin>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n        PersonName: ResolverTypeWrapper<PersonName>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n      };\n\n      /** Mapping between all available schema types and the resolvers parents */\n      export type ResolversParentTypes = {\n        Query: Record<PropertyKey, never>;\n        Person: ResolversInterfaceTypes<ResolversParentTypes>['Person'];\n        ID: Scalars['ID']['output'];\n        User: User | FederationReferenceTypes['User'];\n        Admin: Admin | FederationReferenceTypes['Admin'];\n        Boolean: Scalars['Boolean']['output'];\n        PersonName: PersonName;\n        String: Scalars['String']['output'];\n      };\n\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        me?: Resolver<Maybe<ResolversTypes['Person']>, ParentType, ContextType>;\n      };\n\n      export type PersonResolvers<ContextType = any, ParentType extends ResolversParentTypes['Person'] = ResolversParentTypes['Person'], FederationReferenceType extends FederationReferenceTypes['Person'] = FederationReferenceTypes['Person']> = {\n        __resolveType: TypeResolveFn<'User' | 'Admin', ParentType, ContextType>;\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['Person']> | FederationReferenceType, FederationReferenceType, ContextType>;\n      };\n\n      export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationReferenceType extends FederationReferenceTypes['User'] = FederationReferenceTypes['User']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        name?: Resolver<ResolversTypes['PersonName'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n\n      export type AdminResolvers<ContextType = any, ParentType extends ResolversParentTypes['Admin'] = ResolversParentTypes['Admin'], FederationReferenceType extends FederationReferenceTypes['Admin'] = FederationReferenceTypes['Admin']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['Admin']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        name?: Resolver<ResolversTypes['PersonName'], ParentType, ContextType>;\n        canImpersonate?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n\n      export type PersonNameResolvers<ContextType = any, ParentType extends ResolversParentTypes['PersonName'] = ResolversParentTypes['PersonName']> = {\n        first?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        last?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n      };\n\n      export type Resolvers<ContextType = any> = {\n        Query?: QueryResolvers<ContextType>;\n        Person?: PersonResolvers<ContextType>;\n        User?: UserResolvers<ContextType>;\n        Admin?: AdminResolvers<ContextType>;\n        PersonName?: PersonNameResolvers<ContextType>;\n      };\n\n      \"\n    `);\n  });\n\n  it('generates normal Interface fields with addInterfaceFieldResolverTypes:true', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        me: Person\n      }\n\n      interface Person @key(fields: \"id\") {\n        id: ID!\n        name: PersonName!\n      }\n\n      type User implements Person @key(fields: \"id\") {\n        id: ID!\n        name: PersonName!\n      }\n\n      type Admin implements Person @key(fields: \"id\") {\n        id: ID!\n        name: PersonName!\n        canImpersonate: Boolean!\n      }\n\n      type PersonName {\n        first: String!\n        last: String!\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n        addInterfaceFieldResolverTypes: true,\n      },\n    });\n\n    expect(content).toBeSimilarStringTo(`\n      export type PersonResolvers<ContextType = any, ParentType extends ResolversParentTypes['Person'] = ResolversParentTypes['Person'], FederationReferenceType extends FederationReferenceTypes['Person'] = FederationReferenceTypes['Person']> = {\n        __resolveType: TypeResolveFn<'User' | 'Admin', ParentType, ContextType>;\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['Person']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        name?: Resolver<ResolversTypes['PersonName'], ParentType, ContextType>;\n      };\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/ts-resolvers.federation.mappers.spec.ts",
    "content": "import '@graphql-codegen/testing';\nimport { generate } from './utils';\n\ndescribe('TypeScript Resolvers Plugin + Apollo Federation - mappers', () => {\n  it('generates FederationTypes and use it for reference type', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        me: User\n      }\n\n      type User @key(fields: \"id\") {\n        id: ID!\n        name: String\n      }\n\n      type UserProfile {\n        id: ID!\n        user: User!\n      }\n\n      type Account @key(fields: \"id\") {\n        id: ID!\n        name: String! @external\n        displayName: String! @requires(fields: \"name\")\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n        mappers: {\n          User: './mappers#UserMapper',\n          Account: './mappers#AccountMapper',\n        },\n      },\n    });\n\n    // User should have it\n    expect(content).toMatchInlineSnapshot(`\n      \"import { GraphQLResolveInfo } from 'graphql';\n      import { UserMapper, AccountMapper } from './mappers';\n      export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;\n\n\n      export type ResolverTypeWrapper<T> = Promise<T> | T;\n\n      export type ReferenceResolver<TResult, TReference, TContext> = (\n            reference: TReference,\n            context: TContext,\n            info: GraphQLResolveInfo\n          ) => Promise<TResult> | TResult;\n\n            type ScalarCheck<T, S> = S extends true ? T : NullableCheck<T, S>;\n            type NullableCheck<T, S> = Maybe<T> extends T ? Maybe<ListCheck<NonNullable<T>, S>> : ListCheck<T, S>;\n            type ListCheck<T, S> = T extends (infer U)[] ? NullableCheck<U, S>[] : GraphQLRecursivePick<T, S>;\n            export type GraphQLRecursivePick<T, S> = { [K in keyof T & keyof S]: ScalarCheck<T[K], S[K]> };\n          \n\n      export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {\n        resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n      };\n      export type Resolver<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n\n      export type ResolverFn<TResult, TParent, TContext, TArgs> = (\n        parent: TParent,\n        args: TArgs,\n        context: TContext,\n        info: GraphQLResolveInfo\n      ) => Promise<TResult> | TResult;\n\n      export type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (\n        parent: TParent,\n        args: TArgs,\n        context: TContext,\n        info: GraphQLResolveInfo\n      ) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>;\n\n      export type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (\n        parent: TParent,\n        args: TArgs,\n        context: TContext,\n        info: GraphQLResolveInfo\n      ) => TResult | Promise<TResult>;\n\n      export interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {\n        subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>;\n        resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>;\n      }\n\n      export interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {\n        subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>;\n        resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>;\n      }\n\n      export type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =\n        | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>\n        | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>;\n\n      export type SubscriptionResolver<TResult, TKey extends string, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> =\n        | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)\n        | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>;\n\n      export type TypeResolveFn<TTypes, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (\n        parent: TParent,\n        context: TContext,\n        info: GraphQLResolveInfo\n      ) => Maybe<TTypes> | Promise<Maybe<TTypes>>;\n\n      export type IsTypeOfResolverFn<T = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>> = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise<boolean>;\n\n      export type NextResolverFn<T> = () => Promise<T>;\n\n      export type DirectiveResolverFn<TResult = Record<PropertyKey, never>, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> = (\n        next: NextResolverFn<TResult>,\n        parent: TParent,\n        args: TArgs,\n        context: TContext,\n        info: GraphQLResolveInfo\n      ) => TResult | Promise<TResult>;\n\n      /** Mapping of federation types */\n      export type FederationTypes = {\n        User: User;\n        Account: Account;\n      };\n\n      /** Mapping of federation reference types */\n      export type FederationReferenceTypes = {\n        User:\n          ( { __typename: 'User' }\n          & GraphQLRecursivePick<FederationTypes['User'], {\"id\":true}> );\n        Account:\n          ( { __typename: 'Account' }\n          & GraphQLRecursivePick<FederationTypes['Account'], {\"id\":true}>\n          & ( Record<PropertyKey, never>\n              | GraphQLRecursivePick<FederationTypes['Account'], {\"name\":true}> ) );\n      };\n\n\n\n      /** Mapping between all available schema types and the resolvers types */\n      export type ResolversTypes = {\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        User: ResolverTypeWrapper<UserMapper>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        UserProfile: ResolverTypeWrapper<Omit<UserProfile, 'user'> & { user: ResolversTypes['User'] }>;\n        Account: ResolverTypeWrapper<AccountMapper>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n\n      /** Mapping between all available schema types and the resolvers parents */\n      export type ResolversParentTypes = {\n        Query: Record<PropertyKey, never>;\n        User: UserMapper;\n        ID: Scalars['ID']['output'];\n        String: Scalars['String']['output'];\n        UserProfile: Omit<UserProfile, 'user'> & { user: ResolversParentTypes['User'] };\n        Account: AccountMapper;\n        Boolean: Scalars['Boolean']['output'];\n      };\n\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        me?: Resolver<Maybe<ResolversTypes['User']>, ParentType, ContextType>;\n      };\n\n      export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationReferenceType extends FederationReferenceTypes['User'] = FederationReferenceTypes['User']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        name?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n      };\n\n      export type UserProfileResolvers<ContextType = any, ParentType extends ResolversParentTypes['UserProfile'] = ResolversParentTypes['UserProfile']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        user?: Resolver<ResolversTypes['User'], ParentType, ContextType>;\n      };\n\n      export type AccountResolvers<ContextType = any, ParentType extends ResolversParentTypes['Account'] = ResolversParentTypes['Account'], FederationReferenceType extends FederationReferenceTypes['Account'] = FederationReferenceTypes['Account']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['Account']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        displayName?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n      };\n\n      export type Resolvers<ContextType = any> = {\n        Query?: QueryResolvers<ContextType>;\n        User?: UserResolvers<ContextType>;\n        UserProfile?: UserProfileResolvers<ContextType>;\n        Account?: AccountResolvers<ContextType>;\n      };\n\n      \"\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/ts-resolvers.federation.spec.ts",
    "content": "import '@graphql-codegen/testing';\nimport { codegen } from '@graphql-codegen/core';\nimport { buildSchema, parse } from 'graphql';\nimport { TypeScriptResolversPluginConfig } from '../src/config.js';\nimport { plugin } from '../src/index.js';\n\nfunction generate({ schema, config }: { schema: string; config: TypeScriptResolversPluginConfig }) {\n  return codegen({\n    filename: 'graphql.ts',\n    schema: parse(schema),\n    documents: [],\n    plugins: [\n      {\n        'typescript-resolvers': {},\n      },\n    ],\n    config,\n    pluginMap: {\n      'typescript-resolvers': {\n        plugin,\n      },\n    },\n  });\n}\n\ndescribe('TypeScript Resolvers Plugin + Apollo Federation', () => {\n  it('generates __resolveReference for object types with resolvable @key', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        allUsers: [User]\n      }\n\n      type User @key(fields: \"id\") {\n        id: ID!\n        name: String\n        username: String\n      }\n\n      type Book {\n        id: ID!\n      }\n\n      type SingleResolvable @key(fields: \"id\", resolvable: true) {\n        id: ID!\n      }\n\n      type SingleNonResolvable @key(fields: \"id\", resolvable: false) {\n        id: ID!\n      }\n\n      type AtLeastOneResolvable\n        @key(fields: \"id\", resolvable: false)\n        @key(fields: \"id2\", resolvable: true)\n        @key(fields: \"id3\", resolvable: false) {\n        id: ID!\n        id2: ID!\n        id3: ID!\n      }\n\n      type MixedResolvable\n        @key(fields: \"id\")\n        @key(fields: \"id2\", resolvable: true)\n        @key(fields: \"id3\", resolvable: false) {\n        id: ID!\n        id2: ID!\n        id3: ID!\n      }\n\n      type MultipleNonResolvable\n        @key(fields: \"id\", resolvable: false)\n        @key(fields: \"id2\", resolvable: false)\n        @key(fields: \"id3\", resolvable: false) {\n        id: ID!\n        id2: ID!\n        id3: ID!\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).toBeSimilarStringTo(`\n      export type FederationTypes = {\n        User: User;\n        SingleResolvable: SingleResolvable;\n        AtLeastOneResolvable: AtLeastOneResolvable;\n        MixedResolvable: MixedResolvable;\n      };\n    `);\n\n    expect(content).toBeSimilarStringTo(`\n      export type FederationReferenceTypes = {\n        User:\n          ( { __typename: 'User' }\n          & GraphQLRecursivePick<FederationTypes['User'], {\"id\":true}> );\n        SingleResolvable:\n          ( { __typename: 'SingleResolvable' }\n          & GraphQLRecursivePick<FederationTypes['SingleResolvable'], {\"id\":true}> );\n        AtLeastOneResolvable:\n          ( { __typename: 'AtLeastOneResolvable' }\n          & GraphQLRecursivePick<FederationTypes['AtLeastOneResolvable'], {\"id2\":true}> );\n        MixedResolvable:\n          ( { __typename: 'MixedResolvable' }\n          & ( GraphQLRecursivePick<FederationTypes['MixedResolvable'], {\"id\":true}>\n              | GraphQLRecursivePick<FederationTypes['MixedResolvable'], {\"id2\":true}> ) );\n      };\n    `);\n\n    expect(content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        Query: Record<PropertyKey, never>;\n        User: User | FederationReferenceTypes['User'];\n        ID: Scalars['ID']['output'];\n        String: Scalars['String']['output'];\n        Book: Book;\n        SingleResolvable: SingleResolvable | FederationReferenceTypes['SingleResolvable'];\n        SingleNonResolvable: SingleNonResolvable;\n        AtLeastOneResolvable: AtLeastOneResolvable | FederationReferenceTypes['AtLeastOneResolvable'];\n        MixedResolvable: MixedResolvable | FederationReferenceTypes['MixedResolvable'];\n        MultipleNonResolvable: MultipleNonResolvable;\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n\n    // User should have __resolveReference because it has resolvable @key (by default)\n    expect(content).toBeSimilarStringTo(`\n      export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationReferenceType extends FederationReferenceTypes['User'] = FederationReferenceTypes['User']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        name?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n        username?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n      };\n    `);\n\n    // SingleResolvable has __resolveReference because it has resolvable: true\n    expect(content).toBeSimilarStringTo(`\n      export type SingleResolvableResolvers<ContextType = any, ParentType extends ResolversParentTypes['SingleResolvable'] = ResolversParentTypes['SingleResolvable'], FederationReferenceType extends FederationReferenceTypes['SingleResolvable'] = FederationReferenceTypes['SingleResolvable']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['SingleResolvable']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n      };\n    `);\n\n    // SingleNonResolvable does NOT have __resolveReference because it has resolvable: false\n    expect(content).toBeSimilarStringTo(`\n    export type SingleNonResolvableResolvers<ContextType = any, ParentType extends ResolversParentTypes['SingleNonResolvable'] = ResolversParentTypes['SingleNonResolvable']> = {\n      id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n    };\n  `);\n\n    // AtLeastOneResolvable has __resolveReference because it at least one resolvable\n    expect(content).toBeSimilarStringTo(`\n      export type AtLeastOneResolvableResolvers<ContextType = any, ParentType extends ResolversParentTypes['AtLeastOneResolvable'] = ResolversParentTypes['AtLeastOneResolvable'], FederationReferenceType extends FederationReferenceTypes['AtLeastOneResolvable'] = FederationReferenceTypes['AtLeastOneResolvable']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['AtLeastOneResolvable']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        id2?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        id3?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n      };\n    `);\n\n    // MixedResolvable has __resolveReference and references for resolvable keys\n    expect(content).toBeSimilarStringTo(`\n      export type MixedResolvableResolvers<ContextType = any, ParentType extends ResolversParentTypes['MixedResolvable'] = ResolversParentTypes['MixedResolvable'], FederationReferenceType extends FederationReferenceTypes['MixedResolvable'] = FederationReferenceTypes['MixedResolvable']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['MixedResolvable']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        id2?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        id3?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n      };\n    `);\n\n    // MultipleNonResolvableResolvers does NOT have __resolveReference because all keys are non-resolvable\n    expect(content).toBeSimilarStringTo(`\n    export type MultipleNonResolvableResolvers<ContextType = any, ParentType extends ResolversParentTypes['MultipleNonResolvable'] = ResolversParentTypes['MultipleNonResolvable']> = {\n      id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n      id2?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n      id3?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n    };\n  `);\n\n    // Book does NOT have __resolveReference because it doesn't have @key\n    expect(content).toBeSimilarStringTo(`\n    export type BookResolvers<ContextType = any, ParentType extends ResolversParentTypes['Book'] = ResolversParentTypes['Book']> = {\n      id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n    };\n  `);\n  });\n\n  it('should support extend keyword', async () => {\n    const federatedSchema = /* GraphQL */ `\n      extend type Query {\n        allUsers: [User]\n      }\n\n      extend type User @key(fields: \"id\") {\n        id: ID!\n        name: String\n        username: String\n      }\n\n      type Book {\n        id: ID!\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).toBeSimilarStringTo(`\n      export type FederationReferenceTypes = {\n        User:\n          ( { __typename: 'User' }\n          & GraphQLRecursivePick<FederationTypes['User'], {\"id\":true}> );\n      };\n    `);\n\n    // User should have it\n    expect(content).toBeSimilarStringTo(`\n      __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']> | FederationReferenceType, FederationReferenceType, ContextType>;\n    `);\n    // Foo shouldn't because it doesn't have @key\n    expect(content).not.toBeSimilarStringTo(`\n      __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['Book'] | FederationReferenceType>, FederationReferenceType, ContextType>;\n    `);\n  });\n\n  it('should include nested fields from @provides directive', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        users: [User]\n      }\n\n      type Book {\n        author: User @provides(fields: \"name { first last}\")\n      }\n\n      type Name @key(fields: \"id\") {\n        id: ID! @external\n        first: String!\n        middle: String @external\n        last: String!\n      }\n\n      type User @key(fields: \"id\") {\n        id: ID!\n        name: Name @external\n        username: String @external\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).toBeSimilarStringTo(`\n      export type FederationReferenceTypes = {\n        Name:\n          ( { __typename: 'Name' }\n          & GraphQLRecursivePick<FederationTypes['Name'], {\"id\":true}> );\n        User:\n          ( { __typename: 'User' }\n          & GraphQLRecursivePick<FederationTypes['User'], {\"id\":true}> );\n      };\n    `);\n\n    expect(content).toBeSimilarStringTo(`\n      export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationReferenceType extends FederationReferenceTypes['User'] = FederationReferenceTypes['User']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        name?: Resolver<Maybe<ResolversTypes['Name']>, ParentType, ContextType>;\n      };\n    `);\n\n    expect(content).toBeSimilarStringTo(`\n      export type NameResolvers<ContextType = any, ParentType extends ResolversParentTypes['Name'] = ResolversParentTypes['Name'], FederationReferenceType extends FederationReferenceTypes['Name'] = FederationReferenceTypes['Name']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['Name']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        first?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        last?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('should include fields from @requires directive', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        users: [User]\n      }\n\n      type Account @key(fields: \"id\") {\n        id: ID!\n        key: String!\n      }\n\n      type User @key(fields: \"id\") {\n        id: ID!\n\n        a: String @external\n        aRequires: String @requires(fields: \"a\")\n\n        b: String! @external\n        bRequires: String! @requires(fields: \"b\")\n\n        c: String! @external\n        cRequires: String! @requires(fields: \"c\")\n\n        d: String! @external\n        dRequires: String! @requires(fields: \"d\")\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        Query: Record<PropertyKey, never>;\n        Account: Account | FederationReferenceTypes['Account'];\n        ID: Scalars['ID']['output'];\n        String: Scalars['String']['output'];\n        User: User | FederationReferenceTypes['User'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n\n    expect(content).toBeSimilarStringTo(`\n      export type FederationReferenceTypes = {\n        Account:\n          ( { __typename: 'Account' }\n          & GraphQLRecursivePick<FederationTypes['Account'], {\"id\":true}> );\n        User:\n          ( { __typename: 'User' }\n          & GraphQLRecursivePick<FederationTypes['User'], {\"id\":true}>\n          & ( Record<PropertyKey, never>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"a\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"a\":true,\"b\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"a\":true,\"c\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"a\":true,\"d\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"a\":true,\"b\":true,\"c\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"a\":true,\"b\":true,\"d\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"a\":true,\"b\":true,\"c\":true,\"d\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"b\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"b\":true,\"c\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"b\":true,\"d\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"b\":true,\"c\":true,\"d\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"c\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"c\":true,\"d\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"d\":true}> ) );\n      };\n    `);\n\n    // User should have it\n    expect(content).toBeSimilarStringTo(`\n      export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationReferenceType extends FederationReferenceTypes['User'] = FederationReferenceTypes['User']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        aRequires?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n        bRequires?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        cRequires?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        dRequires?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('should handle nested fields from @requires directive', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        users: [User]\n      }\n\n      extend type User @key(fields: \"id\") {\n        id: ID! @external\n\n        favouriteColor: String! @external\n        favouriteColorHex: String! @requires(fields: \"favouriteColor\")\n\n        name: String @external\n        age: Int! @external\n        address: Address! @external\n        username: String @requires(fields: \"name age address { street }\")\n      }\n\n      extend type Address {\n        street: String! @external\n        zip: Int! @external\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).toBeSimilarStringTo(`\n      export type FederationReferenceTypes = {\n        User:\n          ( { __typename: 'User' }\n          & GraphQLRecursivePick<FederationTypes['User'], {\"id\":true}>\n          & ( Record<PropertyKey, never>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"favouriteColor\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"favouriteColor\":true,\"name\":true,\"age\":true,\"address\":{\"street\":true}}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"name\":true,\"age\":true,\"address\":{\"street\":true}}> ) );\n      };\n    `);\n\n    expect(content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        Query: Record<PropertyKey, never>;\n        User: User | FederationReferenceTypes['User'];\n        ID: Scalars['ID']['output'];\n        String: Scalars['String']['output'];\n        Int: Scalars['Int']['output'];\n        Address: Address;\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n\n    expect(content).toBeSimilarStringTo(`\n      export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationReferenceType extends FederationReferenceTypes['User'] = FederationReferenceTypes['User']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        favouriteColorHex?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        username?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('should handle nested fields from @key directive', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        users: [User]\n      }\n\n      type User @key(fields: \"name { first last }\") {\n        name: Name! @external\n        username: String\n      }\n\n      type Name {\n        first: String! @external\n        last: String! @external\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).toBeSimilarStringTo(`\n      export type FederationReferenceTypes = {\n        User:\n          ( { __typename: 'User' }\n          & GraphQLRecursivePick<FederationTypes['User'], {\"name\":{\"first\":true,\"last\":true}}> );\n      };\n    `);\n\n    expect(content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        Query: Record<PropertyKey, never>;\n        User: User | FederationReferenceTypes['User'];\n        String: Scalars['String']['output'];\n        Name: Name;\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n\n    expect(content).toBeSimilarStringTo(`\n      export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationReferenceType extends FederationReferenceTypes['User'] = FederationReferenceTypes['User']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        username?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('handles a mix of @key and @requires directives', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        users: [User]\n      }\n\n      type User @key(fields: \"id\") @key(fields: \"uuid\") @key(fields: \"legacyId { oldId1 oldId2 }\") {\n        id: ID!\n        uuid: ID!\n        legacyId: LegacyId! @external\n        name: String! @external\n        username: String! @requires(fields: \"id name\")\n        usernameLegacy: String! @requires(fields: \"legacyId { oldId1 } name\")\n      }\n\n      type LegacyId {\n        oldId1: ID! @external\n        oldId2: ID! @external\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).toBeSimilarStringTo(`\n      export type FederationReferenceTypes = {\n        User:\n          ( { __typename: 'User' }\n          & ( GraphQLRecursivePick<FederationTypes['User'], {\"id\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"uuid\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"legacyId\":{\"oldId1\":true,\"oldId2\":true}}> )\n          & ( Record<PropertyKey, never>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"id\":true,\"name\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"id\":true,\"name\":true,\"legacyId\":{\"oldId1\":true}}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"legacyId\":{\"oldId1\":true},\"name\":true}> ) );\n      };\n    `);\n\n    expect(content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        Query: Record<PropertyKey, never>;\n        User: User | FederationReferenceTypes['User'];\n        ID: Scalars['ID']['output'];\n        String: Scalars['String']['output'];\n        LegacyId: LegacyId;\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n\n    expect(content).toBeSimilarStringTo(`\n      export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationReferenceType extends FederationReferenceTypes['User'] = FederationReferenceTypes['User']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        uuid?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        username?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        usernameLegacy?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('should not apply key/requires fields restriction for base federated types', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        users: [User]\n      }\n\n      type User @key(fields: \"name { first last }\") {\n        name: Name!\n        username: String\n      }\n\n      type Name {\n        first: String!\n        last: String!\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).toBeSimilarStringTo(`\n      export type FederationReferenceTypes = {\n        User:\n          ( { __typename: 'User' }\n            & GraphQLRecursivePick<FederationTypes['User'], {\"name\":{\"first\":true,\"last\":true}}> );\n      };\n    `);\n\n    expect(content).toBeSimilarStringTo(`\n      export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationReferenceType extends FederationReferenceTypes['User'] = FederationReferenceTypes['User']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        name?: Resolver<ResolversTypes['Name'], ParentType, ContextType>;\n        username?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('should skip to generate resolvers of fields or object types with @external directive', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        users: [User]\n      }\n\n      type Book {\n        author: User @provides(fields: \"name\")\n        editor: User @provides(fields: \"company { taxCode }\")\n      }\n\n      type User @key(fields: \"id\") {\n        id: ID!\n        name: String @external\n        username: String @external\n        address: Address\n        dateOfBirth: DateOfBirth\n        placeOfBirth: PlaceOfBirth\n        company: Company\n      }\n\n      type Address {\n        street: String! @external\n        zip: String!\n      }\n\n      type DateOfBirth {\n        day: Int! @external\n        month: Int! @external\n        year: Int! @external\n      }\n\n      type PlaceOfBirth @external {\n        city: String!\n        country: String!\n      }\n\n      type Company @external {\n        name: String!\n        taxCode: String!\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).toBeSimilarStringTo(`\n      export type FederationReferenceTypes = {\n        User:\n          ( { __typename: 'User' }\n          & GraphQLRecursivePick<FederationTypes['User'], {\"id\":true}> );\n      };\n    `);\n\n    // `UserResolvers` should not have `username` resolver because it is marked with `@external`\n    // `UserResolvers` should have `name` resolver because whilst it is marked with `@external`, it is provided by `Book.author`\n    expect(content).toBeSimilarStringTo(`\n      export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationReferenceType extends FederationReferenceTypes['User'] = FederationReferenceTypes['User']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        name?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n        address?: Resolver<Maybe<ResolversTypes['Address']>, ParentType, ContextType>;\n        dateOfBirth?: Resolver<Maybe<ResolversTypes['DateOfBirth']>, ParentType, ContextType>;\n        placeOfBirth?: Resolver<Maybe<ResolversTypes['PlaceOfBirth']>, ParentType, ContextType>;\n        company?: Resolver<Maybe<ResolversTypes['Company']>, ParentType, ContextType>;\n      };\n    `);\n\n    // `AddressResolvers` should only have fields not marked with @external\n    expect(content).toBeSimilarStringTo(`\n      export type AddressResolvers<ContextType = any, ParentType extends ResolversParentTypes['Address'] = ResolversParentTypes['Address']> = {\n        zip?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n      };\n    `);\n\n    // `DateOfBirthResolvers` should not be generated because every field is marked with @external\n    expect(content).not.toBeSimilarStringTo('export type DateOfBirthResolvers');\n\n    // `PlaceOfBirthResolvers` should not be generated because the type is marked with @external, even if `User.placeOfBirth` is not marked with @external\n    expect(content).not.toBeSimilarStringTo('export type PlaceOfBirthResolvers');\n\n    // FIXME: `CompanyResolvers` should only have taxCode resolver because it is part of the `@provides` directive in `Book.editor`, even if the whole `Company` type is marked with @external\n    // expect(content).toBeSimilarStringTo(`\n    //   export type CompanyResolvers<ContextType = any, ParentType extends ResolversParentTypes['Company'] = ResolversParentTypes['Company']> = {\n    //     taxCode?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n    //   };\n    // `);\n  });\n\n  it('should not include _FieldSet scalar', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        users: [User]\n      }\n\n      type User @key(fields: \"id\") {\n        id: ID!\n        name: String\n        username: String\n      }\n\n      type Book {\n        id: ID!\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).not.toMatch(`_FieldSet`);\n  });\n\n  it('should not include federation directives', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        users: [User]\n      }\n\n      type User @key(fields: \"id\") {\n        id: ID!\n        name: String\n        username: String\n      }\n\n      type Book {\n        id: ID!\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).not.toMatch('ExternalDirectiveResolver');\n    expect(content).not.toMatch('RequiresDirectiveResolver');\n    expect(content).not.toMatch('ProvidesDirectiveResolver');\n    expect(content).not.toMatch('KeyDirectiveResolver');\n  });\n\n  it('should not add directive definitions and scalars if they are already there', async () => {\n    const federatedSchema = /* GraphQL */ `\n      scalar _FieldSet\n\n      directive @key(fields: _FieldSet!) on OBJECT | INTERFACE\n\n      type Query {\n        allUsers: [User]\n      }\n\n      type User @key(fields: \"id\") {\n        id: ID!\n        name: String\n        username: String\n      }\n\n      type Book {\n        id: ID!\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).not.toMatch(`_FieldSet`);\n    expect(content).not.toMatch('ExternalDirectiveResolver');\n    expect(content).not.toMatch('RequiresDirectiveResolver');\n    expect(content).not.toMatch('ProvidesDirectiveResolver');\n    expect(content).not.toMatch('KeyDirectiveResolver');\n  });\n\n  it('should allow for duplicated directives', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        allUsers: [User]\n      }\n\n      extend type User @key(fields: \"id\") @key(fields: \"name\") {\n        id: ID! @external\n        name: String\n        username: String\n      }\n\n      type Book {\n        id: ID!\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    expect(content).toBeSimilarStringTo(`\n      export type FederationReferenceTypes = {\n        User:\n          ( { __typename: 'User' }\n          & ( GraphQLRecursivePick<FederationTypes['User'], {\"id\":true}>\n              | GraphQLRecursivePick<FederationTypes['User'], {\"name\":true}> ) );\n      };\n    `);\n\n    // User should have it\n    expect(content).toBeSimilarStringTo(`\n      export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'], FederationReferenceType extends FederationReferenceTypes['User'] = FederationReferenceTypes['User']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']> | FederationReferenceType, FederationReferenceType, ContextType>;\n        name?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n        username?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it.skip('should only extend an original type by a mapped type', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        users: [User]\n      }\n\n      type User @key(fields: \"id\") {\n        id: ID!\n        name: String\n        age: Int!\n        username: String\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n        mappers: {\n          User: 'UserExtension',\n        },\n      },\n    });\n\n    // User should have it\n    expect(content).toBeSimilarStringTo(`\n      export type UserResolvers<ContextType = any, ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']> = {\n        __resolveReference?: ReferenceResolver<Maybe<ResolversTypes['User']>, { __typename: 'User' } & Pick<ParentType, 'id'>, ContextType>;\n        id?: Resolver<ResolversTypes['ID'], UserExtension & ParentType, ContextType>;\n        username?: Resolver<Maybe<ResolversTypes['String']>, UserExtension & ParentType & Pick<ParentType, 'name', 'age'>, ContextType>;\n      };\n    `);\n  });\n\n  it('should not generate unused scalars', async () => {\n    const federatedSchema = /* GraphQL */ `\n      type Query {\n        user(id: ID!): User!\n      }\n\n      type User {\n        id: ID!\n        username: String!\n      }\n    `;\n\n    const content = await generate({\n      schema: federatedSchema,\n      config: {\n        federation: true,\n      },\n    });\n\n    // no GraphQLScalarTypeConfig\n    expect(content).not.toContain('GraphQLScalarTypeConfig');\n    // no GraphQLScalarType\n    expect(content).not.toContain('GraphQLScalarType');\n  });\n\n  describe('meta', () => {\n    it('generates federation meta correctly', async () => {\n      const federatedSchema = /* GraphQL */ `\n        scalar _FieldSet\n        directive @key(fields: _FieldSet!, resolvable: Boolean) repeatable on OBJECT | INTERFACE\n\n        type Query {\n          user: UserPayload!\n          allUsers: [User]\n        }\n\n        type User @key(fields: \"id\") {\n          id: ID!\n          name: String\n          username: String\n        }\n\n        interface Node {\n          id: ID!\n        }\n\n        type UserOk {\n          id: ID!\n        }\n        type UserError {\n          message: String!\n        }\n        union UserPayload = UserOk | UserError\n\n        enum Country {\n          FR\n          US\n        }\n\n        type NotResolvable @key(fields: \"id\", resolvable: false) {\n          id: ID!\n        }\n\n        type Resolvable @key(fields: \"id\", resolvable: true) {\n          id: ID!\n        }\n\n        type MultipleResolvable\n          @key(fields: \"id\")\n          @key(fields: \"id2\", resolvable: true)\n          @key(fields: \"id3\", resolvable: false) {\n          id: ID!\n          id2: ID!\n          id3: ID!\n        }\n\n        type MultipleNonResolvable\n          @key(fields: \"id\", resolvable: false)\n          @key(fields: \"id2\", resolvable: false)\n          @key(fields: \"id3\", resolvable: false) {\n          id: ID!\n          id2: ID!\n          id3: ID!\n        }\n      `;\n\n      const result = await plugin(buildSchema(federatedSchema), [], { federation: true }, { outputFile: '' });\n\n      expect(result.meta?.generatedResolverTypes).toMatchInlineSnapshot(`\n        {\n          \"resolversMap\": {\n            \"name\": \"Resolvers\",\n          },\n          \"userDefined\": {\n            \"MultipleNonResolvable\": {\n              \"hasIsTypeOf\": false,\n              \"name\": \"MultipleNonResolvableResolvers\",\n            },\n            \"MultipleResolvable\": {\n              \"federation\": {\n                \"hasResolveReference\": true,\n              },\n              \"hasIsTypeOf\": false,\n              \"name\": \"MultipleResolvableResolvers\",\n            },\n            \"Node\": {\n              \"hasIsTypeOf\": false,\n              \"name\": \"NodeResolvers\",\n            },\n            \"NotResolvable\": {\n              \"hasIsTypeOf\": false,\n              \"name\": \"NotResolvableResolvers\",\n            },\n            \"Query\": {\n              \"hasIsTypeOf\": false,\n              \"name\": \"QueryResolvers\",\n            },\n            \"Resolvable\": {\n              \"federation\": {\n                \"hasResolveReference\": true,\n              },\n              \"hasIsTypeOf\": false,\n              \"name\": \"ResolvableResolvers\",\n            },\n            \"User\": {\n              \"federation\": {\n                \"hasResolveReference\": true,\n              },\n              \"hasIsTypeOf\": false,\n              \"name\": \"UserResolvers\",\n            },\n            \"UserError\": {\n              \"hasIsTypeOf\": true,\n              \"name\": \"UserErrorResolvers\",\n            },\n            \"UserOk\": {\n              \"hasIsTypeOf\": true,\n              \"name\": \"UserOkResolvers\",\n            },\n            \"UserPayload\": {\n              \"hasIsTypeOf\": false,\n              \"name\": \"UserPayloadResolvers\",\n            },\n          },\n        }\n      `);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/ts-resolvers.interface.spec.ts",
    "content": "import { resolversTestingSchema } from '@graphql-codegen/testing';\nimport { buildSchema } from 'graphql';\nimport { plugin } from '../src/index.js';\n\ndescribe('TypeScript Resolvers Plugin - Interfaces', () => {\n  it('should generate ResolversInterfaceTypes', async () => {\n    const content = await plugin(resolversTestingSchema, [], {}, { outputFile: 'graphql.ts' });\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChild: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n      };\n    `);\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        MyType: ResolverTypeWrapper<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']> }>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n        MyOtherType: ResolverTypeWrapper<MyOtherType>;\n        ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        SomeNode: ResolverTypeWrapper<SomeNode>;\n        AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n        WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n        WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n        AnotherNodeWithChild: ResolverTypeWrapper<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']> }>;\n        AnotherNodeWithAll: ResolverTypeWrapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n        MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n        MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n        Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']> };\n        String: Scalars['String']['output'];\n        Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n        MyOtherType: MyOtherType;\n        ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: Scalars['ID']['output'];\n        SomeNode: SomeNode;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']> };\n        AnotherNodeWithAll: Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n        MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n        MyScalar: Scalars['MyScalar']['output'];\n        Int: Scalars['Int']['output'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('should generate ResolversInterfaceTypes with transformed type names correctly', async () => {\n    const content = await plugin(\n      resolversTestingSchema,\n      [],\n      { typesPrefix: 'I_', typesSuffix: '_Types' },\n      { outputFile: 'graphql.ts' }\n    );\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type I_ResolversInterfaceTypes_Types<_RefType extends Record<string, unknown>> = {\n        Node: ( I_SomeNode_Types );\n        AnotherNode: ( Omit<I_AnotherNodeWithChild_Types, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<I_AnotherNodeWithAll_Types, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChild: ( Omit<I_AnotherNodeWithChild_Types, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<I_AnotherNodeWithAll_Types, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChildren: ( Omit<I_AnotherNodeWithAll_Types, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n      };\n    `);\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type I_ResolversTypes_Types = {\n        MyType: ResolverTypeWrapper<Omit<I_MyType_Types, 'unionChild'> & { unionChild?: Maybe<I_ResolversTypes_Types['ChildUnion']> }>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        Child: ResolverTypeWrapper<Omit<I_Child_Types, 'parent'> & { parent?: Maybe<I_ResolversTypes_Types['MyType']> }>;\n        MyOtherType: ResolverTypeWrapper<I_MyOtherType_Types>;\n        ChildUnion: ResolverTypeWrapper<I_ResolversUnionTypes_Types<I_ResolversTypes_Types>['ChildUnion']>;\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Node: ResolverTypeWrapper<I_ResolversInterfaceTypes_Types<I_ResolversTypes_Types>['Node']>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        SomeNode: ResolverTypeWrapper<I_SomeNode_Types>;\n        AnotherNode: ResolverTypeWrapper<I_ResolversInterfaceTypes_Types<I_ResolversTypes_Types>['AnotherNode']>;\n        WithChild: ResolverTypeWrapper<I_ResolversInterfaceTypes_Types<I_ResolversTypes_Types>['WithChild']>;\n        WithChildren: ResolverTypeWrapper<I_ResolversInterfaceTypes_Types<I_ResolversTypes_Types>['WithChildren']>;\n        AnotherNodeWithChild: ResolverTypeWrapper<Omit<I_AnotherNodeWithChild_Types, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<I_ResolversTypes_Types['ChildUnion']>, interfaceChild?: Maybe<I_ResolversTypes_Types['Node']> }>;\n        AnotherNodeWithAll: ResolverTypeWrapper<Omit<I_AnotherNodeWithAll_Types, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<I_ResolversTypes_Types['ChildUnion']>, unionChildren: Array<I_ResolversTypes_Types['ChildUnion']>, interfaceChild?: Maybe<I_ResolversTypes_Types['Node']>, interfaceChildren: Array<I_ResolversTypes_Types['Node']> }>;\n        MyUnion: ResolverTypeWrapper<I_ResolversUnionTypes_Types<I_ResolversTypes_Types>['MyUnion']>;\n        MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n        Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type I_ResolversParentTypes_Types = {\n        MyType: Omit<I_MyType_Types, 'unionChild'> & { unionChild?: Maybe<I_ResolversParentTypes_Types['ChildUnion']> };\n        String: Scalars['String']['output'];\n        Child: Omit<I_Child_Types, 'parent'> & { parent?: Maybe<I_ResolversParentTypes_Types['MyType']> };\n        MyOtherType: I_MyOtherType_Types;\n        ChildUnion: I_ResolversUnionTypes_Types<I_ResolversParentTypes_Types>['ChildUnion'];\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: I_ResolversInterfaceTypes_Types<I_ResolversParentTypes_Types>['Node'];\n        ID: Scalars['ID']['output'];\n        SomeNode: I_SomeNode_Types;\n        AnotherNode: I_ResolversInterfaceTypes_Types<I_ResolversParentTypes_Types>['AnotherNode'];\n        WithChild: I_ResolversInterfaceTypes_Types<I_ResolversParentTypes_Types>['WithChild'];\n        WithChildren: I_ResolversInterfaceTypes_Types<I_ResolversParentTypes_Types>['WithChildren'];\n        AnotherNodeWithChild: Omit<I_AnotherNodeWithChild_Types, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<I_ResolversParentTypes_Types['ChildUnion']>, interfaceChild?: Maybe<I_ResolversParentTypes_Types['Node']> };\n        AnotherNodeWithAll: Omit<I_AnotherNodeWithAll_Types, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<I_ResolversParentTypes_Types['ChildUnion']>, unionChildren: Array<I_ResolversParentTypes_Types['ChildUnion']>, interfaceChild?: Maybe<I_ResolversParentTypes_Types['Node']>, interfaceChildren: Array<I_ResolversParentTypes_Types['Node']> };\n        MyUnion: I_ResolversUnionTypes_Types<I_ResolversParentTypes_Types>['MyUnion'];\n        MyScalar: Scalars['MyScalar']['output'];\n        Int: Scalars['Int']['output'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('should NOT generate ResolversInterfaceTypes if there is no Interface', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        user(id: ID!): User\n      }\n\n      type User {\n        id: ID!\n        fullName: String!\n      }\n    `);\n    const content = await plugin(testSchema, [], {}, { outputFile: 'graphql.ts' });\n\n    expect(content.content).not.toBeSimilarStringTo(`export type ResolversInterfaceTypes`);\n  });\n\n  it('Should generate valid types even when there are no implementers for an interface', async () => {\n    const schemaWithNoImplementors = buildSchema(/* GraphQL */ `\n      interface Node {\n        id: ID!\n      }\n\n      type Query {\n        node: Node!\n      }\n    `);\n\n    const result = await plugin(schemaWithNoImplementors, [], {}, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<null, ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('generates overridden interface types for interfaces wrapped in object types', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      interface I_Node {\n        id: ID!\n      }\n\n      interface I_WithChild {\n        node: I_Node!\n      }\n\n      interface I_WithChildren {\n        nodes: [I_Node!]!\n      }\n\n      type T_NodeWithChild implements I_Node & I_WithChild {\n        id: ID!\n        node: I_Node\n      }\n\n      type T_NodeWithChildren implements I_Node & I_WithChildren {\n        id: ID!\n        nodes: [I_Node!]!\n      }\n\n      type T_Level1 {\n        boolean: Boolean!\n        string: String!\n        i_node: I_Node!\n        i_withChild: I_WithChild!\n        i_withChildren: I_WithChildren!\n        t_nodeWithChild: T_NodeWithChild!\n        t_nodeWithChildren: T_NodeWithChildren!\n        t_self: T_Level1!\n        t_level2A: T_Level2A!\n        t_level2B: T_Level2B!\n        t_nodeWithNoAbstractFieldLevel1: T_WithNoAbstractFieldLevel1!\n      }\n\n      type T_Level2A {\n        t_level1: T_Level1!\n        t_level1Array: [T_Level1!]!\n      }\n\n      type T_Level2B {\n        t_level3: T_Level3\n      }\n\n      type T_Level3 {\n        t_level4Array: [T_Level4!]!\n      }\n\n      type T_Level4 {\n        node: I_Node!\n      }\n\n      type T_WithNoAbstractFieldLevel1 {\n        id: ID!\n        t_self: [T_WithNoAbstractFieldLevel1!]!\n        t_withNoAbstractFieldLevel2: T_WithNoAbstractFieldLevel2!\n      }\n\n      type T_WithNoAbstractFieldLevel2 {\n        id: ID!\n        t_withNoAbstractFieldLevel3: T_WithNoAbstractFieldLevel3\n      }\n\n      type T_WithNoAbstractFieldLevel3 {\n        id: ID!\n      }\n\n      type Query {\n        level1: T_Level1!\n      }\n    `);\n\n    const result = await plugin(schema, [], {}, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        I_Node: ( Omit<T_NodeWithChild, 'node'> & { node?: Maybe<_RefType['I_Node']> } ) | ( Omit<T_NodeWithChildren, 'nodes'> & { nodes: Array<_RefType['I_Node']> } );\n        I_WithChild: ( Omit<T_NodeWithChild, 'node'> & { node?: Maybe<_RefType['I_Node']> } );\n        I_WithChildren: ( Omit<T_NodeWithChildren, 'nodes'> & { nodes: Array<_RefType['I_Node']> } );\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        I_Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['I_Node']>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        I_WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['I_WithChild']>;\n        I_WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['I_WithChildren']>;\n        T_NodeWithChild: ResolverTypeWrapper<Omit<T_NodeWithChild, 'node'> & { node?: Maybe<ResolversTypes['I_Node']> }>;\n        T_NodeWithChildren: ResolverTypeWrapper<Omit<T_NodeWithChildren, 'nodes'> & { nodes: Array<ResolversTypes['I_Node']> }>;\n        T_Level1: ResolverTypeWrapper<Omit<T_Level1, 'i_node' | 'i_withChild' | 'i_withChildren' | 't_nodeWithChild' | 't_nodeWithChildren' | 't_self' | 't_level2A' | 't_level2B'> & { i_node: ResolversTypes['I_Node'], i_withChild: ResolversTypes['I_WithChild'], i_withChildren: ResolversTypes['I_WithChildren'], t_nodeWithChild: ResolversTypes['T_NodeWithChild'], t_nodeWithChildren: ResolversTypes['T_NodeWithChildren'], t_self: ResolversTypes['T_Level1'], t_level2A: ResolversTypes['T_Level2A'], t_level2B: ResolversTypes['T_Level2B'] }>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        T_Level2A: ResolverTypeWrapper<Omit<T_Level2A, 't_level1' | 't_level1Array'> & { t_level1: ResolversTypes['T_Level1'], t_level1Array: Array<ResolversTypes['T_Level1']> }>;\n        T_Level2B: ResolverTypeWrapper<Omit<T_Level2B, 't_level3'> & { t_level3?: Maybe<ResolversTypes['T_Level3']> }>;\n        T_Level3: ResolverTypeWrapper<Omit<T_Level3, 't_level4Array'> & { t_level4Array: Array<ResolversTypes['T_Level4']> }>;\n        T_Level4: ResolverTypeWrapper<Omit<T_Level4, 'node'> & { node: ResolversTypes['I_Node'] }>;\n        T_WithNoAbstractFieldLevel1: ResolverTypeWrapper<T_WithNoAbstractFieldLevel1>;\n        T_WithNoAbstractFieldLevel2: ResolverTypeWrapper<T_WithNoAbstractFieldLevel2>;\n        T_WithNoAbstractFieldLevel3: ResolverTypeWrapper<T_WithNoAbstractFieldLevel3>;\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        I_Node: ResolversInterfaceTypes<ResolversParentTypes>['I_Node'];\n        ID: Scalars['ID']['output'];\n        I_WithChild: ResolversInterfaceTypes<ResolversParentTypes>['I_WithChild'];\n        I_WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['I_WithChildren'];\n        T_NodeWithChild: Omit<T_NodeWithChild, 'node'> & { node?: Maybe<ResolversParentTypes['I_Node']> };\n        T_NodeWithChildren: Omit<T_NodeWithChildren, 'nodes'> & { nodes: Array<ResolversParentTypes['I_Node']> };\n        T_Level1: Omit<T_Level1, 'i_node' | 'i_withChild' | 'i_withChildren' | 't_nodeWithChild' | 't_nodeWithChildren' | 't_self' | 't_level2A' | 't_level2B'> & { i_node: ResolversParentTypes['I_Node'], i_withChild: ResolversParentTypes['I_WithChild'], i_withChildren: ResolversParentTypes['I_WithChildren'], t_nodeWithChild: ResolversParentTypes['T_NodeWithChild'], t_nodeWithChildren: ResolversParentTypes['T_NodeWithChildren'], t_self: ResolversParentTypes['T_Level1'], t_level2A: ResolversParentTypes['T_Level2A'], t_level2B: ResolversParentTypes['T_Level2B'] };\n        Boolean: Scalars['Boolean']['output'];\n        String: Scalars['String']['output'];\n        T_Level2A: Omit<T_Level2A, 't_level1' | 't_level1Array'> & { t_level1: ResolversParentTypes['T_Level1'], t_level1Array: Array<ResolversParentTypes['T_Level1']> };\n        T_Level2B: Omit<T_Level2B, 't_level3'> & { t_level3?: Maybe<ResolversParentTypes['T_Level3']> };\n        T_Level3: Omit<T_Level3, 't_level4Array'> & { t_level4Array: Array<ResolversParentTypes['T_Level4']> };\n        T_Level4: Omit<T_Level4, 'node'> & { node: ResolversParentTypes['I_Node'] };\n        T_WithNoAbstractFieldLevel1: T_WithNoAbstractFieldLevel1;\n        T_WithNoAbstractFieldLevel2: T_WithNoAbstractFieldLevel2;\n        T_WithNoAbstractFieldLevel3: T_WithNoAbstractFieldLevel3;\n        Query: Record<PropertyKey, never>;\n      };\n    `);\n  });\n\n  it('correctly handles circular reference - variant 1', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      interface I_Node {\n        id: ID!\n      }\n\n      type T_WithNode {\n        node: I_Node!\n      }\n\n      type T_Type1 {\n        id: ID!\n        type2: T_Type2!\n        withNode: T_WithNode! # abstract type is in T_Type1\n      }\n\n      type T_Type2 {\n        id: ID!\n        type1: T_Type1!\n      }\n    `);\n\n    const result = await plugin(schema, [], {}, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        I_Node: never;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        I_Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['I_Node']>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        T_WithNode: ResolverTypeWrapper<Omit<T_WithNode, 'node'> & { node: ResolversTypes['I_Node'] }>;\n        T_Type1: ResolverTypeWrapper<Omit<T_Type1, 'type2' | 'withNode'> & { type2: ResolversTypes['T_Type2'], withNode: ResolversTypes['T_WithNode'] }>;\n        T_Type2: ResolverTypeWrapper<Omit<T_Type2, 'type1'> & { type1: ResolversTypes['T_Type1'] }>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        I_Node: ResolversInterfaceTypes<ResolversParentTypes>['I_Node'];\n        ID: Scalars['ID']['output'];\n        T_WithNode: Omit<T_WithNode, 'node'> & { node: ResolversParentTypes['I_Node'] };\n        T_Type1: Omit<T_Type1, 'type2' | 'withNode'> & { type2: ResolversParentTypes['T_Type2'], withNode: ResolversParentTypes['T_WithNode'] };\n        T_Type2: Omit<T_Type2, 'type1'> & { type1: ResolversParentTypes['T_Type1'] };\n        Boolean: Scalars['Boolean']['output'];\n        String: Scalars['String']['output'];\n      };\n    `);\n  });\n\n  it('correctly handles circular reference - variant 2', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      interface I_Node {\n        id: ID!\n      }\n\n      type T_WithNode {\n        node: I_Node!\n      }\n\n      type T_Type1 {\n        id: ID!\n        type2: T_Type2!\n      }\n\n      type T_Type2 {\n        id: ID!\n        type1: T_Type1!\n        withNode: T_WithNode! # abstract type is in T_Type2\n      }\n    `);\n\n    const result = await plugin(schema, [], {}, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        I_Node: never;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        I_Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['I_Node']>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        T_WithNode: ResolverTypeWrapper<Omit<T_WithNode, 'node'> & { node: ResolversTypes['I_Node'] }>;\n        T_Type1: ResolverTypeWrapper<Omit<T_Type1, 'type2'> & { type2: ResolversTypes['T_Type2'] }>;\n        T_Type2: ResolverTypeWrapper<Omit<T_Type2, 'type1' | 'withNode'> & { type1: ResolversTypes['T_Type1'], withNode: ResolversTypes['T_WithNode'] }>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        I_Node: ResolversInterfaceTypes<ResolversParentTypes>['I_Node'];\n        ID: Scalars['ID']['output'];\n        T_WithNode: Omit<T_WithNode, 'node'> & { node: ResolversParentTypes['I_Node'] };\n        T_Type1: Omit<T_Type1, 'type2'> & { type2: ResolversParentTypes['T_Type2'] };\n        T_Type2: Omit<T_Type2, 'type1' | 'withNode'> & { type1: ResolversParentTypes['T_Type1'], withNode: ResolversParentTypes['T_WithNode'] };\n        Boolean: Scalars['Boolean']['output'];\n        String: Scalars['String']['output'];\n      };\n    `);\n  });\n\n  it('does not generate nested types when avoidCheckingAbstractTypesRecursively=true', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      interface I_Node {\n        id: ID!\n      }\n\n      type T_WithNode {\n        node: I_Node!\n      }\n\n      type T_Type1 {\n        id: ID!\n        type2: T_Type2!\n        withNode: T_WithNode! # abstract type is in T_Type1\n      }\n\n      type T_Type2 {\n        id: ID!\n        type1: T_Type1!\n      }\n    `);\n\n    const result = await plugin(schema, [], { avoidCheckingAbstractTypesRecursively: true }, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        I_Node: never;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        I_Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['I_Node']>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        T_WithNode: ResolverTypeWrapper<Omit<T_WithNode, 'node'> & { node: ResolversTypes['I_Node'] }>;\n        T_Type1: ResolverTypeWrapper<T_Type1>;\n        T_Type2: ResolverTypeWrapper<T_Type2>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        I_Node: ResolversInterfaceTypes<ResolversParentTypes>['I_Node'];\n        ID: Scalars['ID']['output'];\n        T_WithNode: Omit<T_WithNode, 'node'> & { node: ResolversParentTypes['I_Node'] };\n        T_Type1: T_Type1;\n        T_Type2: T_Type2;\n        Boolean: Scalars['Boolean']['output'];\n        String: Scalars['String']['output'];\n      };\n    `);\n  });\n\n  it('generates __isTypeOf for only implementing object types', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      interface Node {\n        id: ID!\n      }\n      type Cat implements Node {\n        id: ID!\n        name: String!\n      }\n      type Dog implements Node {\n        id: ID!\n        isGoodBoy: Boolean!\n      }\n      type Human {\n        _id: ID!\n      }\n    `);\n\n    const result = await plugin(schema, [], {}, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type CatResolvers<ContextType = any, ParentType extends ResolversParentTypes['Cat'] = ResolversParentTypes['Cat']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      }\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type DogResolvers<ContextType = any, ParentType extends ResolversParentTypes['Dog'] = ResolversParentTypes['Dog']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        isGoodBoy?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    // Human does not implement Node, so it does not have __isTypeOf\n    expect(result.content).toBeSimilarStringTo(`\n      export type HumanResolvers<ContextType = any, ParentType extends ResolversParentTypes['Human'] = ResolversParentTypes['Human']> = {\n        _id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n      };\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/ts-resolvers.mapping.spec.ts",
    "content": "import { mergeOutputs, Types } from '@graphql-codegen/plugin-helpers';\nimport { resolversTestingSchema, resolversTestingValidate } from '@graphql-codegen/testing';\nimport { buildSchema } from 'graphql';\nimport { plugin } from '../src/index.js';\n\ndescribe('TypeScript Resolvers Plugin - Mapping', () => {\n  it('Should build ResolversTypes object when there are no mappers', async () => {\n    const result = await plugin(resolversTestingSchema, [], {}, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } ) | ( MyOtherType );\n        MyUnion: ( Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> } ) | ( MyOtherType );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChild: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversTypes = {\n      MyType: ResolverTypeWrapper<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']> }>;\n      String: ResolverTypeWrapper<Scalars['String']['output']>;\n      Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n      MyOtherType: ResolverTypeWrapper<MyOtherType>;\n      ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n      Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n      ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n      SomeNode: ResolverTypeWrapper<SomeNode>;\n      AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n      WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n      WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n      AnotherNodeWithChild: ResolverTypeWrapper<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']> }>;\n      AnotherNodeWithAll: ResolverTypeWrapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n      MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n      MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n      Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n      Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n    };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']> };\n        String: Scalars['String']['output'];\n        Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n        MyOtherType: MyOtherType;\n        ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: Scalars['ID']['output'];\n        SomeNode: SomeNode;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']> };\n        AnotherNodeWithAll: Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n        MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n        MyScalar: Scalars['MyScalar']['output'];\n        Int: Scalars['Int']['output'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('Should build ResolversTypes with simple mappers', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        mappers: {\n          MyType: 'MyTypeDb',\n          AnotherNodeWithChild: 'AnotherNodeWithChildMapper',\n          String: 'number',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'bar' | 'parent'> & { bar: _RefType['String'], parent?: Maybe<_RefType['MyType']> } ) | ( Omit<MyOtherType, 'bar'> & { bar: _RefType['String'] } );\n        MyUnion: ( MyTypeDb ) | ( Omit<MyOtherType, 'bar'> & { bar: _RefType['String'] } );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( AnotherNodeWithChildMapper ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChild: ( AnotherNodeWithChildMapper ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        MyType: ResolverTypeWrapper<MyTypeDb>;\n        String: ResolverTypeWrapper<number>;\n        Child: ResolverTypeWrapper<Omit<Child, 'bar' | 'parent'> & { bar: ResolversTypes['String'], parent?: Maybe<ResolversTypes['MyType']> }>;\n        MyOtherType: ResolverTypeWrapper<Omit<MyOtherType, 'bar'> & { bar: ResolversTypes['String'] }>;\n        ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        SomeNode: ResolverTypeWrapper<SomeNode>;\n        AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n        WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n        WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n        AnotherNodeWithChild: ResolverTypeWrapper<AnotherNodeWithChildMapper>;\n        AnotherNodeWithAll: ResolverTypeWrapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n        MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n        MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n        Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: MyTypeDb;\n        String: number;\n        Child: Omit<Child, 'bar' | 'parent'> & { bar: ResolversParentTypes['String'], parent?: Maybe<ResolversParentTypes['MyType']> };\n        MyOtherType: Omit<MyOtherType, 'bar'> & { bar: ResolversParentTypes['String'] };\n        ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: Scalars['ID']['output'];\n        SomeNode: SomeNode;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: AnotherNodeWithChildMapper;\n        AnotherNodeWithAll: Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n        MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n        MyScalar: Scalars['MyScalar']['output'];\n        Int: Scalars['Int']['output'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('Should allow to map custom type that refers itself (issue #1770)', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Movie {\n        id: ID!\n        title: String!\n      }\n\n      type Book {\n        id: ID!\n        author: String!\n      }\n\n      union MovieLike = Movie | Book\n\n      type NonInterfaceHasNarrative {\n        narrative: MovieLike!\n        movie: Movie!\n      }\n    `);\n    const result = (await plugin(\n      testSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          Movie: 'MovieEntity',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n    const content = mergeOutputs([result]);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        MovieLike: ( MovieEntity ) | ( Book );\n      };\n    `);\n    expect(content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        Movie: ResolverTypeWrapper<MovieEntity>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        Book: ResolverTypeWrapper<Book>;\n        MovieLike: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MovieLike']>;\n        NonInterfaceHasNarrative: ResolverTypeWrapper<Omit<NonInterfaceHasNarrative, 'narrative' | 'movie'> & { narrative: ResolversTypes['MovieLike'], movie: ResolversTypes['Movie'] }>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n    expect(content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        Movie: MovieEntity;\n        ID: Scalars['ID']['output'];\n        String: Scalars['String']['output'];\n        Book: Book;\n        MovieLike: ResolversUnionTypes<ResolversParentTypes>['MovieLike'];\n        NonInterfaceHasNarrative: Omit<NonInterfaceHasNarrative, 'narrative' | 'movie'> & { narrative: ResolversParentTypes['MovieLike'], movie: ResolversParentTypes['Movie'] };\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('Should allow to map custom type that refers itself (issue #1770, attempt #2)', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Movie {\n        id: ID!\n        title: String!\n      }\n\n      type Book {\n        id: ID!\n        author: String!\n      }\n\n      union MovieLike = Movie | Book\n\n      type NonInterfaceHasNarrative {\n        narrative: MovieLike!\n        movie: Movie!\n      }\n\n      type LayerOfIndirection {\n        id: ID!\n        movies: [NonInterfaceHasNarrative!]!\n      }\n\n      type AnotherLayerOfIndirection {\n        inner: LayerOfIndirection!\n      }\n    `);\n    const result = (await plugin(\n      testSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          Movie: 'MovieEntity',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n    const content = mergeOutputs([result]);\n\n    expect(content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        MovieLike: ( MovieEntity ) | ( Book );\n      };\n    `);\n    expect(content).toBeSimilarStringTo(`export type ResolversTypes = {\n      Movie: ResolverTypeWrapper<MovieEntity>;\n      ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n      String: ResolverTypeWrapper<Scalars['String']['output']>;\n      Book: ResolverTypeWrapper<Book>;\n      MovieLike: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MovieLike']>;\n      NonInterfaceHasNarrative: ResolverTypeWrapper<Omit<NonInterfaceHasNarrative, 'narrative' | 'movie'> & { narrative: ResolversTypes['MovieLike'], movie: ResolversTypes['Movie'] }>;\n      LayerOfIndirection: ResolverTypeWrapper<Omit<LayerOfIndirection, 'movies'> & { movies: Array<ResolversTypes['NonInterfaceHasNarrative']> }>;\n      AnotherLayerOfIndirection: ResolverTypeWrapper<Omit<AnotherLayerOfIndirection, 'inner'> & { inner: ResolversTypes['LayerOfIndirection'] }>;\n      Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n    };`);\n    expect(content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        Movie: MovieEntity;\n        ID: Scalars['ID']['output'];\n        String: Scalars['String']['output'];\n        Book: Book;\n        MovieLike: ResolversUnionTypes<ResolversParentTypes>['MovieLike'];\n        NonInterfaceHasNarrative: Omit<NonInterfaceHasNarrative, 'narrative' | 'movie'> & { narrative: ResolversParentTypes['MovieLike'], movie: ResolversParentTypes['Movie'] };\n        LayerOfIndirection: Omit<LayerOfIndirection, 'movies'> & { movies: Array<ResolversParentTypes['NonInterfaceHasNarrative']> };\n        AnotherLayerOfIndirection: Omit<AnotherLayerOfIndirection, 'inner'> & { inner: ResolversParentTypes['LayerOfIndirection'] };\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('Should allow to map custom type that refers itself (issue #1770, attempt #3 - circular)', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Account {\n        id: ID!\n        name: String!\n        programs: [Program!]!\n      }\n\n      type Program {\n        id: ID!\n        name: String!\n        account: Account!\n      }\n    `);\n    const result = (await plugin(\n      testSchema,\n      [],\n      {\n        typesPrefix: 'Gql',\n        defaultMapper: 'Partial<{T}>',\n        namingConvention: {\n          typeNames: 'change-case-all#pascalCase',\n          enumValues: 'change-case-all#upperCase',\n        },\n        noSchemaStitching: true,\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n    const content = mergeOutputs([result]);\n\n    expect(content).toBeSimilarStringTo(`export type GqlResolversTypes = {\n      Account: ResolverTypeWrapper<Partial<GqlAccount>>;\n      ID: ResolverTypeWrapper<Partial<Scalars['ID']['output']>>;\n      String: ResolverTypeWrapper<Partial<Scalars['String']['output']>>;\n      Program: ResolverTypeWrapper<Partial<GqlProgram>>;\n      Boolean: ResolverTypeWrapper<Partial<Scalars['Boolean']['output']>>;\n    };`);\n  });\n\n  it('should map to a custom type on every level (+ actual usage in code)', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type User {\n        id: ID!\n        name: String!\n        chats: [Chat!]\n      }\n\n      type Chat {\n        id: ID!\n        owner: User!\n        members: [User!]\n      }\n\n      type Query {\n        me: User\n      }\n    `);\n    const result = (await plugin(\n      testSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          ID: 'number',\n          Chat: 'number',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    const usage = `\n      const resolvers: Resolvers = {\n        Query: {\n          me() {\n            return {\n              id: 1,\n              name: 'Foo',\n              chats: [0,1,2],\n            };\n          }\n        },\n        Chat: {\n          id(parent) {\n            const id: number = parent;\n            return id;\n          }\n        }\n      }\n    `;\n\n    await resolversTestingValidate(\n      mergeOutputs([usage, result]),\n      {\n        scalars: {\n          ID: 'number',\n        },\n      },\n      testSchema\n    );\n  });\n\n  it('Should build ResolversTypes with defaultMapper set using {T}', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        defaultMapper: 'Partial<{T}>',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Partial<Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> }> ) | ( Partial<MyOtherType> );\n        MyUnion: ( Partial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> }> ) | ( Partial<MyOtherType> );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( Partial<SomeNode> );\n        AnotherNode: ( Partial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> ) | ( Partial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> }> );\n        WithChild: ( Partial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> ) | ( Partial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> }> );\n        WithChildren: ( Partial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> }> );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversTypes = {\n      MyType: ResolverTypeWrapper<Partial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']> }>>;\n      String: ResolverTypeWrapper<Partial<Scalars['String']['output']>>;\n      Child: ResolverTypeWrapper<Partial<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>>;\n      MyOtherType: ResolverTypeWrapper<Partial<MyOtherType>>;\n      ChildUnion: Partial<ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>>;\n      Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n      ID: ResolverTypeWrapper<Partial<Scalars['ID']['output']>>;\n      SomeNode: ResolverTypeWrapper<Partial<SomeNode>>;\n      AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n      WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n      WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n      AnotherNodeWithChild: ResolverTypeWrapper<Partial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']> }>>;\n      AnotherNodeWithAll: ResolverTypeWrapper<Partial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>>;\n      MyUnion: Partial<ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>>;\n      MyScalar: ResolverTypeWrapper<Partial<Scalars['MyScalar']['output']>>;\n      Int: ResolverTypeWrapper<Partial<Scalars['Int']['output']>>;\n      Boolean: ResolverTypeWrapper<Partial<Scalars['Boolean']['output']>>;\n    };`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: Partial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']> }>;\n        String: Partial<Scalars['String']['output']>;\n        Child: Partial<Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> }>;\n        MyOtherType: Partial<MyOtherType>;\n        ChildUnion: Partial<ResolversUnionTypes<ResolversParentTypes>['ChildUnion']>;\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: Partial<Scalars['ID']['output']>;\n        SomeNode: Partial<SomeNode>;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: Partial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']> }>;\n        AnotherNodeWithAll: Partial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> }>;\n        MyUnion: Partial<ResolversUnionTypes<ResolversParentTypes>['MyUnion']>;\n        MyScalar: Partial<Scalars['MyScalar']['output']>;\n        Int: Partial<Scalars['Int']['output']>;\n        Boolean: Partial<Scalars['Boolean']['output']>;\n      };\n    `);\n  });\n\n  it('Should build ResolversTypes with defaultMapper set using {T} with external identifier', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        defaultMapper: './my-wrapper#CustomPartial<{T}>',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { CustomPartial } from './my-wrapper';`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( CustomPartial<Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> }> ) | ( CustomPartial<MyOtherType> );\n        MyUnion: ( CustomPartial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> }> ) | ( CustomPartial<MyOtherType> );\n      }\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( CustomPartial<SomeNode> );\n        AnotherNode: ( CustomPartial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> ) | ( CustomPartial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> }> );\n        WithChild: ( CustomPartial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> ) | ( CustomPartial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> }> );\n        WithChildren: ( CustomPartial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> }> );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversTypes = {\n      MyType: ResolverTypeWrapper<CustomPartial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']> }>>;\n      String: ResolverTypeWrapper<CustomPartial<Scalars['String']['output']>>;\n      Child: ResolverTypeWrapper<CustomPartial<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>>;\n      MyOtherType: ResolverTypeWrapper<CustomPartial<MyOtherType>>;\n      ChildUnion: CustomPartial<ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>>;\n      Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n      ID: ResolverTypeWrapper<CustomPartial<Scalars['ID']['output']>>;\n      SomeNode: ResolverTypeWrapper<CustomPartial<SomeNode>>;\n      AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n      WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n      WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n      AnotherNodeWithChild: ResolverTypeWrapper<CustomPartial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']> }>>;\n      AnotherNodeWithAll: ResolverTypeWrapper<CustomPartial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>>;\n      MyUnion: CustomPartial<ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>>;\n      MyScalar: ResolverTypeWrapper<CustomPartial<Scalars['MyScalar']['output']>>;\n      Int: ResolverTypeWrapper<CustomPartial<Scalars['Int']['output']>>;\n      Boolean: ResolverTypeWrapper<CustomPartial<Scalars['Boolean']['output']>>;\n    };`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: CustomPartial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']> }>;\n        String: CustomPartial<Scalars['String']['output']>;\n        Child: CustomPartial<Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> }>;\n        MyOtherType: CustomPartial<MyOtherType>;\n        ChildUnion: CustomPartial<ResolversUnionTypes<ResolversParentTypes>['ChildUnion']>;\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: CustomPartial<Scalars['ID']['output']>;\n        SomeNode: CustomPartial<SomeNode>;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: CustomPartial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']> }>;\n        AnotherNodeWithAll: CustomPartial<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> }>;\n        MyUnion: CustomPartial<ResolversUnionTypes<ResolversParentTypes>['MyUnion']>;\n        MyScalar: CustomPartial<Scalars['MyScalar']['output']>;\n        Int: CustomPartial<Scalars['Int']['output']>;\n        Boolean: CustomPartial<Scalars['Boolean']['output']>;\n      };\n    `);\n  });\n\n  it('Should build ResolversTypes with mapper set for concrete type using {T} with external identifier', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          MyType: './my-wrapper#CustomPartial<{T}>',\n          AnotherNodeWithChild: './my-wrapper#CustomPartial<{T}>',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { CustomPartial } from './my-wrapper';`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } ) | ( MyOtherType );\n        MyUnion: ( CustomPartial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> }> ) | ( MyOtherType );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( CustomPartial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChild: ( CustomPartial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversTypes = {\n      MyType: ResolverTypeWrapper<CustomPartial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']> }>>;\n      String: ResolverTypeWrapper<Scalars['String']['output']>;\n      Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n      MyOtherType: ResolverTypeWrapper<MyOtherType>;\n      ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n      Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n      ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n      SomeNode: ResolverTypeWrapper<SomeNode>;\n      AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n      WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n      WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n      AnotherNodeWithChild: ResolverTypeWrapper<CustomPartial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']> }>>;\n      AnotherNodeWithAll: ResolverTypeWrapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n      MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n      MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n      Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n      Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n    };`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: CustomPartial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']> }>;\n        String: Scalars['String']['output'];\n        Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n        MyOtherType: MyOtherType;\n        ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: Scalars['ID']['output'];\n        SomeNode: SomeNode;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: CustomPartial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']> }>;\n        AnotherNodeWithAll: Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n        MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n        MyScalar: Scalars['MyScalar']['output'];\n        Int: Scalars['Int']['output'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('Should map to a custom type on every level when {T} is used as default mapper', async () => {\n    const config = {\n      scalars: {\n        ID: 'number',\n      },\n      noSchemaStitching: true,\n      defaultMapper: 'Partial<{T}>',\n      mappers: {\n        User: 'number',\n      },\n    };\n    const testSchema = buildSchema(/* GraphQL */ `\n      type User {\n        id: ID!\n        name: String!\n        chats: [Chat!]\n      }\n\n      type Chat {\n        id: ID!\n        owner: User!\n        members: [User!]\n      }\n\n      type Query {\n        me: User\n      }\n    `);\n    const result = await plugin(testSchema, [], config, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        User: ResolverTypeWrapper<number>;\n        ID: ResolverTypeWrapper<Partial<Scalars['ID']['output']>>;\n        String: ResolverTypeWrapper<Partial<Scalars['String']['output']>>;\n        Chat: ResolverTypeWrapper<Partial<Omit<Chat, 'owner' | 'members'> & { owner: ResolversTypes['User'], members?: Maybe<Array<ResolversTypes['User']>> }>>;\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Boolean: ResolverTypeWrapper<Partial<Scalars['Boolean']['output']>>;\n      };\n    `);\n\n    const usage = `\n      const resolvers: Resolvers = {\n        Query: {\n          me() {\n            return 1;\n          }\n        },\n        Chat: {\n          id(chat) {\n            return chat.id;\n          },\n          owner(chat) {\n            const id: number = chat.owner;\n            return id;\n          },\n          members(chat) {\n            const ids: number[] = chat.members;\n            return ids;\n          }\n        },\n        User: {\n          id(parent) {\n            const id: number = parent;\n            return id;\n          }\n        }\n      }\n    `;\n\n    await resolversTestingValidate(mergeOutputs([result, usage]), config, testSchema);\n  });\n\n  it('Should build ResolversTypes with mapper set for concrete type using renamed external identifier', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          MyType: './my-type#MyType as DatabaseMyType',\n          AnotherNodeWithChild: './my-interface#AnotherNodeWithChild as AnotherNodeWithChildMapper',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { MyType as DatabaseMyType } from './my-type';`);\n    expect(result.prepend).toContain(\n      `import { AnotherNodeWithChild as AnotherNodeWithChildMapper } from './my-interface';`\n    );\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } ) | ( MyOtherType );\n        MyUnion: ( DatabaseMyType ) | ( MyOtherType );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( AnotherNodeWithChildMapper ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChild: ( AnotherNodeWithChildMapper ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversTypes = {\n      MyType: ResolverTypeWrapper<DatabaseMyType>;\n      String: ResolverTypeWrapper<Scalars['String']['output']>;\n      Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n      MyOtherType: ResolverTypeWrapper<MyOtherType>;\n      ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n      Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n      ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n      SomeNode: ResolverTypeWrapper<SomeNode>;\n      AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n      WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n      WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n      AnotherNodeWithChild: ResolverTypeWrapper<AnotherNodeWithChildMapper>;\n      AnotherNodeWithAll: ResolverTypeWrapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n      MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n      MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n      Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n      Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n    };`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: DatabaseMyType;\n        String: Scalars['String']['output'];\n        Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n        MyOtherType: MyOtherType;\n        ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: Scalars['ID']['output'];\n        SomeNode: SomeNode;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: AnotherNodeWithChildMapper;\n        AnotherNodeWithAll: Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n        MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n        MyScalar: Scalars['MyScalar']['output'];\n        Int: Scalars['Int']['output'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('Should build ResolversTypes with mapper set for concrete type using renamed external identifier (with default)', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          MyOtherType: './my-type#default as DatabaseMyOtherType',\n          MyType: './my-type#MyType as DatabaseMyType',\n          AnotherNodeWithChild: './my-interface#default as AnotherNodeWithChildMapper',\n          AnotherNodeWithAll: './my-interface#AnotherNodeWithAll as AnotherNodeWithAllMapper',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import DatabaseMyOtherType, { MyType as DatabaseMyType } from './my-type';`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } ) | ( DatabaseMyOtherType );\n        MyUnion: ( DatabaseMyType ) | ( DatabaseMyOtherType );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( AnotherNodeWithChildMapper ) | ( AnotherNodeWithAllMapper );\n        WithChild: ( AnotherNodeWithChildMapper ) | ( AnotherNodeWithAllMapper );\n        WithChildren: ( AnotherNodeWithAllMapper );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversTypes = {\n      MyType: ResolverTypeWrapper<DatabaseMyType>;\n      String: ResolverTypeWrapper<Scalars['String']['output']>;\n      Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n      MyOtherType: ResolverTypeWrapper<DatabaseMyOtherType>;\n      ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n      Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n      ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n      SomeNode: ResolverTypeWrapper<SomeNode>;\n      AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n      WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n      WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n      AnotherNodeWithChild: ResolverTypeWrapper<AnotherNodeWithChildMapper>;\n      AnotherNodeWithAll: ResolverTypeWrapper<AnotherNodeWithAllMapper>;\n      MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n      MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n      Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n      Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n    };`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: DatabaseMyType;\n        String: Scalars['String']['output'];\n        Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n        MyOtherType: DatabaseMyOtherType;\n        ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: Scalars['ID']['output'];\n        SomeNode: SomeNode;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: AnotherNodeWithChildMapper;\n        AnotherNodeWithAll: AnotherNodeWithAllMapper;\n        MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n        MyScalar: Scalars['MyScalar']['output'];\n        Int: Scalars['Int']['output'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('Should build ResolversTypes with mapper set for concrete type using renamed external identifier (with default) and type import', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          MyOtherType: './my-type#default as DatabaseMyOtherType',\n          MyType: './my-type#MyType as DatabaseMyType',\n          AnotherNodeWithChild: './my-interface#default as AnotherNodeWithChildMapper',\n          AnotherNodeWithAll: './my-interface#AnotherNodeWithAll as AnotherNodeWithAllMapper',\n        },\n        useTypeImports: true,\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(\n      `import type { default as DatabaseMyOtherType, MyType as DatabaseMyType } from './my-type';`\n    );\n    expect(result.prepend).toContain(\n      `import type { default as AnotherNodeWithChildMapper, AnotherNodeWithAll as AnotherNodeWithAllMapper } from './my-interface';`\n    );\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } ) | ( DatabaseMyOtherType );\n        MyUnion: ( DatabaseMyType ) | ( DatabaseMyOtherType );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( AnotherNodeWithChildMapper ) | ( AnotherNodeWithAllMapper );\n        WithChild: ( AnotherNodeWithChildMapper ) | ( AnotherNodeWithAllMapper );\n        WithChildren: ( AnotherNodeWithAllMapper );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversTypes = {\n      MyType: ResolverTypeWrapper<DatabaseMyType>;\n      String: ResolverTypeWrapper<Scalars['String']['output']>;\n      Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n      MyOtherType: ResolverTypeWrapper<DatabaseMyOtherType>;\n      ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n      Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n      ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n      SomeNode: ResolverTypeWrapper<SomeNode>;\n      AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n      WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n      WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n      AnotherNodeWithChild: ResolverTypeWrapper<AnotherNodeWithChildMapper>;\n      AnotherNodeWithAll: ResolverTypeWrapper<AnotherNodeWithAllMapper>;\n      MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n      MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n      Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n      Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n    };`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: DatabaseMyType;\n        String: Scalars['String']['output'];\n        Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n        MyOtherType: DatabaseMyOtherType;\n        ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: Scalars['ID']['output'];\n        SomeNode: SomeNode;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: AnotherNodeWithChildMapper;\n        AnotherNodeWithAll: AnotherNodeWithAllMapper;\n        MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n        MyScalar: Scalars['MyScalar']['output'];\n        Int: Scalars['Int']['output'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('Should build ResolversTypes with defaultMapper set', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          MyType: 'MyTypeDb',\n          String: 'string',\n        },\n        defaultMapper: 'any',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).not.toBeSimilarStringTo(`export type ResolversUnionTypes`);\n    expect(result.content).not.toBeSimilarStringTo(`export type ResolversInterfaceTypes`);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversTypes = {\n      MyType: ResolverTypeWrapper<MyTypeDb>;\n      String: ResolverTypeWrapper<string>;\n      Child: ResolverTypeWrapper<any>;\n      MyOtherType: ResolverTypeWrapper<any>;\n      ChildUnion: ResolverTypeWrapper<any>;\n      Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Node: ResolverTypeWrapper<any>;\n      ID: ResolverTypeWrapper<any>;\n      SomeNode: ResolverTypeWrapper<any>;\n      AnotherNode: ResolverTypeWrapper<any>;\n      WithChild: ResolverTypeWrapper<any>;\n      WithChildren: ResolverTypeWrapper<any>;\n      AnotherNodeWithChild: ResolverTypeWrapper<any>;\n      AnotherNodeWithAll: ResolverTypeWrapper<any>;\n      MyUnion: ResolverTypeWrapper<any>;\n      MyScalar: ResolverTypeWrapper<any>;\n      Int: ResolverTypeWrapper<any>;\n      Boolean: ResolverTypeWrapper<any>;\n    };`);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversParentTypes = {\n      MyType: MyTypeDb;\n      String: string;\n      Child: any;\n      MyOtherType: any;\n      ChildUnion: any;\n      Query: Record<PropertyKey, never>;\n      Subscription: Record<PropertyKey, never>;\n      Node: any;\n      ID: any;\n      SomeNode: any;\n      AnotherNode: any;\n      WithChild: any;\n      WithChildren: any;\n      AnotherNodeWithChild: any;\n      AnotherNodeWithAll: any;\n      MyUnion: any;\n      MyScalar: any;\n      Int: any;\n      Boolean: any;\n    };`);\n  });\n\n  it('Should build ResolversTypes with external mappers', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          MyOtherType: './my-module#CustomMyOtherType',\n          MyType: 'MyTypeDb',\n          AnotherNodeWithChild: './my-interface#AnotherNodeWithChildMapper',\n          AnotherNodeWithAll: 'AnotherNodeWithAllMapper',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } ) | ( CustomMyOtherType );\n        MyUnion: ( MyTypeDb ) | ( CustomMyOtherType );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( AnotherNodeWithChildMapper ) | ( AnotherNodeWithAllMapper );\n        WithChild: ( AnotherNodeWithChildMapper ) | ( AnotherNodeWithAllMapper );\n        WithChildren: ( AnotherNodeWithAllMapper );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversTypes = {\n      MyType: ResolverTypeWrapper<MyTypeDb>;\n      String: ResolverTypeWrapper<Scalars['String']['output']>;\n      Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n      MyOtherType: ResolverTypeWrapper<CustomMyOtherType>;\n      ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n      Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n      ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n      SomeNode: ResolverTypeWrapper<SomeNode>;\n      AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n      WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n      WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n      AnotherNodeWithChild: ResolverTypeWrapper<AnotherNodeWithChildMapper>;\n      AnotherNodeWithAll: ResolverTypeWrapper<AnotherNodeWithAllMapper>;\n      MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n      MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n      Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n      Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n    };`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: MyTypeDb;\n        String: Scalars['String']['output'];\n        Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n        MyOtherType: CustomMyOtherType;\n        ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: Scalars['ID']['output'];\n        SomeNode: SomeNode;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: AnotherNodeWithChildMapper;\n        AnotherNodeWithAll: AnotherNodeWithAllMapper;\n        MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n        MyScalar: Scalars['MyScalar']['output'];\n        Int: Scalars['Int']['output'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('Should handle {T} in a mapper', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          MyType: 'Partial<{T}>',\n          AnotherNodeWithChild: 'ExtraPartial<{T}>',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } ) | ( MyOtherType );\n        MyUnion: ( Partial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> }> ) | ( MyOtherType );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( ExtraPartial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChild: ( ExtraPartial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        MyType: ResolverTypeWrapper<Partial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']> }>>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n        MyOtherType: ResolverTypeWrapper<MyOtherType>;\n        ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        SomeNode: ResolverTypeWrapper<SomeNode>;\n        AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n        WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n        WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n        AnotherNodeWithChild: ResolverTypeWrapper<ExtraPartial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']> }>>;\n        AnotherNodeWithAll: ResolverTypeWrapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n        MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n        MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n        Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: Partial<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']> }>;\n        String: Scalars['String']['output'];\n        Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n        MyOtherType: MyOtherType;\n        ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: Scalars['ID']['output'];\n        SomeNode: SomeNode;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: ExtraPartial<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']> }>;\n        AnotherNodeWithAll: Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n        MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n        MyScalar: Scalars['MyScalar']['output'];\n        Int: Scalars['Int']['output'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('should warn about unused mappers by default', async () => {\n    const spy = vi.spyOn(console, 'warn').mockImplementation(() => {});\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        comments: [Comment!]!\n      }\n\n      type User {\n        id: ID!\n        name: String!\n      }\n\n      type Comment {\n        id: ID!\n        text: String!\n        author: User!\n      }\n    `);\n\n    await plugin(\n      testSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          Comment: 'number',\n          Post: 'string',\n        },\n      },\n      {\n        outputFile: 'graphql.ts',\n      }\n    );\n\n    expect(spy).toHaveBeenCalledWith('Unused mappers: Post');\n    spy.mockRestore();\n  });\n\n  it('should be able not to warn about unused mappers', async () => {\n    const spy = vi.spyOn(console, 'warn').mockImplementation(() => {});\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        comments: [Comment!]!\n      }\n\n      type User {\n        id: ID!\n        name: String!\n      }\n\n      type Comment {\n        id: ID!\n        text: String!\n        author: User!\n      }\n    `);\n\n    await plugin(\n      testSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          Comment: 'number',\n          Post: 'string',\n        },\n        showUnusedMappers: false,\n      },\n      {\n        outputFile: 'graphql.ts',\n      }\n    );\n\n    expect(spy).not.toHaveBeenCalled();\n    spy.mockRestore();\n  });\n\n  it('Should generate basic type resolvers with external mappers', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          MyOtherType: './my-file#MyCustomOtherType',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { MyCustomOtherType } from './my-file';`);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveArgs = {\n      arg: Scalars['Int']['input'];\n      arg2: Scalars['String']['input'];\n      arg3: Scalars['Boolean']['input'];\n    };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveResolver<Result, Parent, ContextType = any, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;`);\n\n    expect(result.content).toBeSimilarStringTo(`\n        export type MyOtherTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = {\n          bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n          __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n        };\n      `);\n\n    expect(result.content)\n      .toBeSimilarStringTo(`export interface MyScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['MyScalar'], any> {\n      name: 'MyScalar';\n        }\n      `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SomeNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n      };\n    `);\n    await resolversTestingValidate(result);\n  });\n\n  it('Should generate basic type resolvers with external mappers using same imported type', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          MyType: './my-file#MyCustomOtherType',\n          MyOtherType: './my-file#MyCustomOtherType',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { MyCustomOtherType } from './my-file';`);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveArgs = {\n      arg: Scalars['Int']['input'];\n      arg2: Scalars['String']['input'];\n      arg3: Scalars['Boolean']['input'];\n    };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveResolver<Result, Parent, ContextType = any, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;`);\n\n    expect(result.content).toBeSimilarStringTo(`\n        export type MyOtherTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = {\n          bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n          __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n        };\n      `);\n\n    expect(result.content)\n      .toBeSimilarStringTo(`export interface MyScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['MyScalar'], any> {\n      name: 'MyScalar';\n        }\n      `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SomeNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n      };\n    `);\n    await resolversTestingValidate(result);\n  });\n\n  it('Should generate the correct resolvers when used with mappers with interfaces', async () => {\n    const spy = vi.spyOn(console, 'warn').mockImplementation(() => {});\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          Node: 'MyNodeType',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveArgs = {\n      arg: Scalars['Int']['input'];\n      arg2: Scalars['String']['input'];\n      arg3: Scalars['Boolean']['input'];\n    };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveResolver<Result, Parent, ContextType = any, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyOtherTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = {\n        bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export interface MyScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['MyScalar'], any> {\n        name: 'MyScalar';\n      }\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SomeNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n      };\n    `);\n    await resolversTestingValidate(mergeOutputs([result, `type MyNodeType = {};`]));\n\n    spy.mockRestore();\n  });\n\n  it('Should generate basic type resolvers with defaultMapper set to any', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        defaultMapper: 'any',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyOtherTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = {\n        bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export interface MyScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['MyScalar'], any> {\n        name: 'MyScalar';\n      }\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SomeNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n      };\n    `);\n    await resolversTestingValidate(result);\n  });\n\n  it('Should generate basic type resolvers with defaultMapper set to external identifier', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        defaultMapper: './my-file#MyBaseType',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { MyBaseType } from './my-file';`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyOtherTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = {\n        bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export interface MyScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['MyScalar'], any> {\n        name: 'MyScalar';\n      }\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SomeNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n      };\n    `);\n    await resolversTestingValidate(result);\n  });\n\n  it('Should replace using Omit when non-mapped type is pointing to mapped type', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          MyOtherType: 'MyOtherTypeCustom',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } ) | ( MyOtherTypeCustom );\n        MyUnion: ( Omit<MyType, 'otherType' | 'unionChild'> & { otherType?: Maybe<_RefType['MyOtherType']>, unionChild?: Maybe<_RefType['ChildUnion']> } ) | ( MyOtherTypeCustom );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChild: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversTypes = {\n      MyType: ResolverTypeWrapper<Omit<MyType, 'otherType' | 'unionChild'> & { otherType?: Maybe<ResolversTypes['MyOtherType']>, unionChild?: Maybe<ResolversTypes['ChildUnion']> }>;\n      String: ResolverTypeWrapper<Scalars['String']['output']>;\n      Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n      MyOtherType: ResolverTypeWrapper<MyOtherTypeCustom>;\n      ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n      Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n      ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n      SomeNode: ResolverTypeWrapper<SomeNode>;\n      AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n      WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n      WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n      AnotherNodeWithChild: ResolverTypeWrapper<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']> }>;\n      AnotherNodeWithAll: ResolverTypeWrapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n      MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n      MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n      Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n      Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n    };`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: Omit<MyType, 'otherType' | 'unionChild'> & { otherType?: Maybe<ResolversParentTypes['MyOtherType']>, unionChild?: Maybe<ResolversParentTypes['ChildUnion']> };\n        String: Scalars['String']['output'];\n        Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n        MyOtherType: MyOtherTypeCustom;\n        ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: Scalars['ID']['output'];\n        SomeNode: SomeNode;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']> };\n        AnotherNodeWithAll: Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n        MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n        MyScalar: Scalars['MyScalar']['output'];\n        Int: Scalars['Int']['output'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n    await resolversTestingValidate(mergeOutputs([result, 'type MyOtherTypeCustom = {};']));\n  });\n\n  it('Should not replace using Omit when non-mapped type is pointing to mapped type', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          MyOtherType: 'MyOtherTypeCustom',\n          MyType: 'MyTypeCustom',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } ) | ( MyOtherTypeCustom );\n        MyUnion: ( MyTypeCustom ) | ( MyOtherTypeCustom );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChild: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversTypes = {\n      MyType: ResolverTypeWrapper<MyTypeCustom>;\n      String: ResolverTypeWrapper<Scalars['String']['output']>;\n      Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n      MyOtherType: ResolverTypeWrapper<MyOtherTypeCustom>;\n      ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n      Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n      ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n      SomeNode: ResolverTypeWrapper<SomeNode>;\n      AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n      WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n      WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n      AnotherNodeWithChild: ResolverTypeWrapper<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']> }>;\n      AnotherNodeWithAll: ResolverTypeWrapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n      MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n      MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n      Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n      Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n    };`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: MyTypeCustom;\n        String: Scalars['String']['output'];\n        Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n        MyOtherType: MyOtherTypeCustom;\n        ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n        ID: Scalars['ID']['output'];\n        SomeNode: SomeNode;\n        AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n        WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n        WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n        AnotherNodeWithChild: Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']> };\n        AnotherNodeWithAll: Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n        MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n        MyScalar: Scalars['MyScalar']['output'];\n        Int: Scalars['Int']['output'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n    await resolversTestingValidate(mergeOutputs([result, `type MyTypeCustom = {}; type MyOtherTypeCustom = {};`]));\n  });\n\n  it('should support namespaces', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        mappers: {\n          MyOtherType: './my-file#MyNamespace#MyCustomOtherType',\n          AnotherNodeWithChild: './my-interface#InterfaceNamespace#AnotherNodeWithChildMapper',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { MyNamespace } from './my-file';`);\n    expect(result.prepend).toContain(`import { InterfaceNamespace } from './my-interface';`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } ) | ( MyNamespace.MyCustomOtherType );\n        MyUnion: ( Omit<MyType, 'otherType' | 'unionChild'> & { otherType?: Maybe<_RefType['MyOtherType']>, unionChild?: Maybe<_RefType['ChildUnion']> } ) | ( MyNamespace.MyCustomOtherType );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( InterfaceNamespace.AnotherNodeWithChildMapper ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChild: ( InterfaceNamespace.AnotherNodeWithChildMapper ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        MyType: ResolverTypeWrapper<Omit<MyType, 'otherType' | 'unionChild'> & { otherType?: Maybe<ResolversTypes['MyOtherType']>, unionChild?: Maybe<ResolversTypes['ChildUnion']> }>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n        MyOtherType: ResolverTypeWrapper<MyNamespace.MyCustomOtherType>;\n        ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        SomeNode: ResolverTypeWrapper<SomeNode>;\n        AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n        WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n        WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n        AnotherNodeWithChild: ResolverTypeWrapper<InterfaceNamespace.AnotherNodeWithChildMapper>;\n        AnotherNodeWithAll: ResolverTypeWrapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n        MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n        MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n        Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversParentTypes = {\n      MyType: Omit<MyType, 'otherType' | 'unionChild'> & { otherType?: Maybe<ResolversParentTypes['MyOtherType']>, unionChild?: Maybe<ResolversParentTypes['ChildUnion']> };\n      String: Scalars['String']['output'];\n      Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n      MyOtherType: MyNamespace.MyCustomOtherType;\n      ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n      Query: Record<PropertyKey, never>;\n      Subscription: Record<PropertyKey, never>;\n      Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n      ID: Scalars['ID']['output'];\n      SomeNode: SomeNode;\n      AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n      WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n      WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n      AnotherNodeWithChild: InterfaceNamespace.AnotherNodeWithChildMapper;\n      AnotherNodeWithAll: Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n      MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n      MyScalar: Scalars['MyScalar']['output'];\n      Int: Scalars['Int']['output'];\n      Boolean: Scalars['Boolean']['output'];\n    };\n    `);\n  });\n\n  it('should support namespaces in contextType', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        contextType: './my-file#MyNamespace#MyContextType',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { MyNamespace } from './my-file';`);\n\n    expect(result.content).toContain(`<ContextType = MyNamespace.MyContextType>`);\n    expect(result.content).not.toContain(`<ContextType = MyNamespace>`);\n    expect(result.content).not.toContain(`<ContextType = MyContextType>`);\n  });\n\n  it('should support namespaces in defaultMapper', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        defaultMapper: './my-file#MyNamespace#MyDefaultMapper',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { MyNamespace } from './my-file';`);\n    expect(result.content).not.toBeSimilarStringTo(`export type ResolversUnionTypes`);\n    expect(result.content).not.toBeSimilarStringTo(`export type ResolversParentUnionTypes`);\n    expect(result.content).not.toBeSimilarStringTo(`export type ResolversInterfaceTypes`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        MyType: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        String: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        Child: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        MyOtherType: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        ChildUnion: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Node: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        ID: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        SomeNode: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        AnotherNode: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        WithChild: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        WithChildren: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        AnotherNodeWithChild: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        AnotherNodeWithAll: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        MyUnion: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        MyScalar: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        Int: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n        Boolean: ResolverTypeWrapper<MyNamespace.MyDefaultMapper>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        MyType: MyNamespace.MyDefaultMapper;\n        String: MyNamespace.MyDefaultMapper;\n        Child: MyNamespace.MyDefaultMapper;\n        MyOtherType: MyNamespace.MyDefaultMapper;\n        ChildUnion: MyNamespace.MyDefaultMapper;\n        Query: Record<PropertyKey, never>;\n        Subscription: Record<PropertyKey, never>;\n        Node: MyNamespace.MyDefaultMapper;\n        ID: MyNamespace.MyDefaultMapper;\n        SomeNode: MyNamespace.MyDefaultMapper;\n        AnotherNode: MyNamespace.MyDefaultMapper;\n        WithChild: MyNamespace.MyDefaultMapper;\n        WithChildren: MyNamespace.MyDefaultMapper;\n        AnotherNodeWithChild: MyNamespace.MyDefaultMapper;\n        AnotherNodeWithAll: MyNamespace.MyDefaultMapper;\n        MyUnion: MyNamespace.MyDefaultMapper;\n        MyScalar: MyNamespace.MyDefaultMapper;\n        Int: MyNamespace.MyDefaultMapper;\n        Boolean: MyNamespace.MyDefaultMapper;\n      };\n    `);\n  });\n\n  it('should support namespaces in rootValueType', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        rootValueType: './my-file#MyNamespace#MyRootType',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { MyNamespace } from './my-file';`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> } ) | ( MyOtherType );\n        MyUnion: ( Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> } ) | ( MyOtherType );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( SomeNode );\n        AnotherNode: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChild: ( Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> } ) | ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n        WithChildren: ( Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> } );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        MyType: ResolverTypeWrapper<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']> }>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        Child: ResolverTypeWrapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>;\n        MyOtherType: ResolverTypeWrapper<MyOtherType>;\n        ChildUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>;\n        Query: ResolverTypeWrapper<MyNamespace.MyRootType>;\n        Subscription: ResolverTypeWrapper<MyNamespace.MyRootType>;\n        Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        SomeNode: ResolverTypeWrapper<SomeNode>;\n        AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n        WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n        WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n        AnotherNodeWithChild: ResolverTypeWrapper<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']> }>;\n        AnotherNodeWithAll: ResolverTypeWrapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>;\n        MyUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>;\n        MyScalar: ResolverTypeWrapper<Scalars['MyScalar']['output']>;\n        Int: ResolverTypeWrapper<Scalars['Int']['output']>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversParentTypes = {\n      MyType: Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']> };\n      String: Scalars['String']['output'];\n      Child: Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> };\n      MyOtherType: MyOtherType;\n      ChildUnion: ResolversUnionTypes<ResolversParentTypes>['ChildUnion'];\n      Query: MyNamespace.MyRootType;\n      Subscription: MyNamespace.MyRootType;\n      Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n      ID: Scalars['ID']['output'];\n      SomeNode: SomeNode;\n      AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n      WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n      WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n      AnotherNodeWithChild: Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']> };\n      AnotherNodeWithAll: Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> };\n      MyUnion: ResolversUnionTypes<ResolversParentTypes>['MyUnion'];\n      MyScalar: Scalars['MyScalar']['output'];\n      Int: Scalars['Int']['output'];\n      Boolean: Scalars['Boolean']['output'];\n    };\n    `);\n  });\n\n  it('should support namespaces and {T} placeholder', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        defaultMapper: './my-file#MyNamespace#MyDefaultMapper<{T}>',\n        mappers: {\n          MyType: './my-file#MyNamespace#MyType<{T}>',\n          AnotherNodeWithChild: './my-inteface#InterfaceNamespace#MyInterface<{T}>',\n        },\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { MyNamespace } from './my-file';`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        ChildUnion: ( MyNamespace.MyDefaultMapper<Omit<Child, 'parent'> & { parent?: Maybe<_RefType['MyType']> }> ) | ( MyNamespace.MyDefaultMapper<MyOtherType> );\n        MyUnion: ( MyNamespace.MyType<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<_RefType['ChildUnion']> }> ) | ( MyNamespace.MyDefaultMapper<MyOtherType> );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversInterfaceTypes<_RefType extends Record<string, unknown>> = {\n        Node: ( MyNamespace.MyDefaultMapper<SomeNode> );\n        AnotherNode: ( InterfaceNamespace.MyInterface<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> ) | ( MyNamespace.MyDefaultMapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> }> );\n        WithChild: ( InterfaceNamespace.MyInterface<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']> }> ) | ( MyNamespace.MyDefaultMapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> }> );\n        WithChildren: ( MyNamespace.MyDefaultMapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<_RefType['ChildUnion']>, unionChildren: Array<_RefType['ChildUnion']>, interfaceChild?: Maybe<_RefType['Node']>, interfaceChildren: Array<_RefType['Node']> }> );\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        MyType: ResolverTypeWrapper<MyNamespace.MyType<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']> }>>;\n        String: ResolverTypeWrapper<MyNamespace.MyDefaultMapper<Scalars['String']['output']>>;\n        Child: ResolverTypeWrapper<MyNamespace.MyDefaultMapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversTypes['MyType']> }>>;\n        MyOtherType: ResolverTypeWrapper<MyNamespace.MyDefaultMapper<MyOtherType>>;\n        ChildUnion: MyNamespace.MyDefaultMapper<ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['ChildUnion']>>;\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Node: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['Node']>;\n        ID: ResolverTypeWrapper<MyNamespace.MyDefaultMapper<Scalars['ID']['output']>>;\n        SomeNode: ResolverTypeWrapper<MyNamespace.MyDefaultMapper<SomeNode>>;\n        AnotherNode: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['AnotherNode']>;\n        WithChild: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChild']>;\n        WithChildren: ResolverTypeWrapper<ResolversInterfaceTypes<ResolversTypes>['WithChildren']>;\n        AnotherNodeWithChild: ResolverTypeWrapper<InterfaceNamespace.MyInterface<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']> }>>;\n        AnotherNodeWithAll: ResolverTypeWrapper<MyNamespace.MyDefaultMapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversTypes['ChildUnion']>, unionChildren: Array<ResolversTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversTypes['Node']>, interfaceChildren: Array<ResolversTypes['Node']> }>>;\n        MyUnion: MyNamespace.MyDefaultMapper<ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['MyUnion']>>;\n        MyScalar: ResolverTypeWrapper<MyNamespace.MyDefaultMapper<Scalars['MyScalar']['output']>>;\n        Int: ResolverTypeWrapper<MyNamespace.MyDefaultMapper<Scalars['Int']['output']>>;\n        Boolean: ResolverTypeWrapper<MyNamespace.MyDefaultMapper<Scalars['Boolean']['output']>>;\n      };\n    `);\n    expect(result.content).toBeSimilarStringTo(`\n    export type ResolversParentTypes = {\n      MyType: MyNamespace.MyType<Omit<MyType, 'unionChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']> }>;\n      String: MyNamespace.MyDefaultMapper<Scalars['String']['output']>;\n      Child: MyNamespace.MyDefaultMapper<Omit<Child, 'parent'> & { parent?: Maybe<ResolversParentTypes['MyType']> }>;\n      MyOtherType: MyNamespace.MyDefaultMapper<MyOtherType>;\n      ChildUnion: MyNamespace.MyDefaultMapper<ResolversUnionTypes<ResolversParentTypes>['ChildUnion']>;\n      Query: Record<PropertyKey, never>;\n      Subscription: Record<PropertyKey, never>;\n      Node: ResolversInterfaceTypes<ResolversParentTypes>['Node'];\n      ID: MyNamespace.MyDefaultMapper<Scalars['ID']['output']>;\n      SomeNode: MyNamespace.MyDefaultMapper<SomeNode>;\n      AnotherNode: ResolversInterfaceTypes<ResolversParentTypes>['AnotherNode'];\n      WithChild: ResolversInterfaceTypes<ResolversParentTypes>['WithChild'];\n      WithChildren: ResolversInterfaceTypes<ResolversParentTypes>['WithChildren'];\n      AnotherNodeWithChild: InterfaceNamespace.MyInterface<Omit<AnotherNodeWithChild, 'unionChild' | 'interfaceChild'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']> }>;\n      AnotherNodeWithAll: MyNamespace.MyDefaultMapper<Omit<AnotherNodeWithAll, 'unionChild' | 'unionChildren' | 'interfaceChild' | 'interfaceChildren'> & { unionChild?: Maybe<ResolversParentTypes['ChildUnion']>, unionChildren: Array<ResolversParentTypes['ChildUnion']>, interfaceChild?: Maybe<ResolversParentTypes['Node']>, interfaceChildren: Array<ResolversParentTypes['Node']> }>;\n      MyUnion: MyNamespace.MyDefaultMapper<ResolversUnionTypes<ResolversParentTypes>['MyUnion']>;\n      MyScalar: MyNamespace.MyDefaultMapper<Scalars['MyScalar']['output']>;\n      Int: MyNamespace.MyDefaultMapper<Scalars['Int']['output']>;\n      Boolean: MyNamespace.MyDefaultMapper<Scalars['Boolean']['output']>;\n    };\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/ts-resolvers.meta.spec.ts",
    "content": "import '@graphql-codegen/testing';\nimport { plugin } from '../src/index.js';\nimport { buildSchema } from 'graphql';\n\ndescribe('TypeScript Resolvers Plugin - Meta', () => {\n  it('generates meta correctly', async () => {\n    const result = await plugin(\n      buildSchema(/* GraphQL */ `\n        type Query {\n          user(id: ID!): User\n          post(id: ID!): Post\n        }\n\n        type Mutation {\n          createUser(name: String!): CreateUserPayload!\n        }\n\n        interface Node {\n          id: ID!\n        }\n        type Post implements Node {\n          id: ID!\n          author: User\n        }\n        type User implements Node {\n          id: ID!\n          name: String\n        }\n\n        type CreateUserOk {\n          user: User!\n        }\n\n        type CreateUserError {\n          error: ErrorType!\n        }\n\n        union CreateUserPayload = CreateUserOk | CreateUserError\n\n        enum ErrorType {\n          FORBIDDEN_ERROR\n          INTERNAL_ERROR\n        }\n\n        type TypeWithoutInterfaceOrUnion {\n          id: ID!\n        }\n      `),\n      [],\n      {\n        namingConvention: 'change-case-all#snakeCase',\n        enumValues: {\n          ErrorType: {\n            FORBIDDEN_ERROR: '403',\n            INTERNAL_ERROR: '500',\n          },\n        },\n      },\n      { outputFile: '' }\n    );\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type resolvers<ContextType = any> = {\n        Query?: query_resolvers<ContextType>;\n        Mutation?: mutation_resolvers<ContextType>;\n        Node?: node_resolvers<ContextType>;\n        Post?: post_resolvers<ContextType>;\n        User?: user_resolvers<ContextType>;\n        CreateUserOk?: create_user_ok_resolvers<ContextType>;\n        CreateUserError?: create_user_error_resolvers<ContextType>;\n        CreateUserPayload?: create_user_payload_resolvers<ContextType>;\n        ErrorType?: error_type_resolvers;\n        TypeWithoutInterfaceOrUnion?: type_without_interface_or_union_resolvers<ContextType>;\n      };`);\n    expect(result.content).toContain(`export type create_user_error_resolvers`);\n    expect(result.content).toContain(`export type create_user_ok_resolvers`);\n    expect(result.content).toContain(`export type create_user_payload_resolvers`);\n    expect(result.content).toContain(`export type error_type_resolvers`);\n    expect(result.content).toContain(`export type mutation_resolvers`);\n    expect(result.content).toContain(`export type node_resolvers`);\n    expect(result.content).toContain(`export type post_resolvers`);\n    expect(result.content).toContain(`export type query_resolvers`);\n    expect(result.content).toContain(`export type user_resolvers`);\n\n    expect(result.meta).toMatchInlineSnapshot(`\n      {\n        \"generatedResolverTypes\": {\n          \"resolversMap\": {\n            \"name\": \"resolvers\",\n          },\n          \"userDefined\": {\n            \"CreateUserError\": {\n              \"hasIsTypeOf\": true,\n              \"name\": \"create_user_error_resolvers\",\n            },\n            \"CreateUserOk\": {\n              \"hasIsTypeOf\": true,\n              \"name\": \"create_user_ok_resolvers\",\n            },\n            \"CreateUserPayload\": {\n              \"hasIsTypeOf\": false,\n              \"name\": \"create_user_payload_resolvers\",\n            },\n            \"ErrorType\": {\n              \"hasIsTypeOf\": false,\n              \"name\": \"error_type_resolvers\",\n            },\n            \"Mutation\": {\n              \"hasIsTypeOf\": false,\n              \"name\": \"mutation_resolvers\",\n            },\n            \"Node\": {\n              \"hasIsTypeOf\": false,\n              \"name\": \"node_resolvers\",\n            },\n            \"Post\": {\n              \"hasIsTypeOf\": true,\n              \"name\": \"post_resolvers\",\n            },\n            \"Query\": {\n              \"hasIsTypeOf\": false,\n              \"name\": \"query_resolvers\",\n            },\n            \"TypeWithoutInterfaceOrUnion\": {\n              \"hasIsTypeOf\": false,\n              \"name\": \"type_without_interface_or_union_resolvers\",\n            },\n            \"User\": {\n              \"hasIsTypeOf\": true,\n              \"name\": \"user_resolvers\",\n            },\n          },\n        },\n      }\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/ts-resolvers.spec.ts",
    "content": "import { mergeOutputs, Types } from '@graphql-codegen/plugin-helpers';\nimport { resolversTestingSchema, resolversTestingValidate, validateTs } from '@graphql-codegen/testing';\nimport { buildSchema } from 'graphql';\nimport { plugin as tsPlugin } from '../../typescript/src/index.js';\nimport { plugin } from '../src/index.js';\nimport { ENUM_RESOLVERS_SIGNATURE } from '../src/visitor.js';\n\ndescribe('TypeScript Resolvers Plugin', () => {\n  describe('Backward Compatability', () => {\n    it('should produce IResolvers compatible with graphql-tools', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          users: [User!]!\n        }\n\n        type User {\n          id: ID!\n          name: String!\n        }\n      `);\n\n      const tsContent = await tsPlugin(testSchema, [], {}, { outputFile: 'graphql.ts' });\n      const resolversContent = (await plugin(\n        testSchema,\n        [],\n        {\n          contextType: 'Context',\n          useIndexSignature: true,\n        },\n        {\n          outputFile: 'graphql.ts',\n        }\n      )) as Types.ComplexPluginOutput;\n      const content = mergeOutputs([\n        tsContent,\n        resolversContent,\n        `\n          import { makeExecutableSchema } from '@graphql-tools/schema';\n\n          interface Context {\n            users: Array<{\n              id: string;\n              name: string;\n            }>;\n          }\n\n          const resolvers: IResolvers = {\n            Query: {\n              users(parent, args, ctx, info) {\n                return ctx.users;\n              }\n            }\n          }\n\n          makeExecutableSchema({\n            typeDefs: '',\n            resolvers\n          })\n        `,\n      ]);\n\n      expect(content).toBeSimilarStringTo(`\n        export type Resolvers<ContextType = Context> = ResolversObject<{\n          Query?: QueryResolvers<ContextType>;\n          User?: UserResolvers<ContextType>;\n        }>;\n      `);\n\n      validateTs(content);\n    });\n  });\n\n  it('Should use StitchingResolver when its active on config', async () => {\n    const result = await plugin(resolversTestingSchema, [], { noSchemaStitching: false }, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`export type StitchingResolver<TResult, TParent, TContext, TArgs>`);\n    expect(result.content).toBeSimilarStringTo(`\n      export type Resolver<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> =\n        | ResolverFn<TResult, TParent, TContext, TArgs>\n        | ResolverWithResolve<TResult, TParent, TContext, TArgs>\n        | StitchingResolver<TResult, TParent, TContext, TArgs>;\n    `);\n\n    await resolversTestingValidate(result);\n  });\n\n  describe('Config', () => {\n    it('addInterfaceFieldResolverTypes - should allow to have only resolveType for interfaces', async () => {\n      const config = {\n        addInterfaceFieldResolverTypes: true,\n      };\n      const result = await plugin(resolversTestingSchema, [], config, { outputFile: '' });\n      const content = await resolversTestingValidate(result, config, resolversTestingSchema);\n\n      expect(content).toBeSimilarStringTo(`\n        export type WithChildrenResolvers<ContextType = any, ParentType extends ResolversParentTypes['WithChildren'] = ResolversParentTypes['WithChildren']> = {\n          __resolveType: TypeResolveFn<'AnotherNodeWithAll', ParentType, ContextType>;\n          unionChildren?: Resolver<Array<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n          nodes?: Resolver<Array<ResolversTypes['AnotherNode']>, ParentType, ContextType>;\n        };\n      `);\n    });\n\n    it('optionalInfoArgument - should allow to have optional info argument', async () => {\n      const config = {\n        noSchemaStitching: true,\n        useIndexSignature: true,\n        optionalInfoArgument: true,\n      };\n      const result = await plugin(resolversTestingSchema, [], config, { outputFile: '' });\n\n      const content = await resolversTestingValidate(result, config, resolversTestingSchema);\n\n      expect(content).not.toContain(`info: `);\n      expect(content).toContain(`info?: `);\n      expect(content).toMatchSnapshot();\n    });\n\n    it('allowParentTypeOverride - should allow to have less strict resolvers by overrding parent type', async () => {\n      const config = {\n        noSchemaStitching: true,\n        useIndexSignature: true,\n        allowParentTypeOverride: true,\n      };\n      const result = await plugin(resolversTestingSchema, [], config, { outputFile: '' });\n\n      const content = await resolversTestingValidate(\n        result,\n        config,\n        resolversTestingSchema,\n        `\n        export const myTypeResolvers: MyTypeResolvers<{}, { parentOverride: boolean }> = {\n          foo: (parentValue) => {\n            const a: boolean = parentValue.parentOverride;\n\n            return a.toString();\n          }\n        };\n      `\n      );\n\n      expect(content).not.toContain(`ParentType extends `);\n      expect(content).toContain(`ParentType = `);\n      expect(content).toMatchSnapshot();\n    });\n\n    it('namespacedImportName - should work correctly with imported namespaced type', async () => {\n      const config = {\n        noSchemaStitching: true,\n        useIndexSignature: true,\n        namespacedImportName: 'Types',\n      };\n      const result = await plugin(resolversTestingSchema, [], config, { outputFile: '' });\n      const content = mergeOutputs([result]);\n      expect(content).toMatchSnapshot();\n    });\n\n    it('directiveResolverMappings - should generate correct types (inline definition)', async () => {\n      const config = {\n        noSchemaStitching: true,\n        directiveResolverMappings: {\n          authenticated: `\n(\n  parent: TParent,\n  args: TArgs,\n  context: AuthenticatedContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;`,\n        },\n      };\n      const result = await plugin(resolversTestingSchema, [], config, { outputFile: '' });\n      expect(result.content).toBeSimilarStringTo(`\nexport type ResolverFnAuthenticated<TResult, TParent, TContext, TArgs> =\n(\n  parent: TParent,\n  args: TArgs,\n  context: AuthenticatedContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;\n\nexport type ResolverAuthenticatedWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFnAuthenticated<TResult, TParent, TContext, TArgs>;\n};\nexport type ResolverAuthenticated<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> = ResolverFnAuthenticated<TResult, TParent, TContext, TArgs> | ResolverAuthenticatedWithResolve<TResult, TParent, TContext, TArgs>;\n`);\n      expect(result.content).toBeSimilarStringTo(`\nexport type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n  foo?: ResolverAuthenticated<ResolversTypes['String'], ParentType, ContextType>;\n  otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n  withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n  unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n};\n      `);\n    });\n\n    it('makeResolverTypeCallable - should remove ResolverWithResolve type from resolver union', async () => {\n      const result = await plugin(resolversTestingSchema, [], { makeResolverTypeCallable: true }, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n      export type Resolver<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> =\n      ResolverFn<TResult, TParent, TContext, TArgs>;\n    `);\n\n      expect(result.content).not.toBeSimilarStringTo(`\n      export type Resolver<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> =\n      ResolverFn<TResult, TParent, TContext, TArgs>\n      | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n    `);\n\n      await resolversTestingValidate(result);\n    });\n\n    it('makeResolverTypeCallable - adds ResolverWithResolve type to resolver union when set to false', async () => {\n      const result = await plugin(resolversTestingSchema, [], { makeResolverTypeCallable: false }, { outputFile: '' });\n\n      expect(result.content).not.toBeSimilarStringTo(`\n      export type Resolver<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> =\n      ResolverFn<TResult, TParent, TContext, TArgs>;\n    `);\n\n      expect(result.content).toBeSimilarStringTo(`\n      export type Resolver<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> =\n      ResolverFn<TResult, TParent, TContext, TArgs>\n      | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n    `);\n\n      await resolversTestingValidate(result);\n    });\n  });\n\n  it('directiveResolverMappings - should generate correct types (import definition)', async () => {\n    const config = {\n      noSchemaStitching: true,\n      directiveResolverMappings: {\n        authenticated: `../resolver-types.ts#AuthenticatedResolver`,\n      },\n    };\n    const result = await plugin(resolversTestingSchema, [], config, { outputFile: '' });\n    expect(result.prepend).toContain(\n      \"import { AuthenticatedResolver as ResolverFnAuthenticated } from '../resolver-types.ts';\"\n    );\n    expect(result.prepend).toContain('export { ResolverFnAuthenticated };');\n    expect(result.content).toBeSimilarStringTo(`\nexport type ResolverAuthenticatedWithResolve<TResult, TParent, TContext, TArgs> = {\n  resolve: ResolverFnAuthenticated<TResult, TParent, TContext, TArgs>;\n};\nexport type ResolverAuthenticated<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> = ResolverFnAuthenticated<TResult, TParent, TContext, TArgs> | ResolverAuthenticatedWithResolve<TResult, TParent, TContext, TArgs>;\n`);\n    expect(result.content).toBeSimilarStringTo(`\nexport type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\nfoo?: ResolverAuthenticated<ResolversTypes['String'], ParentType, ContextType>;\notherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\nwithArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\nunionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n};\n    `);\n  });\n\n  describe('Enums', () => {\n    it('Should not generate enum internal values resolvers when enum doesnt have enumValues set', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          v: MyEnum\n        }\n\n        enum MyEnum {\n          A\n          B\n          C\n        }\n      `);\n      const config = {\n        noSchemaStitching: true,\n      };\n      const result = await plugin(testSchema, [], config, { outputFile: '' });\n      const mergedOutput = await resolversTestingValidate(\n        result,\n        config,\n        testSchema,\n        `\n        export const resolvers: Resolvers = {\n          Query: {\n            v: () => 'A',\n          }\n        };\n      `\n      );\n\n      expect(mergedOutput).not.toContain(ENUM_RESOLVERS_SIGNATURE);\n      expect(mergedOutput).not.toContain('EnumResolverSignature');\n    });\n\n    it('Should generate enum internal values resolvers when enum has enumValues set as object with explicit values', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          v: MyEnum\n        }\n\n        enum MyEnum {\n          A\n          B\n          C\n        }\n      `);\n      const config = {\n        noSchemaStitching: true,\n        enumValues: {\n          MyEnum: {\n            A: 'val_1',\n            B: 'val_2',\n            C: 'val_3',\n          },\n        },\n      };\n      const result = await plugin(testSchema, [], config, { outputFile: '' });\n\n      const mergedOutput = await resolversTestingValidate(\n        result,\n        config,\n        testSchema,\n        `\n        export const resolvers: Resolvers = {\n          MyEnum: {\n            A: 'val_1',\n            B: 'val_2',\n            C: 'val_3',\n          },\n          Query: {\n            v: () => 'val_1',\n          }\n        };\n      `\n      );\n\n      expect(mergedOutput).not.toContain(ENUM_RESOLVERS_SIGNATURE);\n      expect(mergedOutput).not.toContain('EnumResolverSignature');\n      expect(mergedOutput).toContain(`export type MyEnumResolvers = { A: 'val_1', B: 'val_2', C: 'val_3' };`);\n    });\n\n    it('#10418 - Should generate enum internal values resolvers when enum has enumValues set as object with partially explicit values', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          v: MyEnum\n          w: MyEnum\n          x: MyEnum\n        }\n\n        enum MyEnum {\n          A\n          B\n          C\n        }\n      `);\n      const config = {\n        noSchemaStitching: true,\n        enumValues: {\n          MyEnum: {\n            A: 'val_1',\n          },\n        },\n      };\n      const result = await plugin(testSchema, [], config, { outputFile: '' });\n\n      const mergedOutput = await resolversTestingValidate(\n        result,\n        config,\n        testSchema,\n        `\n        export const resolvers: Resolvers = {\n          MyEnum: {\n            A: 'val_1',\n            B: 'B'\n          },\n          Query: {\n            v: () => 'val_1',\n            w: () => 'B',\n            z: () => 'C',\n          }\n        };\n      `\n      );\n\n      expect(mergedOutput).not.toContain(ENUM_RESOLVERS_SIGNATURE);\n      expect(mergedOutput).not.toContain('EnumResolverSignature');\n      expect(mergedOutput).toContain(`export type MyEnumResolvers = { A: 'val_1', B?: 'B', C?: 'C' };`);\n    });\n\n    it('Should generate enum internal values resolvers when enum has enumValues set as external enum', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          v: MyEnum\n        }\n\n        enum MyEnum {\n          A\n          B\n          C\n        }\n      `);\n      const config = {\n        noSchemaStitching: true,\n        enumValues: {\n          MyEnum: 'MyCustomEnum',\n        },\n      };\n      const result = await plugin(testSchema, [], config, { outputFile: '' });\n\n      const mergedOutput = await resolversTestingValidate(\n        result,\n        config,\n        testSchema,\n        `\n        enum MyCustomEnum {\n          CUSTOM_A,\n          CUSTOM_B,\n          CUSTOM_C\n        }\n\n        export const resolvers: Resolvers = {\n          MyEnum: {\n            A: MyCustomEnum.CUSTOM_A,\n            B: MyCustomEnum.CUSTOM_B,\n            C: MyCustomEnum.CUSTOM_C,\n          },\n          Query: {\n            v: () => MyCustomEnum.CUSTOM_A,\n          }\n        };\n      `\n      );\n\n      expect(mergedOutput).toContain(ENUM_RESOLVERS_SIGNATURE);\n      expect(mergedOutput).toContain('EnumResolverSignature');\n      expect(mergedOutput).toContain(\n        `export type MyEnumResolvers = EnumResolverSignature<{ A?: any, B?: any, C?: any }, ResolversTypes['MyEnum']>;`\n      );\n    });\n\n    it('Should generate enum internal values resolvers when enum has mappers pointing to external enum', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          v: MyEnum\n        }\n\n        enum MyEnum {\n          A\n          B\n          C\n        }\n      `);\n      const config = {\n        noSchemaStitching: true,\n        mappers: {\n          MyEnum: 'MyCustomEnum',\n        },\n      };\n      const result = await plugin(testSchema, [], config, { outputFile: '' });\n\n      const mergedOutput = await resolversTestingValidate(\n        result,\n        config,\n        testSchema,\n        `\n        enum MyCustomEnum {\n          CUSTOM_A,\n          CUSTOM_B,\n          CUSTOM_C\n        }\n\n        export const resolvers: Resolvers = {\n          MyEnum: {\n            A: MyCustomEnum.CUSTOM_A,\n            B: MyCustomEnum.CUSTOM_B,\n            C: MyCustomEnum.CUSTOM_C,\n          },\n          Query: {\n            v: () => MyCustomEnum.CUSTOM_A,\n          }\n        };\n      `\n      );\n\n      expect(mergedOutput).toContain(ENUM_RESOLVERS_SIGNATURE);\n      expect(mergedOutput).toContain('EnumResolverSignature');\n      expect(mergedOutput).toContain(\n        `export type MyEnumResolvers = EnumResolverSignature<{ A?: any, B?: any, C?: any }, ResolversTypes['MyEnum']>;`\n      );\n    });\n\n    it('Should generate enum internal values resolvers when enum has enumValues set on a global level of all enums', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          v: MyEnum\n        }\n\n        enum MyEnum {\n          A\n          B\n          C\n        }\n      `);\n      const config = {\n        noSchemaStitching: true,\n        enumValues: './enums',\n      };\n      const result = await plugin(testSchema, [], config, { outputFile: '' });\n\n      const mergedOutput = await resolversTestingValidate(\n        result,\n        config,\n        testSchema,\n        `\n        enum MyCustomEnum {\n          CUSTOM_A,\n          CUSTOM_B,\n          CUSTOM_C\n        }\n\n        export const resolvers: Resolvers = {\n          MyEnum: {\n            A: MyCustomEnum.CUSTOM_A,\n            B: MyCustomEnum.CUSTOM_B,\n            C: MyCustomEnum.CUSTOM_C,\n          },\n          Query: {\n            v: () => MyCustomEnum.CUSTOM_A,\n          }\n        };\n      `\n      );\n\n      expect(mergedOutput).toContain(`import { MyEnum } from './enums'`);\n      expect(mergedOutput).toContain(`export { MyEnum }`);\n      expect(mergedOutput).toContain(ENUM_RESOLVERS_SIGNATURE);\n      expect(mergedOutput).toContain('EnumResolverSignature');\n      expect(mergedOutput).toContain(\n        `export type MyEnumResolvers = EnumResolverSignature<{ A?: any, B?: any, C?: any }, ResolversTypes['MyEnum']>;`\n      );\n    });\n  });\n\n  it('Should allow to override ResolverTypeWrapper signature', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n        resolverTypeWrapperSignature: 'Promise<DeepPartial<T>> | DeepPartial<T>',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toContain(`export type ResolverTypeWrapper<T> = Promise<DeepPartial<T>> | DeepPartial<T>;`);\n  });\n\n  it('Should have default value for ResolverTypeWrapper signature', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toContain(`export type ResolverTypeWrapper<T> = Promise<T> | T;`);\n  });\n\n  it('Should not warn when noSchemaStitching is not defined', async () => {\n    const spy = vi.spyOn(console, 'warn').mockImplementation(() => {});\n    const result = await plugin(resolversTestingSchema, [], {}, { outputFile: '' });\n\n    expect(spy).not.toHaveBeenCalled();\n\n    spy.mockRestore();\n\n    await resolversTestingValidate(result);\n  });\n\n  it('Should disable StitchingResolver on demand', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        noSchemaStitching: true,\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).not.toBeSimilarStringTo(`\n      export type StitchingResolver<TResult, TParent, TContext, TArgs> = {\n        fragment: string;\n        resolve: ResolverFn<TResult, TParent, TContext, TArgs>;\n      };\n    `);\n    expect(result.content).not.toBeSimilarStringTo(`\n      export type Resolver<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> =\n        | ResolverFn<TResult, TParent, TContext, TArgs>\n        | ResolverWithResolve<TResult, TParent, TContext, TArgs>\n        | StitchingResolver<TResult, TParent, TContext, TArgs>;\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type Resolver<TResult, TParent = Record<PropertyKey, never>, TContext = Record<PropertyKey, never>, TArgs = Record<PropertyKey, never>> =\n        ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>;\n    `);\n\n    await resolversTestingValidate(result);\n  });\n\n  it('Default values of args and compatibility with typescript plugin', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        something(arg: String = \"default_value\"): String\n      }\n    `);\n\n    const config: any = { noSchemaStitching: true };\n    const result = await plugin(testSchema, [], config, { outputFile: '' });\n    const mergedOutputs = mergeOutputs([\n      result,\n      {\n        content: `\n    const resolvers: QueryResolvers = {\n      something: (root, args, context, info) => {\n        return args.arg; // This should work becuase \"args.arg\" is now forced\n      }\n    };`,\n      },\n    ]);\n\n    expect(mergedOutputs).toContain(`export type RequireFields`);\n    expect(mergedOutputs).toContain(\n      `something?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<QuerySomethingArgs, 'arg'>>;`\n    );\n  });\n\n  it('Test for enum usage in resolvers (to verify compatibility with enumValues)', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        a: A\n        c: C\n      }\n\n      enum A {\n        X\n        Y\n        Z\n      }\n\n      enum NotMapped {\n        X\n        Y\n      }\n\n      type B {\n        a: String\n      }\n\n      enum C {\n        Y\n        Z\n      }\n    `);\n\n    const config = {\n      enumValues: {\n        A: 'MyA',\n        C: '../enums.js#MyC',\n      },\n      typesPrefix: 'GQL_',\n    };\n    const result = await plugin(testSchema, [], config, { outputFile: '' });\n    const tsContent = (await tsPlugin(testSchema, [], config, {\n      outputFile: 'graphql.ts',\n    })) as Types.ComplexPluginOutput;\n    const mergedOutputs = mergeOutputs([result, tsContent]);\n\n    expect(mergedOutputs).not.toContain(`A: A;`);\n    expect(mergedOutputs).not.toContain(`A: GQL_A;`);\n    expect(mergedOutputs).not.toContain(`C: GQL_MyC;`);\n    expect(mergedOutputs).toContain(`NotMapped: GQL_NotMapped;`);\n    expect(mergedOutputs).not.toContain(`NotMapped: NotMapped;`);\n    expect(mergedOutputs).toContain(`A: MyA;`);\n    expect(mergedOutputs).toContain(`B: GQL_B;`);\n    expect(mergedOutputs).toContain(`C: C;`);\n    expect(mergedOutputs).toContain(`import { MyC as C } from '../enums.js';`);\n  });\n\n  it('Should allow to generate optional __resolveType', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      { optionalResolveType: true },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType?: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType?: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('Should generate basic type resolvers', async () => {\n    const result = await plugin(resolversTestingSchema, [], {}, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveArgs = {\n      arg: Scalars['Int']['input'];\n      arg2: Scalars['String']['input'];\n      arg3: Scalars['Boolean']['input'];\n    };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveResolver<Result, Parent, ContextType = any, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyOtherTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = {\n        bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content)\n      .toBeSimilarStringTo(`export interface MyScalarScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['MyScalar'], any> {\n      name: 'MyScalar';\n    }`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SomeNodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = any, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n      };\n    `);\n\n    await resolversTestingValidate(result);\n  });\n\n  it('Should allow to override context with simple identifier', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        contextType: 'MyCustomCtx',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveArgs = {\n      arg: Scalars['Int']['input'];\n      arg2: Scalars['String']['input'];\n      arg3: Scalars['Boolean']['input'];\n    };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveResolver<Result, Parent, ContextType = MyCustomCtx, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyOtherTypeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = {\n        bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SomeNodeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n      };\n    `);\n\n    await resolversTestingValidate(mergeOutputs([result, `type MyCustomCtx = {};`]));\n  });\n\n  it('Should with correctly with addUnderscoreToArgsType set to true', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        addUnderscoreToArgsType: true,\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).toContain('MyType_WithArgsArgs');\n    expect(result.content).not.toContain('MyTypeWithArgsArgs');\n\n    await resolversTestingValidate(mergeOutputs([result]));\n  });\n\n  it('Should allow to override context with mapped context type', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        contextType: './my-file#MyCustomCtx',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { MyCustomCtx } from './my-file';`);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveArgs = {\n      arg: Scalars['Int']['input'];\n      arg2: Scalars['String']['input'];\n      arg3: Scalars['Boolean']['input'];\n    };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveResolver<Result, Parent, ContextType = MyCustomCtx, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyOtherTypeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = {\n        bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SomeNodeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n      };\n    `);\n\n    await resolversTestingValidate(result);\n  });\n\n  it('Should allow to override context with mapped context type', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        contextType: './my-file#MyCustomCtx',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { MyCustomCtx } from './my-file';`);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveArgs = {\n      arg: Scalars['Int']['input'];\n      arg2: Scalars['String']['input'];\n      arg3: Scalars['Boolean']['input'];\n    };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveResolver<Result, Parent, ContextType = MyCustomCtx, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyOtherTypeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = {\n        bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SomeNodeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n      };\n    `);\n\n    await resolversTestingValidate(result);\n  });\n  it('Should allow to override context with mapped context type as default export', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        contextType: './my-file#default',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import ContextType from './my-file';`);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveArgs = {\n      arg: Scalars['Int']['input'];\n      arg2: Scalars['String']['input'];\n      arg3: Scalars['Boolean']['input'];\n    };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveResolver<Result, Parent, ContextType = ContextType, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyOtherTypeResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = {\n        bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SomeNodeResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n      };\n    `);\n\n    await resolversTestingValidate(result);\n  });\n  it('Should allow to override context with mapped context type as default export with type import', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        contextType: './my-file#default',\n        useTypeImports: true,\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import type { default as ContextType } from './my-file';`);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveArgs = {\n      arg: Scalars['Int']['input'];\n      arg2: Scalars['String']['input'];\n      arg3: Scalars['Boolean']['input'];\n    };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n    export type MyDirectiveDirectiveResolver<Result, Parent, ContextType = ContextType, Args = MyDirectiveDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyOtherTypeResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['MyOtherType'] = ResolversParentTypes['MyOtherType']> = {\n        bar?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        __resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        __resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something?: Resolver<ResolversTypes['MyType'], ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SomeNodeResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['SomeNode'] = ResolversParentTypes['SomeNode']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type SubscriptionResolvers<ContextType = ContextType, ParentType extends ResolversParentTypes['Subscription'] = ResolversParentTypes['Subscription']> = {\n        somethingChanged?: SubscriptionResolver<Maybe<ResolversTypes['MyOtherType']>, \"somethingChanged\", ParentType, ContextType>;\n      };\n    `);\n\n    await resolversTestingValidate(result);\n  });\n\n  it('should generate named custom field level context type', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        fieldContextTypes: [\n          'MyType.foo#./my-file#ContextTypeOne',\n          'Query.something#./my-file#ContextTypeTwo',\n          'MyType.otherType#SpecialContextType',\n        ],\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { ContextTypeOne, ContextTypeTwo } from './my-file';`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, ContextTypeOne>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, SpecialContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {\n        something?: Resolver<ResolversTypes['MyType'], ParentType, ContextTypeTwo>;\n      };\n    `);\n  });\n\n  it('should generate named custom field level context type for field with directive', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        directiveContextTypes: ['authenticated#./my-file#AuthenticatedContext'],\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { AuthenticatedContext } from './my-file';`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, AuthenticatedContext<ContextType>>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('should generate named custom field level context type for field with directive and context type', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        directiveContextTypes: ['authenticated#./my-file#AuthenticatedContext'],\n        contextType: './my-file#MyCustomCtx',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { MyCustomCtx, AuthenticatedContext } from './my-file';`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = MyCustomCtx, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, AuthenticatedContext<ContextType>>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('should generate named custom field level context type for field with directive and field context type', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      {\n        directiveContextTypes: ['authenticated#./my-file#AuthenticatedContext'],\n        fieldContextTypes: ['MyType.foo#./my-file#ContextTypeOne'],\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { ContextTypeOne, AuthenticatedContext } from './my-file';`);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyTypeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyType'] = ResolversParentTypes['MyType']> = {\n        foo?: Resolver<ResolversTypes['String'], ParentType, AuthenticatedContext<ContextTypeOne>>;\n        otherType?: Resolver<Maybe<ResolversTypes['MyOtherType']>, ParentType, ContextType>;\n        withArgs?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, RequireFields<MyTypeWithArgsArgs, 'arg2'>>;\n        unionChild?: Resolver<Maybe<ResolversTypes['ChildUnion']>, ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n  });\n\n  it('Should generate the correct imports when schema has scalars', async () => {\n    const testSchema = buildSchema(`scalar MyScalar`);\n    const result = await plugin(testSchema, [], {}, { outputFile: '' });\n\n    expect(result.prepend).toContain(\n      `import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql';`\n    );\n    await resolversTestingValidate(result, {}, resolversTestingSchema);\n  });\n\n  it('Should generate the correct imports when schema has no scalars', async () => {\n    const testSchema = buildSchema(`type MyType { f: String }`);\n    const result = await plugin(testSchema, [], {}, { outputFile: '' });\n\n    expect(result.prepend).not.toContain(`import { GraphQLResolveInfo, GraphQLScalarTypeConfig } from 'graphql';`);\n    await resolversTestingValidate(result, {}, testSchema);\n  });\n\n  it('Should generate the correct imports when customResolveInfo defined in config', async () => {\n    const testSchema = buildSchema(`scalar MyScalar`);\n    const result = (await plugin(\n      testSchema,\n      [],\n      {\n        customResolveInfo: './my-type#MyGraphQLResolveInfo',\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import { GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql';`);\n    expect(result.prepend).toContain(`import { MyGraphQLResolveInfo as GraphQLResolveInfo } from './my-type';`);\n    await resolversTestingValidate(result, {}, testSchema);\n  });\n\n  it('#8852 - should generate the correct imports when customResolveInfo defined in config with type import', async () => {\n    const testSchema = buildSchema(`scalar MyScalar`);\n    const result = (await plugin(\n      testSchema,\n      [],\n      {\n        customResolveInfo: './my-type#MyGraphQLResolveInfo',\n        useTypeImports: true,\n      },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.prepend).toContain(`import type { GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql';`);\n    expect(result.prepend).toContain(`import type { MyGraphQLResolveInfo as GraphQLResolveInfo } from './my-type';`);\n    await resolversTestingValidate(result, {}, testSchema);\n  });\n\n  describe('Should generate the correct imports when customResolverFn defined in config', () => {\n    it('./my-type#MyResolverFn', async () => {\n      const testSchema = buildSchema(`scalar MyScalar`);\n      const result = (await plugin(\n        testSchema,\n        [],\n        {\n          customResolverFn: './my-type#MyResolverFn',\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.prepend).toContain(`import { MyResolverFn as ResolverFn } from './my-type';`);\n      expect(result.prepend).toContain(`export { ResolverFn };`);\n      await resolversTestingValidate(result, {}, testSchema);\n    });\n\n    it('./my-type#ResolverFn', async () => {\n      const testSchema = buildSchema(`scalar MyScalar`);\n      const result = (await plugin(\n        testSchema,\n        [],\n        {\n          customResolverFn: './my-type#ResolverFn',\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.prepend).toContain(`import { ResolverFn } from './my-type';`);\n      expect(result.prepend).toContain(`export { ResolverFn };`);\n      await resolversTestingValidate(result, {}, testSchema);\n    });\n\n    it(`definition directly`, async () => {\n      const testSchema = buildSchema(`scalar MyScalar`);\n      const fnDefinition = `(\n        parent: TParent,\n        args: TArgs,\n        context: TContext,\n        info: GraphQLResolveInfo & { nestedStuff: GraphQLResolveInfo }\n      ) => Promise<TResult> | TResult;\n      `;\n      const result = (await plugin(\n        testSchema,\n        [],\n        {\n          customResolverFn: fnDefinition,\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.prepend).toContain(`export type ResolverFn<TResult, TParent, TContext, TArgs> = ${fnDefinition}`);\n      await resolversTestingValidate(result, {}, testSchema);\n    });\n\n    it(`ok with default`, async () => {\n      const testSchema = buildSchema(`scalar MyScalar`);\n      const defaultResolverFn = `\nexport type ResolverFn<TResult, TParent, TContext, TArgs> = (\n  parent: TParent,\n  args: TArgs,\n  context: TContext,\n  info: GraphQLResolveInfo\n) => Promise<TResult> | TResult;`;\n      const result = await plugin(testSchema, [], {}, { outputFile: '' });\n\n      expect(result.content).toContain(defaultResolverFn);\n      await resolversTestingValidate(result, {}, testSchema);\n    });\n  });\n\n  it('Should not convert type names in unions', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type CCCFoo {\n        foo: String!\n      }\n\n      type CCCBar {\n        bar: String!\n      }\n\n      type Query {\n        something: CCCUnion!\n      }\n\n      union CCCUnion = CCCFoo | CCCBar\n    `);\n\n    const tsContent = await tsPlugin(testSchema, [], {}, { outputFile: 'graphql.ts' });\n    const content = await plugin(testSchema, [], {}, { outputFile: 'graphql.ts' });\n\n    expect(tsContent.content).toBeSimilarStringTo(`\n      export type CccFoo = {\n        __typename?: 'CCCFoo';\n        foo: Scalars['String']['output'];\n      };\n    `);\n    expect(tsContent.content).toBeSimilarStringTo(`\n      export type CccBar = {\n        __typename?: 'CCCBar';\n        bar: Scalars['String']['output'];\n      };\n    `);\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        CCCUnion: ( CccFoo ) | ( CccBar );\n      };\n    `);\n    expect(content.content).toBeSimilarStringTo(`\n    /** Mapping between all available schema types and the resolvers types */\n    export type ResolversTypes = {\n      CCCFoo: ResolverTypeWrapper<CccFoo>;\n      String: ResolverTypeWrapper<Scalars['String']['output']>;\n      CCCBar: ResolverTypeWrapper<CccBar>;\n      Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n      CCCUnion: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['CCCUnion']>;\n      Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n    };\n    `);\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        CCCFoo: CccFoo;\n        String: Scalars['String']['output'];\n        CCCBar: CccBar;\n        Query: Record<PropertyKey, never>;\n        CCCUnion: ResolversUnionTypes<ResolversParentTypes>['CCCUnion'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n    expect(content.content).toBeSimilarStringTo(`\n    export type CccUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['CCCUnion'] = ResolversParentTypes['CCCUnion']> = {\n      __resolveType: TypeResolveFn<'CCCFoo' | 'CCCBar', ParentType, ContextType>;\n    };\n    `);\n\n    await validateTs(mergeOutputs([tsContent, content]));\n  });\n\n  it('Should generate the correct resolver args type names when typesPrefix is specified', async () => {\n    const testSchema = buildSchema(`type MyType { f(a: String): String }`);\n    const config = { typesPrefix: 'T' };\n    const result = await plugin(testSchema, [], config, { outputFile: '' });\n    const o = await resolversTestingValidate(result, config, testSchema);\n\n    expect(o).toContain(\n      `f?: Resolver<Maybe<TResolversTypes['String']>, ParentType, ContextType, Partial<TMyTypeFArgs>>;`\n    );\n  });\n\n  // dotansimha/graphql-code-generator#3322\n  it('should make list of all-optional arguments include undefined types', async () => {\n    const testSchema = buildSchema(`type MyType { f(a: String, b: Int): String }`);\n    const result = await plugin(testSchema, [], {}, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(\n      `f?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType, Partial<MyTypeFArgs>>;`\n    );\n    await resolversTestingValidate(result, {}, testSchema);\n  });\n\n  // dotansimha/graphql-code-generator#3322\n  it('should include generic wrapper type only when necessary', async () => {\n    const testSchema = buildSchema(`type MyType { f: String }`);\n    const result = await plugin(testSchema, [], {}, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(\n      `f?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;`\n    );\n    await resolversTestingValidate(result, {}, testSchema);\n  });\n\n  it('should generate Resolvers interface', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      directive @modify(limit: Int) on FIELD_DEFINITION\n      scalar Date\n      type Query {\n        post: Post\n        entity: PostOrUser\n      }\n      interface Node {\n        id: String\n      }\n      union PostOrUser = Post | User\n      type Post implements Node {\n        author: User\n      }\n      type User implements Node {\n        id: String\n        name: String\n      }\n      schema {\n        query: Query\n      }\n    `);\n\n    const content = (await plugin(\n      testSchema,\n      [],\n      { scalars: { Date: 'Date' } },\n      {\n        outputFile: 'graphql.ts',\n      }\n    )) as Types.ComplexPluginOutput;\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type Resolvers<ContextType = any> = {\n        Date?: GraphQLScalarType;\n        Query?: QueryResolvers<ContextType>;\n        Node?: NodeResolvers<ContextType>;\n        PostOrUser?: PostOrUserResolvers<ContextType>;\n        Post?: PostResolvers<ContextType>;\n        User?: UserResolvers<ContextType>;\n      };\n    `);\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type DirectiveResolvers<ContextType = any> = {\n        modify?: ModifyDirectiveResolver<any, any, ContextType>;\n      };\n    `);\n  });\n\n  it('should not create DirectiveResolvers if there is no directive defined in the schema', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        foo: String\n      }\n    `);\n\n    const content = (await plugin(\n      testSchema,\n      [],\n      { scalars: { Date: 'Date' } },\n      {\n        outputFile: 'graphql.ts',\n      }\n    )) as Types.ComplexPluginOutput;\n\n    expect(content.content).not.toBeSimilarStringTo(`\n      export type DirectiveResolvers<ContextType = any> = {};\n    `);\n  });\n\n  it('should produce Resolvers compatible with graphql-tools', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        users: [User!]!\n      }\n\n      type User {\n        id: ID!\n        name: String!\n      }\n    `);\n\n    const tsContent = (await tsPlugin(testSchema, [], {}, { outputFile: 'graphql.ts' })) as Types.ComplexPluginOutput;\n    const resolversContent = (await plugin(\n      testSchema,\n      [],\n      {\n        contextType: 'AppContext',\n        useIndexSignature: true,\n      },\n      {\n        outputFile: 'graphql.ts',\n      }\n    )) as Types.ComplexPluginOutput;\n    const content = mergeOutputs([\n      tsContent,\n      resolversContent,\n      `\n        import { makeExecutableSchema } from '@graphql-tools/schema';\n\n        interface AppContext {\n          users: Array<{\n            id: string;\n            name: string;\n          }>;\n        }\n\n        const resolvers: Resolvers = {\n          Query: {\n            users(parent, args, ctx, info) {\n              return ctx.users;\n            }\n          }\n        }\n\n        makeExecutableSchema({\n          typeDefs: '',\n          resolvers\n        })\n      `,\n    ]);\n\n    validateTs(content);\n  });\n\n  it('should produce resolvers compatible with graphql-tools', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        users: [User!]!\n      }\n\n      type User {\n        id: ID!\n        name: String!\n      }\n    `);\n\n    const tsContent = await tsPlugin(testSchema, [], {}, { outputFile: 'graphql.ts' });\n    const resolversContent = await plugin(\n      testSchema,\n      [],\n      {\n        contextType: 'AppContext',\n        useIndexSignature: true,\n      },\n      {\n        outputFile: 'graphql.ts',\n      }\n    );\n    const content = mergeOutputs([\n      tsContent,\n      resolversContent,\n      `\n        import { makeExecutableSchema } from '@graphql-tools/schema';\n\n        interface AppContext {\n          users: Array<{\n            id: string;\n            name: string;\n          }>;\n        }\n\n        const query: QueryResolvers = {\n          users(parent, args, ctx, info) {\n            return ctx.users;\n          }\n        }\n\n        makeExecutableSchema({\n          typeDefs: '',\n          resolvers: {\n            Query: query\n          }\n        })\n      `,\n    ]);\n\n    validateTs(content);\n  });\n\n  it('should use {} as default of rootValueType', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Subscription {\n        postAdded: Post\n      }\n\n      type Query {\n        posts: [Post]\n      }\n\n      type Mutation {\n        addPost(author: String, comment: String): Post\n      }\n\n      type Post {\n        author: String\n        comment: String\n      }\n    `);\n    const content = await plugin(testSchema, [], {}, { outputFile: 'graphql.ts' });\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        Subscription: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Mutation: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        Post: ResolverTypeWrapper<Post>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n  });\n\n  it('should generate ResolversParentTypes', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Subscription {\n        postAdded: Post\n      }\n\n      type Query {\n        posts: [Post]\n      }\n\n      type Mutation {\n        addPost(author: String, comment: String): Post\n      }\n\n      type Post {\n        author: String\n        comment: String\n      }\n    `);\n    const content = await plugin(testSchema, [], {}, { outputFile: 'graphql.ts' });\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        Subscription: Record<PropertyKey, never>;\n        Query: Record<PropertyKey, never>;\n        Mutation: Record<PropertyKey, never>;\n        String: Scalars['String']['output'];\n        Post: Post;\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('should use correct value when rootValueType mapped as default', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Subscription {\n        postAdded: Post\n      }\n\n      type Query {\n        posts: [Post]\n      }\n\n      type Mutation {\n        addPost(author: String, comment: String): Post\n      }\n\n      type Post {\n        author: String\n        comment: String\n      }\n    `);\n    const content = (await plugin(\n      testSchema,\n      [],\n      {\n        rootValueType: 'my-file#default',\n      },\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        Subscription: ResolverTypeWrapper<RootValueType>;\n        Query: ResolverTypeWrapper<RootValueType>;\n        Mutation: ResolverTypeWrapper<RootValueType>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        Post: ResolverTypeWrapper<Post>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n\n    expect(content.prepend).toContain(`import RootValueType from 'my-file';`);\n  });\n\n  it('should use correct value when rootValueType mapped as default with type import', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Subscription {\n        postAdded: Post\n      }\n\n      type Query {\n        posts: [Post]\n      }\n\n      type Mutation {\n        addPost(author: String, comment: String): Post\n      }\n\n      type Post {\n        author: String\n        comment: String\n      }\n    `);\n    const content = (await plugin(\n      testSchema,\n      [],\n      {\n        rootValueType: 'my-file#default',\n        useTypeImports: true,\n      },\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(content.prepend).toContain(`import type { default as RootValueType } from 'my-file';`);\n  });\n\n  it('should use rootValueType in Query, Mutation and Subscription', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type MySubscription {\n        postAdded: Post\n      }\n\n      type MyQuery {\n        posts: [Post]\n      }\n\n      type MyMutation {\n        addPost(author: String, comment: String): Post\n      }\n\n      type Post {\n        author: String\n        comment: String\n      }\n\n      schema {\n        query: MyQuery\n        mutation: MyMutation\n        subscription: MySubscription\n      }\n    `);\n    const content = (await plugin(\n      testSchema,\n      [],\n      {\n        rootValueType: 'MyRoot',\n      },\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        MySubscription: ResolverTypeWrapper<MyRoot>;\n        MyQuery: ResolverTypeWrapper<MyRoot>;\n        MyMutation: ResolverTypeWrapper<MyRoot>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        Post: ResolverTypeWrapper<Post>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n  });\n\n  it('should generate subscription types correctly', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Subscription {\n        postAdded: Post\n      }\n\n      type Query {\n        posts: [Post]\n      }\n\n      type Mutation {\n        addPost(author: String, comment: String): Post\n      }\n\n      type Post {\n        author: String\n        comment: String\n      }\n    `);\n    const tsContent = await tsPlugin(testSchema, [], {}, { outputFile: 'graphql.ts' });\n    const resolversContent = await plugin(\n      testSchema,\n      [],\n      {\n        rootValueType: '{version: 1}',\n      },\n      { outputFile: 'graphql.ts' }\n    );\n    const content = mergeOutputs([\n      tsContent,\n      resolversContent,\n      `\n        import { PubSub } from 'graphql-subscriptions';\n        const pubsub = new PubSub();\n\n        const POST_ADDED = 'POST_ADDED';\n\n        const resolvers: Resolvers = {\n          Subscription: {\n            postAdded: {\n              subscribe: () => pubsub.asyncIterator([POST_ADDED]),\n            }\n          },\n          Mutation: {\n            addPost: (root, { author, comment }) => {\n              const post = {\n                author,\n                comment,\n              };\n\n              // RootValue should be accessible\n              console.log(root.version);\n\n              // Pass correct data\n              pubsub.publish(POST_ADDED, post);\n\n              // Return correct data\n              return post;\n            }\n          },\n        };\n      `,\n    ]);\n\n    validateTs(content);\n  });\n\n  it('should use MaybePromise in ResolverTypeWrapper', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type MySubscription {\n        postAdded: Post\n      }\n\n      type MyQuery {\n        posts: [Post]\n      }\n\n      type MyMutation {\n        addPost(author: String, comment: String): Post\n      }\n\n      type Post {\n        author: String\n        comment: String\n      }\n\n      schema {\n        query: MyQuery\n        mutation: MyMutation\n        subscription: MySubscription\n      }\n    `);\n    const content = (await plugin(\n      testSchema,\n      [],\n      {\n        rootValueType: 'MyRoot',\n        asyncResolverTypes: true,\n      } as any,\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolverTypeWrapper<T> = Promise<T> | T;\n    `);\n  });\n\n  it.skip('should support all use-cases of subscription resolvers', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Subscription {\n        postAdded: Post\n      }\n\n      type Query {\n        posts: [Post]\n      }\n\n      type Post {\n        author: String\n        comment: String\n      }\n    `);\n\n    const tsContent = await tsPlugin(testSchema, [], {}, { outputFile: 'graphql.ts' });\n    const resolversContent = (await plugin(\n      testSchema,\n      [],\n      {},\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    const validateResolvers = (code: string) => {\n      validateTs(\n        mergeOutputs([\n          tsContent,\n          resolversContent,\n          `\n            import { PubSub } from 'graphql-subscriptions';\n\n            const pubsub = new PubSub();\n            const POST_ADDED = 'POST_ADDED';\n          `,\n          code,\n        ])\n      );\n    };\n\n    // if `subscribe` returns anything\n    // `resolve` should be defined\n    // and `parent` should be any\n    expect(() => {\n      validateResolvers(`\n      type PubSubEvent = {\n        text: string;\n        user: string;\n      };\n\n      const resolvers: Resolvers = {\n        Subscription: {\n          postAdded: {\n            subscribe: () => pubsub.asyncIterator<PubSubEvent>(POST_ADDED),\n            resolve: parent => {\n              return {\n                comment: parent.text,\n                author: parent.user\n              };\n            }\n          }\n        }\n      };\n    `);\n    }).not.toThrow();\n\n    // if `subscribe` returns anything\n    // `resolve` should be defined\n    // and `parent` should be any\n    // but resolver is missing...\n    expect(() => {\n      validateResolvers(`\n      import { PubSub } from 'graphql-subscriptions';\n\n      const pubsub = new PubSub();\n      const POST_ADDED = 'POST_ADDED';\n\n      type PubSubEvent = {\n        text: string;\n        user: string;\n      };\n\n      const resolvers: Resolvers = {\n        Subscription: {\n          postAdded: {\n            subscribe: () => pubsub.asyncIterator<PubSubEvent>(POST_ADDED)\n            // resolvers is missing!\n          }\n        }\n      };\n    `);\n    }).toThrow();\n\n    // if `subscribe` returns { postAdded: PostAdded }\n    // `resolve` should be optional\n    expect(() => {\n      validateResolvers(`\n      import { PubSub } from 'graphql-subscriptions';\n\n      const pubsub = new PubSub();\n      const POST_ADDED = 'POST_ADDED';\n\n      type PubSubEvent = {\n        postAdded: {\n          comment: string;\n          author: string;\n        }\n      };\n\n      const resolvers: Resolvers = {\n        Subscription: {\n          postAdded: {\n            subscribe: () => pubsub.asyncIterator<PubSubEvent>(POST_ADDED),\n          },\n        }\n      };\n    `);\n    }).not.toThrow();\n\n    // if `subscribe` returns { postAdded: PostAdded }\n    // and `parent` should be { postAdded: PostAdded }\n    expect(() => {\n      validateResolvers(`\n      import { PubSub } from 'graphql-subscriptions';\n\n      const pubsub = new PubSub();\n      const POST_ADDED = 'POST_ADDED';\n\n      type PubSubEvent = {\n        postAdded: {\n          comment: string;\n          author: string;\n        }\n      };\n\n      const resolvers: Resolvers = {\n        Subscription: {\n          postAdded: {\n            subscribe: () => pubsub.asyncIterator<PubSubEvent>(POST_ADDED),\n            resolve: event => event.postAdded\n          },\n        }\n      };\n    `);\n    }).not.toThrow();\n\n    // if `subscribe` returns { postAdded: Foo }\n    // `resolve` shouldn't be optional\n    expect(() => {\n      validateResolvers(`\n      import { PubSub } from 'graphql-subscriptions';\n\n      const pubsub = new PubSub();\n      const POST_ADDED = 'POST_ADDED';\n\n      type PubSubEvent = {\n        postAdded: {\n          text: string;\n          user: string;\n        }\n      };\n\n      const resolvers: Resolvers = {\n        Subscription: {\n          postAdded: {\n            subscribe: () => pubsub.asyncIterator<PubSubEvent>(POST_ADDED),\n          },\n        }\n      };\n    `);\n    }).toThrow();\n\n    // if `subscribe` returns { postAdded: Foo }\n    // and `parent` should be { postAdded: Foo }\n    expect(() => {\n      validateResolvers(`\n      import { PubSub } from 'graphql-subscriptions';\n\n      const pubsub = new PubSub();\n      const POST_ADDED = 'POST_ADDED';\n\n      type PubSubEvent = {\n        postAdded: {\n          text: string;\n          user: string;\n        }\n      };\n\n      const resolvers: Resolvers = {\n        Subscription: {\n          postAdded: {\n            subscribe: () => pubsub.asyncIterator<PubSubEvent>(POST_ADDED),\n            resolve: (event) => {\n              return {\n                comment: event.text,\n                author: event.user\n              };\n            }\n          },\n        }\n      };\n    `);\n    }).not.toThrow();\n\n    // if `subscribe` returns PostAdded\n    // `resolve` should be optional\n    expect(() => {\n      validateResolvers(`\n      import { PubSub } from 'graphql-subscriptions';\n\n      const pubsub = new PubSub();\n      const POST_ADDED = 'POST_ADDED';\n\n      type PubSubEvent = {\n        comment: string;\n        author: string;\n      };\n\n      const resolvers: Resolvers = {\n        Subscription: {\n          postAdded: {\n            subscribe: () => pubsub.asyncIterator<PubSubEvent>(POST_ADDED),\n          },\n        }\n      };\n    `);\n    }).not.toThrow();\n\n    // if `subscribe` returns PostAdded\n    // `parent` should be of type PostAdded\n    expect(() => {\n      validateResolvers(`\n      import { PubSub } from 'graphql-subscriptions';\n\n      const pubsub = new PubSub();\n      const POST_ADDED = 'POST_ADDED';\n\n      type PubSubEvent = {\n        comment: string;\n        author: string;\n      };\n\n      const resolvers: Resolvers = {\n        Subscription: {\n          postAdded: {\n            subscribe: () => pubsub.asyncIterator<PubSubEvent>(POST_ADDED),\n            resolve: event => event\n          },\n        }\n      };\n    `);\n    }).not.toThrow();\n  });\n\n  describe('issues', () => {\n    it('#4687 - incorrect suffix when used with typesSuffix', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type User {\n          _id: ID!\n        }\n        type Query {\n          user(_id: ID!): User\n          user2(_id: ID): User\n          me: User\n        }\n      `);\n\n      const config = {\n        typesSuffix: 'QL',\n      };\n      const output = await plugin(testSchema, [], config, { outputFile: 'graphql.ts' });\n      const o = await resolversTestingValidate(output, config, testSchema);\n      expect(o).not.toContain(\n        `user?: Resolver<Maybe<ResolversTypesQL['User']>, ParentType, ContextType, RequireFields<QueryQLuserArgs, '_id'>>;`\n      );\n      expect(o).toContain(\n        `user?: Resolver<Maybe<ResolversTypesQL['User']>, ParentType, ContextType, RequireFields<QueryUserArgsQL, '_id'>>;`\n      );\n      expect(o).toContain(`me?: Resolver<Maybe<ResolversTypesQL['User']>, ParentType, ContextType>;`);\n      expect(o).toContain(\n        `user2?: Resolver<Maybe<ResolversTypesQL['User']>, ParentType, ContextType, Partial<QueryUser2ArgsQL>>;`\n      );\n    });\n    it('should work correctly with enumPrefix: false - issue #2679', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          t: Test\n        }\n\n        enum Test {\n          A\n          B\n          C\n        }\n      `);\n\n      const config = {\n        typesPrefix: 'I',\n        enumPrefix: false,\n        namingConvention: 'keep',\n        constEnums: true,\n      };\n      const output = await plugin(testSchema, [], config, { outputFile: 'graphql.ts' });\n      const o = await resolversTestingValidate(output, config, testSchema);\n\n      expect(o).toBeSimilarStringTo(`\n      export const enum Test {\n        A = 'A',\n        B = 'B',\n        C = 'C'\n      };`);\n      expect(o).toBeSimilarStringTo(`\n      export type IResolversTypes = {\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        Test: Test;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n      };`);\n    });\n\n    it('#3257 - should not import mapper when its already imported because of enumValues', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        schema {\n          query: Query\n        }\n\n        type Query {\n          role: [ProjectRoleDetail!]!\n        }\n\n        enum ProjectRole {\n          PROJECT_MANAGER\n          ETC\n        }\n\n        type ProjectRoleDetail {\n          code: ProjectRole!\n          name: String!\n        }\n      `);\n\n      const config = {\n        noSchemaStitching: true,\n        contextType: '@src/context#Context',\n        useIndexSignature: true,\n        avoidOptionals: true,\n        mappers: {\n          ProjectRoleDetail: '../entities#ProjectRole',\n        },\n        enumValues: {\n          ProjectRole: '../entities#AnotherProjectRole',\n        },\n      };\n\n      const tsContent = (await tsPlugin(testSchema, [], config, {\n        outputFile: 'graphql.ts',\n      })) as Types.ComplexPluginOutput;\n      const output = await plugin(testSchema, [], config, { outputFile: 'graphql.ts' });\n\n      expect(output.prepend.filter(t => t.includes('import')).length).toBe(2);\n      expect(output.prepend.filter(t => t.includes('ProjectRole')).length).toBe(0);\n      expect(tsContent.prepend.filter(t => t.includes('ProjectRole')).length).toBe(1);\n      expect(output.content.includes('AnotherProjectRole')).toBeFalsy();\n      expect(\n        tsContent.prepend.includes(`import { AnotherProjectRole as ProjectRole } from '../entities';`)\n      ).toBeTruthy();\n      expect(output.prepend.includes(`import { AnotherProjectRole as ProjectRole } from '../entities';`)).toBeFalsy();\n    });\n\n    it('#3264 - enumValues is not being applied to directive resolver', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        directive @auth(\n          role: UserRole = ADMIN\n        ) on OBJECT | FIELD_DEFINITION | ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION\n\n        enum UserRole {\n          ADMIN\n          USER\n        }\n\n        schema {\n          query: Query\n        }\n\n        type Query {\n          me: User!\n        }\n\n        type User {\n          id: ID!\n          username: String!\n          email: String!\n          role: UserRole!\n        }\n      `);\n\n      const output = (await plugin(\n        testSchema,\n        [],\n        {\n          noSchemaStitching: true,\n          typesPrefix: 'Gql',\n          maybeValue: 'T | undefined',\n          enumValues: {\n            UserRole: '@org/package#UserRole',\n          },\n        } as any,\n        { outputFile: 'graphql.ts' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(output.content).toContain(`export type GqlAuthDirectiveArgs = {\\n  role?: Maybe<UserRole>;\\n};`);\n      expect(output.content).toContain(\n        `export type GqlAuthDirectiveResolver<Result, Parent, ContextType = any, Args = GqlAuthDirectiveArgs> = DirectiveResolverFn<Result, Parent, ContextType, Args>;`\n      );\n    });\n  });\n\n  it('Should generate resolvers with replaced internalResolversPrefix if specified', async () => {\n    const result = (await plugin(\n      resolversTestingSchema,\n      [],\n      { internalResolversPrefix: '' },\n      { outputFile: '' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(result.content).not.toContain('__resolveType');\n    expect(result.content).toContain('resolveType');\n    expect(result.content).not.toContain('__isTypeOf');\n    expect(result.content).toContain('isTypeOf');\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MyUnionResolvers<ContextType = any, ParentType extends ResolversParentTypes['MyUnion'] = ResolversParentTypes['MyUnion']> = {\n        resolveType: TypeResolveFn<'MyType' | 'MyOtherType', ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type NodeResolvers<ContextType = any, ParentType extends ResolversParentTypes['Node'] = ResolversParentTypes['Node']> = {\n        resolveType: TypeResolveFn<'SomeNode', ParentType, ContextType>;\n      };\n    `);\n\n    await resolversTestingValidate(result);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/ts-resolvers.union.spec.ts",
    "content": "import '@graphql-codegen/testing';\nimport { buildSchema } from 'graphql';\nimport { plugin } from '../src/index.js';\n\ndescribe('TypeScript Resolvers Plugin - Union', () => {\n  it('should generate ResolversUnionTypes', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        user(id: ID!): UserPayload!\n        posts: PostsPayload!\n      }\n\n      type StandardError {\n        error: String!\n      }\n\n      type User {\n        id: ID!\n        fullName: String!\n      }\n\n      type UserResult {\n        result: User\n      }\n\n      union UserPayload = UserResult | StandardError\n\n      type Post {\n        author: String\n        comment: String\n      }\n\n      type PostsResult {\n        results: [Post!]!\n      }\n\n      union PostsPayload = PostsResult | StandardError\n    `);\n    const content = await plugin(testSchema, [], {}, { outputFile: 'graphql.ts' });\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        UserPayload: ( UserResult ) | ( StandardError );\n        PostsPayload: ( PostsResult ) | ( StandardError );\n      };\n    `);\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        Query: ResolverTypeWrapper<Record<PropertyKey, never>>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        StandardError: ResolverTypeWrapper<StandardError>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        User: ResolverTypeWrapper<User>;\n        UserResult: ResolverTypeWrapper<UserResult>;\n        UserPayload: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['UserPayload']>;\n        Post: ResolverTypeWrapper<Post>;\n        PostsResult: ResolverTypeWrapper<PostsResult>;\n        PostsPayload:  ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['PostsPayload']>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n\n    expect(content.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        Query: Record<PropertyKey, never>;\n        ID: Scalars['ID']['output'];\n        StandardError: StandardError;\n        String: Scalars['String']['output'];\n        User: User;\n        UserResult: UserResult;\n        UserPayload: ResolversUnionTypes<ResolversParentTypes>['UserPayload'];\n        Post: Post;\n        PostsResult: PostsResult;\n        PostsPayload: ResolversUnionTypes<ResolversParentTypes>['PostsPayload'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('should NOT generate ResolversUnionTypes if there is no Union', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Query {\n        user(id: ID!): User\n      }\n\n      type User {\n        id: ID!\n        fullName: String!\n      }\n    `);\n    const content = await plugin(testSchema, [], {}, { outputFile: 'graphql.ts' });\n\n    expect(content.content).not.toBeSimilarStringTo(`export type ResolversUnionTypes`);\n    expect(content.content).not.toBeSimilarStringTo(`export type ResolversUnionParentTypes`);\n  });\n\n  it('generates nested types when avoidCheckingAbstractTypesRecursively=false (default)', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type StandardError {\n        error: String!\n      }\n\n      type User {\n        id: ID!\n        fullName: String!\n        posts: PostsPayload!\n      }\n\n      type UserResult {\n        result: User\n        recommendedPosts: PostsPayload!\n      }\n\n      union UserPayload = UserResult | StandardError\n\n      type Post {\n        author: String\n        comment: String\n      }\n\n      type PostsResult {\n        results: [Post!]!\n      }\n\n      union PostsPayload = PostsResult | StandardError\n    `);\n\n    const result = await plugin(schema, [], {}, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        UserPayload: ( Omit<UserResult, 'result' | 'recommendedPosts'> & { result?: Maybe<_RefType['User']>, recommendedPosts: _RefType['PostsPayload'] } ) | ( StandardError );\n        PostsPayload: ( PostsResult ) | ( StandardError );\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        StandardError: ResolverTypeWrapper<StandardError>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        User: ResolverTypeWrapper<Omit<User, 'posts'> & { posts: ResolversTypes['PostsPayload'] }>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        UserResult: ResolverTypeWrapper<Omit<UserResult, 'result' | 'recommendedPosts'> & { result?: Maybe<ResolversTypes['User']>, recommendedPosts: ResolversTypes['PostsPayload'] }>;\n        UserPayload: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['UserPayload']>;\n        Post: ResolverTypeWrapper<Post>;\n        PostsResult: ResolverTypeWrapper<PostsResult>;\n        PostsPayload: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['PostsPayload']>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        StandardError: StandardError;\n        String: Scalars['String']['output'];\n        User: Omit<User, 'posts'> & { posts: ResolversParentTypes['PostsPayload'] };\n        ID: Scalars['ID']['output'];\n        UserResult: Omit<UserResult, 'result' | 'recommendedPosts'> & { result?: Maybe<ResolversParentTypes['User']>, recommendedPosts: ResolversParentTypes['PostsPayload'] };\n        UserPayload: ResolversUnionTypes<ResolversParentTypes>['UserPayload'];\n        Post: Post;\n        PostsResult: PostsResult;\n        PostsPayload: ResolversUnionTypes<ResolversParentTypes>['PostsPayload'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('does not generate nested types when avoidCheckingAbstractTypesRecursively=true', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type StandardError {\n        error: String!\n      }\n\n      type User {\n        id: ID!\n        fullName: String!\n        posts: PostsPayload!\n      }\n\n      type UserResult {\n        result: User\n        recommendedPosts: PostsPayload!\n      }\n\n      union UserPayload = UserResult | StandardError\n\n      type Post {\n        author: String\n        comment: String\n      }\n\n      type PostsResult {\n        results: [Post!]!\n      }\n\n      union PostsPayload = PostsResult | StandardError\n    `);\n\n    const result = await plugin(schema, [], { avoidCheckingAbstractTypesRecursively: true }, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversUnionTypes<_RefType extends Record<string, unknown>> = {\n        UserPayload: ( Omit<UserResult, 'recommendedPosts'> & { recommendedPosts: _RefType['PostsPayload'] } ) | ( StandardError );\n        PostsPayload: ( PostsResult ) | ( StandardError );\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversTypes = {\n        StandardError: ResolverTypeWrapper<StandardError>;\n        String: ResolverTypeWrapper<Scalars['String']['output']>;\n        User: ResolverTypeWrapper<Omit<User, 'posts'> & { posts: ResolversTypes['PostsPayload'] }>;\n        ID: ResolverTypeWrapper<Scalars['ID']['output']>;\n        UserResult: ResolverTypeWrapper<Omit<UserResult, 'recommendedPosts'> & { recommendedPosts: ResolversTypes['PostsPayload'] }>;\n        UserPayload: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['UserPayload']>;\n        Post: ResolverTypeWrapper<Post>;\n        PostsResult: ResolverTypeWrapper<PostsResult>;\n        PostsPayload: ResolverTypeWrapper<ResolversUnionTypes<ResolversTypes>['PostsPayload']>;\n        Boolean: ResolverTypeWrapper<Scalars['Boolean']['output']>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type ResolversParentTypes = {\n        StandardError: StandardError;\n        String: Scalars['String']['output'];\n        User: Omit<User, 'posts'> & { posts: ResolversParentTypes['PostsPayload'] };\n        ID: Scalars['ID']['output'];\n        UserResult: Omit<UserResult, 'recommendedPosts'> & { recommendedPosts: ResolversParentTypes['PostsPayload'] };\n        UserPayload: ResolversUnionTypes<ResolversParentTypes>['UserPayload'];\n        Post: Post;\n        PostsResult: PostsResult;\n        PostsPayload: ResolversUnionTypes<ResolversParentTypes>['PostsPayload'];\n        Boolean: Scalars['Boolean']['output'];\n      };\n    `);\n  });\n\n  it('generates __isTypeOf for only union members', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type MemberOne {\n        id: ID!\n      }\n      type MemberTwo {\n        id: ID!\n        name: String!\n      }\n      type MemberThree {\n        id: ID!\n        isMember: Boolean!\n      }\n      union Union = MemberOne | MemberTwo | MemberThree\n      type Normal {\n        id: ID!\n      }\n    `);\n\n    const result = await plugin(schema, [], {}, { outputFile: '' });\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MemberOneResolvers<ContextType = any, ParentType extends ResolversParentTypes['MemberOne'] = ResolversParentTypes['MemberOne']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      }\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MemberTwoResolvers<ContextType = any, ParentType extends ResolversParentTypes['MemberTwo'] = ResolversParentTypes['MemberTwo']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    expect(result.content).toBeSimilarStringTo(`\n      export type MemberThreeResolvers<ContextType = any, ParentType extends ResolversParentTypes['MemberThree'] = ResolversParentTypes['MemberThree']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n        isMember?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;\n        __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;\n      };\n    `);\n\n    // Normal type is not a union member, so it does not have __isTypeOf\n    expect(result.content).toBeSimilarStringTo(`\n      export type NormalResolvers<ContextType = any, ParentType extends ResolversParentTypes['Normal'] = ResolversParentTypes['Normal']> = {\n        id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;\n      };\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/tests/utils.ts",
    "content": "import { codegen } from '@graphql-codegen/core';\nimport { parse } from 'graphql';\nimport { TypeScriptResolversPluginConfig } from '../src/config.js';\nimport { plugin } from '../src/index.js';\n\nexport function generate({ schema, config }: { schema: string; config: TypeScriptResolversPluginConfig }) {\n  return codegen({\n    filename: 'graphql.ts',\n    schema: parse(schema),\n    documents: [],\n    plugins: [{ 'typescript-resolvers': {} }],\n    config,\n    pluginMap: { 'typescript-resolvers': { plugin } },\n  });\n}\n"
  },
  {
    "path": "packages/plugins/typescript/resolvers/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'typescript-resolvers',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/plugins/typescript/typed-document-node/CHANGELOG.md",
    "content": "# @graphql-codegen/typed-document-node\n\n## 6.1.7\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-codegen/visitor-plugin-common@^6.2.3` ↗︎](https://www.npmjs.com/package/@graphql-codegen/visitor-plugin-common/v/6.2.3) (from `6.2.3`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/plugin-helpers@6.1.1\n  - @graphql-codegen/visitor-plugin-common@6.2.4\n\n## 6.1.6\n\n### Patch Changes\n\n- Updated dependencies [[`6038634`](https://github.com/dotansimha/graphql-code-generator/commit/60386344081917f2884db933309821603a2be2bf)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.3\n\n## 6.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`f588d91`](https://github.com/dotansimha/graphql-code-generator/commit/f588d91ac43ea0aa5931915ce980d2e6876bb59c)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.2\n\n## 6.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`b995ed1`](https://github.com/dotansimha/graphql-code-generator/commit/b995ed13a49379ea05e0e313fac68b557527523a)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.1\n\n## 6.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`f821e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f821e8ab9351f23a9f7e5d5e6fc69c8e8868cad8), [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.0\n  - @graphql-codegen/plugin-helpers@6.1.0\n\n## 6.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`51a1a72`](https://github.com/dotansimha/graphql-code-generator/commit/51a1a7280578d43681391df11d320a8416c0b41d)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.2\n\n## 6.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`6715330`](https://github.com/dotansimha/graphql-code-generator/commit/67153304646694d75aee24afd70c3fce12e9f1f2)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.1\n\n## 6.1.0\n\n### Minor Changes\n\n- [#10456](https://github.com/dotansimha/graphql-code-generator/pull/10456) [`655b91d`](https://github.com/dotansimha/graphql-code-generator/commit/655b91dd6d8b5f90eb26cd59d6a3d12c3dccc529) Thanks [@aovens-quantifi](https://github.com/aovens-quantifi)! - feat(typed-document-node): Allow importing operation types\n\n  Adds the `importOperationTypesFrom` option, similar to many other codegen\n  plugins. This allows importing the operation types rather than needing to\n  generate them within this plugin config.\n\n## 6.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`8258f1f`](https://github.com/dotansimha/graphql-code-generator/commit/8258f1f6012c106d02ef28bca9ec424f70c4aa26)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.0\n\n## 6.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`accdab6`](https://github.com/dotansimha/graphql-code-generator/commit/accdab69106605241933e9d66d64dc7077656f30)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.1\n\n## 6.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.0\n  - @graphql-codegen/plugin-helpers@6.0.0\n\n## 5.1.2\n\n### Patch Changes\n\n- [#10362](https://github.com/dotansimha/graphql-code-generator/pull/10362) [`3188b8c`](https://github.com/dotansimha/graphql-code-generator/commit/3188b8c39e9fd24e3dbbd0bcc8767052153eb399) Thanks [@Brookke](https://github.com/Brookke)! - Make generated type compatible with noImplicitOverride=true\n\n- [#10373](https://github.com/dotansimha/graphql-code-generator/pull/10373) [`c3295f9`](https://github.com/dotansimha/graphql-code-generator/commit/c3295f9c60383e5631ccc4080bc28e7c00a4d61b) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix client preset not working with exactOptionalPropertyTypes=true when documentMode=string\n\n## 5.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`f6909d1`](https://github.com/dotansimha/graphql-code-generator/commit/f6909d1797c15b79a0afb7ec089471763a485bfc)]:\n  - @graphql-codegen/visitor-plugin-common@5.8.0\n\n## 5.1.0\n\n### Minor Changes\n\n- [#10307](https://github.com/dotansimha/graphql-code-generator/pull/10307) [`bfe3c75`](https://github.com/dotansimha/graphql-code-generator/commit/bfe3c7575e0b5f3a252fe9d72416f7829e44c885) Thanks [@mvantellingen](https://github.com/mvantellingen)! - Update generated code to be compatible with TypeScript 5.8 `erasableSyntaxOnly` flag\n\n## 5.0.15\n\n### Patch Changes\n\n- Updated dependencies [[`d8566c0`](https://github.com/dotansimha/graphql-code-generator/commit/d8566c015943ea4dbcaeaf57d3d8406553ae230a)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.1\n\n## 5.0.14\n\n### Patch Changes\n\n- Updated dependencies [[`6d7c1d7`](https://github.com/dotansimha/graphql-code-generator/commit/6d7c1d7c0a4662acdc0efafd4234229ad0a8dd3c)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.0\n\n## 5.0.13\n\n### Patch Changes\n\n- Updated dependencies [[`60dd72f`](https://github.com/dotansimha/graphql-code-generator/commit/60dd72fb103fd7fd70b4e1def98da29588865517)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.1\n\n## 5.0.12\n\n### Patch Changes\n\n- Updated dependencies [[`1617e3c`](https://github.com/dotansimha/graphql-code-generator/commit/1617e3cf38f3059cc5ea88b540033f521f03725a), [`fa64fbf`](https://github.com/dotansimha/graphql-code-generator/commit/fa64fbf8a44e1cee7ae17806dcd178dc7350c4ba)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.0\n\n## 5.0.11\n\n### Patch Changes\n\n- [#10160](https://github.com/dotansimha/graphql-code-generator/pull/10160) [`c7af639`](https://github.com/dotansimha/graphql-code-generator/commit/c7af63964089938150402db69d49f11f93bb5175) Thanks [@jyasskin](https://github.com/jyasskin)! - Allow explicit `undefined` in additional to optional arguments\n\n- Updated dependencies [[`55a1e9e`](https://github.com/dotansimha/graphql-code-generator/commit/55a1e9e63830df17ed40602ea7e322bbf48b17bc), [`a235051`](https://github.com/dotansimha/graphql-code-generator/commit/a23505180ac2f275a55ece27162ec9bfcdc52e03)]:\n  - @graphql-codegen/visitor-plugin-common@5.5.0\n  - @graphql-codegen/plugin-helpers@5.1.0\n\n## 5.0.10\n\n### Patch Changes\n\n- Updated dependencies [[`3f4f546`](https://github.com/dotansimha/graphql-code-generator/commit/3f4f5466ff168ad822b9a00d83d3779078e6d8c4)]:\n  - @graphql-codegen/visitor-plugin-common@5.4.0\n\n## 5.0.9\n\n### Patch Changes\n\n- Updated dependencies [[`79fee3c`](https://github.com/dotansimha/graphql-code-generator/commit/79fee3cada20d683d250aad5aa5fef9d6ed9f4d2)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.1\n\n## 5.0.8\n\n### Patch Changes\n\n- Updated dependencies [[`808ada5`](https://github.com/dotansimha/graphql-code-generator/commit/808ada595d83d39cad045da5824cac6378e9eca3), [`14ce39e`](https://github.com/dotansimha/graphql-code-generator/commit/14ce39e41dfee38c652be736664177fa2b1df421)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.0\n\n## 5.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`156cc2b`](https://github.com/dotansimha/graphql-code-generator/commit/156cc2b9a2a5129beba121cfa987b04e29899431), [`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`b49457b`](https://github.com/dotansimha/graphql-code-generator/commit/b49457b5f29328d2dc23c642788a2e697cb8966e)]:\n  - @graphql-codegen/plugin-helpers@5.0.4\n  - @graphql-codegen/visitor-plugin-common@5.2.0\n\n## 5.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`920b443`](https://github.com/dotansimha/graphql-code-generator/commit/920b443a401b8cc4811f64ec5b25fc7b4ae32b53), [`ed9c205`](https://github.com/dotansimha/graphql-code-generator/commit/ed9c205d15d7f14ed73e54aecf40e4fad5664e9d)]:\n  - @graphql-codegen/visitor-plugin-common@5.1.0\n\n## 5.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`53f270a`](https://github.com/dotansimha/graphql-code-generator/commit/53f270acfa1da992e0f9d2e50921bb588392f8a5)]:\n  - @graphql-codegen/visitor-plugin-common@5.0.0\n\n## 5.0.4\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.2\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 5.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`7718a8113`](https://github.com/dotansimha/graphql-code-generator/commit/7718a8113dc6282475cb738f1e28698b8221fa2f)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.1\n\n## 5.0.2\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n  - @graphql-codegen/visitor-plugin-common@4.1.0\n\n## 5.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a)]:\n  - @graphql-codegen/visitor-plugin-common@4.0.1\n\n## 5.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Minor Changes\n\n- [#9196](https://github.com/dotansimha/graphql-code-generator/pull/9196) [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96) Thanks [@beerose](https://github.com/beerose)! - Add `@defer` directive support\n\n  When a query includes a deferred fragment field, the server will return a partial response with the non-deferred fields first, followed by the remaining fields once they have been resolved.\n\n  Once start using the `@defer` directive in your queries, the generated code will automatically include support for the directive.\n\n  ```jsx\n  // src/index.tsx\n  import { graphql } from './gql'\n  const OrdersFragment = graphql(`\n    fragment OrdersFragment on User {\n      orders {\n        id\n        total\n      }\n    }\n  `)\n  const GetUserQuery = graphql(`\n    query GetUser($id: ID!) {\n      user(id: $id) {\n        id\n        name\n        ...OrdersFragment @defer\n      }\n    }\n  `)\n  ```\n\n  The generated type for `GetUserQuery` will have information that the fragment is _incremental,_ meaning it may not be available right away.\n\n  ```tsx\n  // gql/graphql.ts\n  export type GetUserQuery = { __typename?: 'Query'; id: string; name: string } & ({\n    __typename?: 'Query'\n  } & {\n    ' $fragmentRefs'?: { OrdersFragment: Incremental<OrdersFragment> }\n  })\n  ```\n\n  Apart from generating code that includes support for the `@defer` directive, the Codegen also exports a utility function called `isFragmentReady`. You can use it to conditionally render components based on whether the data for a deferred\n  fragment is available:\n\n  ```jsx\n  const OrdersList = (props: { data: FragmentType<typeof OrdersFragment> }) => {\n    const data = useFragment(OrdersFragment, props.data);\n    return (\n      // render orders list\n    )\n  };\n\n  function App() {\n    const { data } = useQuery(GetUserQuery);\n    return (\n      {data && (\n        <>\n          {isFragmentReady(GetUserQuery, OrdersFragment, data)\n  \t\t\t\t\t&& <OrdersList data={data} />}\n        </>\n      )}\n    );\n  }\n  export default App;\n  ```\n\n### Patch Changes\n\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96), [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`50471e651`](https://github.com/dotansimha/graphql-code-generator/commit/50471e6514557db827cd26157262401c6c600a8c), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c), [`ca02ad172`](https://github.com/dotansimha/graphql-code-generator/commit/ca02ad172a0e8f52570fdef4271ec286d883236d), [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0), [`5950f5a68`](https://github.com/dotansimha/graphql-code-generator/commit/5950f5a6843cdd92b9d5b8ced3a97b68eadf9f30), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n  - @graphql-codegen/visitor-plugin-common@4.0.0\n\n## 4.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`386cf9044`](https://github.com/dotansimha/graphql-code-generator/commit/386cf9044a41d87ed45069b22d26b30f4b262a85), [`402cb8ac0`](https://github.com/dotansimha/graphql-code-generator/commit/402cb8ac0f0c347b186d295c4b69c19e25a65d00)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.1\n\n## 4.0.0\n\n### Major Changes\n\n- [#9137](https://github.com/dotansimha/graphql-code-generator/pull/9137) [`2256c8b5d`](https://github.com/dotansimha/graphql-code-generator/commit/2256c8b5d0e13057d35692bbeba3b7b8f94d8712) Thanks [@beerose](https://github.com/beerose)! - Add `TypedDocumentNode` string alternative that doesn't require GraphQL AST on the client. This change requires `@graphql-typed-document-node/core` in version `3.2.0` or higher.\n\n### Patch Changes\n\n- Updated dependencies [[`e56790104`](https://github.com/dotansimha/graphql-code-generator/commit/e56790104ae56d6c5b48ef71823345bd09d3b835), [`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29), [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087), [`acb647e4e`](https://github.com/dotansimha/graphql-code-generator/commit/acb647e4efbddecf732b6e55dc47ac40c9bdaf08), [`9f4d9c5a4`](https://github.com/dotansimha/graphql-code-generator/commit/9f4d9c5a479d34da25df8e060a8c2b3b162647dd)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.0\n  - @graphql-codegen/plugin-helpers@4.2.0\n\n## 3.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`ba0610bbd`](https://github.com/dotansimha/graphql-code-generator/commit/ba0610bbd4578d8a82078014766f56d8ae5fcf7a), [`4b49f6fbe`](https://github.com/dotansimha/graphql-code-generator/commit/4b49f6fbed802907b460bfb7b6e9a85f88c555bc), [`b343626c9`](https://github.com/dotansimha/graphql-code-generator/commit/b343626c978b9ee0f14e314cea6c01ae3dad057c)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.2\n\n## 3.0.1\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n\n- [#8971](https://github.com/dotansimha/graphql-code-generator/pull/8971) [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Allow passing fragment documents to APIs like Apollos `readFragment`\n\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n  - @graphql-codegen/visitor-plugin-common@3.0.1\n\n## 3.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.0\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 2.3.13\n\n### Patch Changes\n\n- Updated dependencies [[`a98198524`](https://github.com/dotansimha/graphql-code-generator/commit/a9819852443884b43de7c15040ccffc205f9177a)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.8\n\n## 2.3.12\n\n### Patch Changes\n\n- Updated dependencies [[`eb454d06c`](https://github.com/dotansimha/graphql-code-generator/commit/eb454d06c977f11f7d4a7b0b07eb80f8fd590560)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.7\n\n## 2.3.11\n\n### Patch Changes\n\n- Updated dependencies [[`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`6c6b6f2df`](https://github.com/dotansimha/graphql-code-generator/commit/6c6b6f2df88a3a37b437a25320dab5590f033316)]:\n  - @graphql-codegen/plugin-helpers@3.1.2\n  - @graphql-codegen/visitor-plugin-common@2.13.6\n\n## 2.3.10\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81), [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n  - @graphql-codegen/visitor-plugin-common@2.13.5\n\n## 2.3.9\n\n### Patch Changes\n\n- [#8686](https://github.com/dotansimha/graphql-code-generator/pull/8686) [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`change-case-all@1.0.15` ↗︎](https://www.npmjs.com/package/change-case-all/v/1.0.15) (from `1.0.14`, in `dependencies`)\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n  - @graphql-codegen/visitor-plugin-common@2.13.4\n\n## 2.3.8\n\n### Patch Changes\n\n- Updated dependencies [[`62f655452`](https://github.com/dotansimha/graphql-code-generator/commit/62f6554520955dd675e11c920f35ef9bf0aaeffe)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.3\n\n## 2.3.7\n\n### Patch Changes\n\n- Updated dependencies [[`ef4c2c9c2`](https://github.com/dotansimha/graphql-code-generator/commit/ef4c2c9c233c68830f10eb4c167c7cceead27122)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.2\n\n## 2.3.6\n\n### Patch Changes\n\n- Updated dependencies [[`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.1\n  - @graphql-codegen/plugin-helpers@2.7.2\n\n## 2.3.5\n\n### Patch Changes\n\n- Updated dependencies [[`a46b8d99c`](https://github.com/dotansimha/graphql-code-generator/commit/a46b8d99c797283d773ec14163c62be9c84d4c2b)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.0\n\n## 2.3.4\n\n### Patch Changes\n\n- Updated dependencies [[`1bd7f771c`](https://github.com/dotansimha/graphql-code-generator/commit/1bd7f771ccb949a5a37395c7c57cb41c19340714)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.2\n\n## 2.3.3\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f), [`47d0a57e2`](https://github.com/dotansimha/graphql-code-generator/commit/47d0a57e27dd0d2334670bfc6c81c45e00ff4e74)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.1\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 2.3.2\n\n### Patch Changes\n\n- Updated dependencies [2cbcbb371]\n  - @graphql-codegen/visitor-plugin-common@2.12.0\n  - @graphql-codegen/plugin-helpers@2.6.0\n\n## 2.3.1\n\n### Patch Changes\n\n- Updated dependencies [525ad580b]\n  - @graphql-codegen/visitor-plugin-common@2.11.1\n\n## 2.3.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [68bb30e19]\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/visitor-plugin-common@2.11.0\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 2.2.14\n\n### Patch Changes\n\n- Updated dependencies [aa1e6eafd]\n- Updated dependencies [a42fcbfe4]\n- Updated dependencies [8b10f22be]\n  - @graphql-codegen/visitor-plugin-common@2.10.0\n\n## 2.2.13\n\n### Patch Changes\n\n- Updated dependencies [d16bebacb]\n  - @graphql-codegen/visitor-plugin-common@2.9.1\n\n## 2.2.12\n\n### Patch Changes\n\n- Updated dependencies [c3d7b7226]\n  - @graphql-codegen/visitor-plugin-common@2.9.0\n\n## 2.2.11\n\n### Patch Changes\n\n- Updated dependencies [f1fb77bd4]\n  - @graphql-codegen/visitor-plugin-common@2.8.0\n\n## 2.2.10\n\n### Patch Changes\n\n- Updated dependencies [9a5f31cb6]\n  - @graphql-codegen/visitor-plugin-common@2.7.6\n\n## 2.2.9\n\n### Patch Changes\n\n- Updated dependencies [2966686e9]\n  - @graphql-codegen/visitor-plugin-common@2.7.5\n\n## 2.2.8\n\n### Patch Changes\n\n- Updated dependencies [337fd4f77]\n  - @graphql-codegen/visitor-plugin-common@2.7.4\n\n## 2.2.7\n\n### Patch Changes\n\n- Updated dependencies [54718c039]\n  - @graphql-codegen/visitor-plugin-common@2.7.3\n\n## 2.2.6\n\n### Patch Changes\n\n- Updated dependencies [11d05e361]\n  - @graphql-codegen/visitor-plugin-common@2.7.2\n\n## 2.2.5\n\n### Patch Changes\n\n- Updated dependencies [fd55e2039]\n  - @graphql-codegen/visitor-plugin-common@2.7.1\n\n## 2.2.4\n\n### Patch Changes\n\n- Updated dependencies [1479233df]\n  - @graphql-codegen/visitor-plugin-common@2.7.0\n\n## 2.2.3\n\n### Patch Changes\n\n- Updated dependencies [c8ef37ae0]\n- Updated dependencies [754a33715]\n- Updated dependencies [bef4376d5]\n- Updated dependencies [be7cb3a82]\n  - @graphql-codegen/visitor-plugin-common@2.6.0\n  - @graphql-codegen/plugin-helpers@2.4.0\n\n## 2.2.2\n\n### Patch Changes\n\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/visitor-plugin-common@2.5.2\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 2.2.1\n\n### Patch Changes\n\n- Updated dependencies [a9f1f1594]\n- Updated dependencies [9ea6621ec]\n  - @graphql-codegen/visitor-plugin-common@2.5.1\n\n## 2.2.0\n\n### Minor Changes\n\n- 97ddb487a: feat: GraphQL v16 compatibility\n\n### Patch Changes\n\n- Updated dependencies [97ddb487a]\n  - @graphql-codegen/visitor-plugin-common@2.5.0\n  - @graphql-codegen/plugin-helpers@2.3.0\n\n## 2.1.6\n\n### Patch Changes\n\n- Updated dependencies [ad02cb9b8]\n  - @graphql-codegen/visitor-plugin-common@2.4.0\n\n## 2.1.5\n\n### Patch Changes\n\n- Updated dependencies [b9e85adae]\n- Updated dependencies [7c60e5acc]\n- Updated dependencies [3c2c847be]\n  - @graphql-codegen/visitor-plugin-common@2.3.0\n  - @graphql-codegen/plugin-helpers@2.2.0\n\n## 2.1.4\n\n### Patch Changes\n\n- Updated dependencies [0b090e31a]\n  - @graphql-codegen/visitor-plugin-common@2.2.1\n\n## 2.1.3\n\n### Patch Changes\n\n- Updated dependencies [d6c2d4c09]\n- Updated dependencies [feeae1c66]\n- Updated dependencies [5086791ac]\n  - @graphql-codegen/visitor-plugin-common@2.2.0\n\n## 2.1.2\n\n### Patch Changes\n\n- Updated dependencies [6470e6cc9]\n- Updated dependencies [263570e50]\n- Updated dependencies [35199dedf]\n  - @graphql-codegen/visitor-plugin-common@2.1.2\n  - @graphql-codegen/plugin-helpers@2.1.1\n\n## 2.1.1\n\n### Patch Changes\n\n- Updated dependencies [aabeff181]\n  - @graphql-codegen/visitor-plugin-common@2.1.1\n\n## 2.1.0\n\n### Minor Changes\n\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- 440172cfe: export config types\n- Updated dependencies [290170262]\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/visitor-plugin-common@2.1.0\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 2.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Minor Changes\n\n- bbdad95fd: Generation of `__typename` for SelectionSet by `addTypenameToSelectionSets` parameter\n\n### Patch Changes\n\n- Updated dependencies [d80efdec4]\n- Updated dependencies [d80efdec4]\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/visitor-plugin-common@2.0.0\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 1.18.10\n\n### Patch Changes\n\n- Updated dependencies [df19a4ed]\n- Updated dependencies [470336a1]\n- Updated dependencies [9005cc17]\n  - @graphql-codegen/visitor-plugin-common@1.22.0\n  - @graphql-codegen/plugin-helpers@1.18.8\n\n## 1.18.9\n\n### Patch Changes\n\n- Updated dependencies [6762aff5]\n  - @graphql-codegen/visitor-plugin-common@1.21.3\n\n## 1.18.8\n\n### Patch Changes\n\n- Updated dependencies [6aaecf1c]\n  - @graphql-codegen/visitor-plugin-common@1.21.2\n\n## 1.18.7\n\n### Patch Changes\n\n- cf1e5abc: Introduce new feature for removing duplicated fragments\n- Updated dependencies [cf1e5abc]\n  - @graphql-codegen/visitor-plugin-common@1.21.1\n\n## 1.18.6\n\n### Patch Changes\n\n- Updated dependencies [dfd25caf]\n- Updated dependencies [8da7dff6]\n  - @graphql-codegen/visitor-plugin-common@1.21.0\n  - @graphql-codegen/plugin-helpers@1.18.7\n\n## 1.18.5\n\n### Patch Changes\n\n- d9212aa0: fix(visitor-plugin-common): guard for a runtime type error\n- Updated dependencies [d9212aa0]\n- Updated dependencies [f0b5ea53]\n- Updated dependencies [097bea2f]\n  - @graphql-codegen/visitor-plugin-common@1.20.0\n  - @graphql-codegen/plugin-helpers@1.18.5\n\n## 1.18.4\n\n### Patch Changes\n\n- 23862e7e: fix(naming-convention): revert and pin change-case-all dependency for workaround #3256\n- Updated dependencies [23862e7e]\n  - @graphql-codegen/visitor-plugin-common@1.19.1\n  - @graphql-codegen/plugin-helpers@1.18.4\n\n## 1.18.3\n\n### Patch Changes\n\n- 29b75b1e: enhance(namingConvention): use change-case-all instead of individual packages for naming convention\n- Updated dependencies [e947f8e3]\n- Updated dependencies [29b75b1e]\n- Updated dependencies [d4942d04]\n- Updated dependencies [1f6f3db6]\n- Updated dependencies [29b75b1e]\n  - @graphql-codegen/visitor-plugin-common@1.19.0\n  - @graphql-codegen/plugin-helpers@1.18.3\n\n## 1.18.2\n\n### Patch Changes\n\n- 99533389: Enable flattening typed document nodes\n- Updated dependencies [64293437]\n- Updated dependencies [fd5843a7]\n- Updated dependencies [d75051f5]\n  - @graphql-codegen/visitor-plugin-common@1.17.22\n\n## 1.18.1\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/visitor-plugin-common@1.17.20\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 1.18.0\n\n### Minor Changes\n\n- bd3bd296: Improve DocumentNode optimizations, to reduce bundle size when consumed as pre-compiled\n\n### Patch Changes\n\n- Updated dependencies [99819bf1]\n- Updated dependencies [c3b59e81]\n  - @graphql-codegen/visitor-plugin-common@1.17.19\n\n## 1.17.10\n\n### Patch Changes\n\n- 3e3941b9: Avoid printing imports when there are no operations\n- Updated dependencies [612e5e52]\n- Updated dependencies [9f2a4e2f]\n- Updated dependencies [0f35e775]\n- Updated dependencies [eaf45d1f]\n  - @graphql-codegen/visitor-plugin-common@1.17.17\n  - @graphql-codegen/plugin-helpers@1.18.1\n\n## 1.17.9\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n  - @graphql-codegen/visitor-plugin-common@1.17.13\n  - @graphql-codegen/plugin-helpers@1.17.8\n\n## 1.17.8\n\n### Patch Changes\n\n- 4266a15f: Allow this plugin to work with `documentMode: graphqlTag` correctly.\n\n  Added validation for preventing `documentMode: string` because it's not supported in this plugin.\n\n- Updated dependencies [4266a15f]\n  - @graphql-codegen/visitor-plugin-common@1.17.12\n"
  },
  {
    "path": "packages/plugins/typescript/typed-document-node/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/typed-document-node\",\n  \"version\": \"6.1.7\",\n  \"description\": \"GraphQL Code Generator plugin for generating ready-to-use TypedDocumentNode based on GraphQL operations\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/plugins/typescript/typed-document-node\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"dependencies\": {\n    \"change-case-all\": \"1.0.15\",\n    \"@graphql-codegen/plugin-helpers\": \"^6.1.1\",\n    \"@graphql-codegen/visitor-plugin-common\": \"^6.2.4\",\n    \"auto-bind\": \"~4.0.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/typed-document-node/src/config.ts",
    "content": "import { RawClientSideBasePluginConfig } from '@graphql-codegen/visitor-plugin-common';\n\nexport interface TypeScriptTypedDocumentNodesConfig extends RawClientSideBasePluginConfig {\n  /**\n   * @description Flatten fragment spread and inline fragments into a simple selection set before generating.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-operations'],\n   *        config: {\n   *          flattenGeneratedTypes: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  flattenGeneratedTypes?: boolean;\n\n  /**\n   * @description Add __typename to selection set\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-operations'],\n   *        config: {\n   *          addTypenameToSelectionSets: true\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  addTypenameToSelectionSets?: boolean;\n\n  /**\n   * @description Allows you to import the operation types from a different file.\n   * @default \"\"\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        plugins: ['typescript', 'typescript-operations']\n   *      },\n   *      'path/to/file2.ts': {\n   *        plugins: ['typed-document-node'],\n   *        config: {\n   *          importOperationTypesFrom: 'path/to/file.ts'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  importOperationTypesFrom?: string;\n}\n"
  },
  {
    "path": "packages/plugins/typescript/typed-document-node/src/index.ts",
    "content": "import { extname } from 'path';\nimport { oldVisit, PluginFunction, PluginValidateFn, Types } from '@graphql-codegen/plugin-helpers';\nimport {\n  DocumentMode,\n  LoadedFragment,\n  optimizeOperations,\n  RawClientSideBasePluginConfig,\n} from '@graphql-codegen/visitor-plugin-common';\nimport { concatAST, FragmentDefinitionNode, GraphQLSchema, Kind } from 'graphql';\nimport { TypeScriptTypedDocumentNodesConfig } from './config.js';\nimport { TypeScriptDocumentNodesVisitor } from './visitor.js';\n\nexport const plugin: PluginFunction<TypeScriptTypedDocumentNodesConfig> = (\n  schema: GraphQLSchema,\n  rawDocuments: Types.DocumentFile[],\n  config: TypeScriptTypedDocumentNodesConfig\n) => {\n  const documents = config.flattenGeneratedTypes ? optimizeOperations(schema, rawDocuments) : rawDocuments;\n  const allAst = concatAST(documents.map(v => v.document));\n\n  const allFragments: LoadedFragment[] = [\n    ...(allAst.definitions.filter(d => d.kind === Kind.FRAGMENT_DEFINITION) as FragmentDefinitionNode[]).map(\n      fragmentDef => ({\n        node: fragmentDef,\n        name: fragmentDef.name.value,\n        onType: fragmentDef.typeCondition.name.value,\n        isExternal: false,\n      })\n    ),\n    ...(config.externalFragments || []),\n  ];\n\n  const visitor = new TypeScriptDocumentNodesVisitor(schema, allFragments, config, documents);\n  const visitorResult = oldVisit(allAst, { leave: visitor });\n\n  let content: string[] = [];\n  if (config.documentMode === DocumentMode.string) {\n    content = [\n      `\\\nexport class TypedDocumentString<TResult, TVariables>\n  extends String\n  implements DocumentTypeDecoration<TResult, TVariables>\n{\n  __apiType?: NonNullable<DocumentTypeDecoration<TResult, TVariables>['__apiType']>;\n  private value: string;\n  public __meta__?: Record<string, any> | undefined;\n\n  constructor(value: string, __meta__?: Record<string, any> | undefined) {\n    super(value);\n    this.value = value;\n    this.__meta__ = __meta__;\n  }\n\n  override toString(): string & DocumentTypeDecoration<TResult, TVariables> {\n    return this.value;\n  }\n}`,\n    ];\n  }\n\n  return {\n    prepend: allAst.definitions.length === 0 ? [] : visitor.getImports(),\n    content: [...content, visitor.fragments, ...visitorResult.definitions.filter(t => typeof t === 'string')].join(\n      '\\n'\n    ),\n  };\n};\n\nexport const validate: PluginValidateFn<RawClientSideBasePluginConfig> = async (\n  _schema: GraphQLSchema,\n  _documents: Types.DocumentFile[],\n  _config,\n  outputFile: string\n) => {\n  if (extname(outputFile) !== '.ts' && extname(outputFile) !== '.tsx') {\n    throw new Error(`Plugin \"typed-document-node\" requires extension to be \".ts\" or \".tsx\"!`);\n  }\n};\n\nexport { TypeScriptTypedDocumentNodesConfig };\n"
  },
  {
    "path": "packages/plugins/typescript/typed-document-node/src/visitor.ts",
    "content": "import { Types } from '@graphql-codegen/plugin-helpers';\nimport {\n  ClientSideBasePluginConfig,\n  ClientSideBaseVisitor,\n  DocumentMode,\n  LoadedFragment,\n  RawClientSideBasePluginConfig,\n} from '@graphql-codegen/visitor-plugin-common';\nimport autoBind from 'auto-bind';\nimport { GraphQLSchema } from 'graphql';\n\ninterface TypeScriptDocumentNodesVisitorPluginConfig extends RawClientSideBasePluginConfig {\n  addTypenameToSelectionSets?: boolean;\n}\n\nexport class TypeScriptDocumentNodesVisitor extends ClientSideBaseVisitor<\n  TypeScriptDocumentNodesVisitorPluginConfig,\n  ClientSideBasePluginConfig\n> {\n  private pluginConfig: TypeScriptDocumentNodesVisitorPluginConfig;\n\n  constructor(\n    schema: GraphQLSchema,\n    fragments: LoadedFragment[],\n    config: TypeScriptDocumentNodesVisitorPluginConfig,\n    documents: Types.DocumentFile[]\n  ) {\n    super(\n      schema,\n      fragments,\n      {\n        documentNodeImport: '@graphql-typed-document-node/core#TypedDocumentNode',\n        ...config,\n        documentMode: config.documentMode || DocumentMode.documentNodeImportFragments,\n      },\n      {},\n      documents\n    );\n\n    this.pluginConfig = config;\n\n    autoBind(this);\n\n    // We need to make sure it's there because in this mode, the base plugin doesn't add the import\n    if (this.config.documentMode === DocumentMode.graphQLTag) {\n      const documentNodeImport = this._parseImport(this.config.documentNodeImport || 'graphql#DocumentNode');\n      const tagImport = this._generateImport(documentNodeImport, 'DocumentNode', true);\n      this._imports.add(tagImport);\n    } else if (this.config.documentMode === DocumentMode.string) {\n      const tagImport = this._generateImport(\n        { moduleName: '@graphql-typed-document-node/core', propName: 'DocumentTypeDecoration' },\n        'DocumentTypeDecoration',\n        true\n      );\n      this._imports.add(tagImport);\n    }\n  }\n\n  public SelectionSet(node, _, parent) {\n    if (!this.pluginConfig.addTypenameToSelectionSets) {\n      return;\n    }\n\n    // Don't add __typename to OperationDefinitions.\n    if (parent && parent.kind === 'OperationDefinition') {\n      return;\n    }\n\n    // No changes if no selections.\n    const { selections } = node;\n    if (!selections) {\n      return;\n    }\n\n    // If selections already have a __typename or is introspection do nothing.\n    const hasTypename = selections.some(\n      selection =>\n        selection.kind === 'Field' &&\n        (selection.name.value === '__typename' || selection.name.value.lastIndexOf('__', 0) === 0)\n    );\n    if (hasTypename) {\n      return;\n    }\n\n    return {\n      ...node,\n      selections: [\n        ...selections,\n        {\n          kind: 'Field',\n          name: {\n            kind: 'Name',\n            value: '__typename',\n          },\n        },\n      ],\n    };\n  }\n\n  protected getDocumentNodeSignature(resultType: string, variablesTypes: string, node) {\n    const shouldUseImportPrefix = !!this.config.importOperationTypesFrom;\n    const resultImportPrefix = shouldUseImportPrefix && resultType !== 'unknown' ? 'Types.' : '';\n    const variablesImportPrefix = shouldUseImportPrefix && variablesTypes !== 'unknown' ? 'Types.' : '';\n    if (\n      this.config.documentMode === DocumentMode.documentNode ||\n      this.config.documentMode === DocumentMode.documentNodeImportFragments ||\n      this.config.documentMode === DocumentMode.graphQLTag\n    ) {\n      return ` as unknown as DocumentNode<${resultImportPrefix}${resultType}, ${variablesImportPrefix}${variablesTypes}>`;\n    }\n\n    if (this.config.documentMode === DocumentMode.string) {\n      return ` as unknown as TypedDocumentString<${resultImportPrefix}${resultType}, ${variablesImportPrefix}${variablesTypes}>`;\n    }\n\n    return super.getDocumentNodeSignature(resultType, variablesTypes, node);\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/typed-document-node/tests/typed-document-node.spec.ts",
    "content": "import { Types } from '@graphql-codegen/plugin-helpers';\nimport { buildSchema, parse } from 'graphql';\nimport { plugin } from '../src/index.js';\n\ndescribe('TypedDocumentNode', () => {\n  it('Should not output imports when there are no operations at all', async () => {\n    const result = (await plugin(null as any, [], {})) as Types.ComplexPluginOutput;\n    expect(result.content).toBe('');\n    expect(result.prepend.length).toBe(0);\n  });\n\n  describe('addTypenameToSelectionSets', () => {\n    it('Check is add __typename to typed document', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        schema {\n          query: Query\n        }\n\n        type Query {\n          job: Job\n        }\n\n        type Job {\n          id: ID!\n        }\n      `);\n\n      const ast = parse(/* GraphQL */ `\n        query {\n          job {\n            id\n          }\n        }\n      `);\n\n      const res = (await plugin(\n        schema,\n        [{ location: '', document: ast }],\n        { addTypenameToSelectionSets: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect((res.content.match(/__typename/g) || []).length).toBe(1);\n    });\n\n    it('Check with __typename in selection set', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        schema {\n          query: Query\n        }\n\n        type Query {\n          job: Job\n        }\n\n        type Job {\n          id: ID!\n        }\n      `);\n\n      const ast = parse(/* GraphQL */ `\n        query {\n          job {\n            id\n            __typename\n          }\n        }\n      `);\n\n      const res = (await plugin(\n        schema,\n        [{ location: '', document: ast }],\n        { addTypenameToSelectionSets: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect((res.content.match(/__typename/g) || []).length).toBe(1);\n    });\n  });\n\n  describe('addTypenameToSelectionSets', () => {\n    it('Should import Types from the given file', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        schema {\n          query: Query\n        }\n\n        type Query {\n          job: Job\n        }\n\n        type Job {\n          id: ID!\n        }\n      `);\n\n      const ast = parse(/* GraphQL */ `\n        query {\n          job {\n            ...JobFragment\n          }\n        }\n\n        fragment JobFragment on Job {\n          id\n        }\n      `);\n\n      const res = (await plugin(\n        schema,\n        [{ location: '', document: ast }],\n        { importOperationTypesFrom: 'file.ts' },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect((res.content.match(/<Types.Query, Types.QueryVariables>/g) || []).length).toBe(1);\n      expect((res.content.match(/<Types.JobFragmentFragment, unknown>/g) || []).length).toBe(1);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/typed-document-node/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'typed-document-node',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/plugins/typescript/typescript/CHANGELOG.md",
    "content": "# @graphql-codegen/typescript\n\n## 5.0.9\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-codegen/visitor-plugin-common@^6.2.3` ↗︎](https://www.npmjs.com/package/@graphql-codegen/visitor-plugin-common/v/6.2.3) (from `6.2.3`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/plugin-helpers@6.1.1\n  - @graphql-codegen/schema-ast@5.0.1\n  - @graphql-codegen/visitor-plugin-common@6.2.4\n\n## 5.0.8\n\n### Patch Changes\n\n- Updated dependencies [[`6038634`](https://github.com/dotansimha/graphql-code-generator/commit/60386344081917f2884db933309821603a2be2bf)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.3\n\n## 5.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`f588d91`](https://github.com/dotansimha/graphql-code-generator/commit/f588d91ac43ea0aa5931915ce980d2e6876bb59c)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.2\n\n## 5.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`b995ed1`](https://github.com/dotansimha/graphql-code-generator/commit/b995ed13a49379ea05e0e313fac68b557527523a)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.1\n\n## 5.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`f821e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f821e8ab9351f23a9f7e5d5e6fc69c8e8868cad8), [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.0\n  - @graphql-codegen/plugin-helpers@6.1.0\n\n## 5.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`51a1a72`](https://github.com/dotansimha/graphql-code-generator/commit/51a1a7280578d43681391df11d320a8416c0b41d)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.2\n\n## 5.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`6715330`](https://github.com/dotansimha/graphql-code-generator/commit/67153304646694d75aee24afd70c3fce12e9f1f2)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.1\n\n## 5.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`8258f1f`](https://github.com/dotansimha/graphql-code-generator/commit/8258f1f6012c106d02ef28bca9ec424f70c4aa26)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.0\n\n## 5.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`accdab6`](https://github.com/dotansimha/graphql-code-generator/commit/accdab69106605241933e9d66d64dc7077656f30)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.1\n\n## 5.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Remove NameNode override\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.0\n  - @graphql-codegen/plugin-helpers@6.0.0\n  - @graphql-codegen/schema-ast@5.0.0\n\n## 4.1.6\n\n### Patch Changes\n\n- Updated dependencies [[`f6909d1`](https://github.com/dotansimha/graphql-code-generator/commit/f6909d1797c15b79a0afb7ec089471763a485bfc)]:\n  - @graphql-codegen/visitor-plugin-common@5.8.0\n\n## 4.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`d8566c0`](https://github.com/dotansimha/graphql-code-generator/commit/d8566c015943ea4dbcaeaf57d3d8406553ae230a)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.1\n\n## 4.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`6d7c1d7`](https://github.com/dotansimha/graphql-code-generator/commit/6d7c1d7c0a4662acdc0efafd4234229ad0a8dd3c)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.0\n\n## 4.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`60dd72f`](https://github.com/dotansimha/graphql-code-generator/commit/60dd72fb103fd7fd70b4e1def98da29588865517)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.1\n\n## 4.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`1617e3c`](https://github.com/dotansimha/graphql-code-generator/commit/1617e3cf38f3059cc5ea88b540033f521f03725a), [`fa64fbf`](https://github.com/dotansimha/graphql-code-generator/commit/fa64fbf8a44e1cee7ae17806dcd178dc7350c4ba)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.0\n\n## 4.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`55a1e9e`](https://github.com/dotansimha/graphql-code-generator/commit/55a1e9e63830df17ed40602ea7e322bbf48b17bc), [`a235051`](https://github.com/dotansimha/graphql-code-generator/commit/a23505180ac2f275a55ece27162ec9bfcdc52e03)]:\n  - @graphql-codegen/visitor-plugin-common@5.5.0\n  - @graphql-codegen/plugin-helpers@5.1.0\n\n## 4.1.0\n\n### Minor Changes\n\n- [#10077](https://github.com/dotansimha/graphql-code-generator/pull/10077) [`3f4f546`](https://github.com/dotansimha/graphql-code-generator/commit/3f4f5466ff168ad822b9a00d83d3779078e6d8c4) Thanks [@eddeee888](https://github.com/eddeee888)! - Extend `config.avoidOptions` to support query, mutation and subscription\n\n  Previously, `config.avoidOptions.resolvers` was being used to make query, mutation and subscription fields non-optional.\n  Now, `config.avoidOptions.query`, `config.avoidOptions.mutation` and `config.avoidOptions.subscription` can be used to target the respective types.\n\n### Patch Changes\n\n- Updated dependencies [[`3f4f546`](https://github.com/dotansimha/graphql-code-generator/commit/3f4f5466ff168ad822b9a00d83d3779078e6d8c4)]:\n  - @graphql-codegen/visitor-plugin-common@5.4.0\n\n## 4.0.9\n\n### Patch Changes\n\n- Updated dependencies [[`79fee3c`](https://github.com/dotansimha/graphql-code-generator/commit/79fee3cada20d683d250aad5aa5fef9d6ed9f4d2)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.1\n\n## 4.0.8\n\n### Patch Changes\n\n- Updated dependencies [[`808ada5`](https://github.com/dotansimha/graphql-code-generator/commit/808ada595d83d39cad045da5824cac6378e9eca3), [`14ce39e`](https://github.com/dotansimha/graphql-code-generator/commit/14ce39e41dfee38c652be736664177fa2b1df421)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.0\n\n## 4.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`156cc2b`](https://github.com/dotansimha/graphql-code-generator/commit/156cc2b9a2a5129beba121cfa987b04e29899431), [`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`b49457b`](https://github.com/dotansimha/graphql-code-generator/commit/b49457b5f29328d2dc23c642788a2e697cb8966e)]:\n  - @graphql-codegen/plugin-helpers@5.0.4\n  - @graphql-codegen/visitor-plugin-common@5.2.0\n\n## 4.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`920b443`](https://github.com/dotansimha/graphql-code-generator/commit/920b443a401b8cc4811f64ec5b25fc7b4ae32b53), [`ed9c205`](https://github.com/dotansimha/graphql-code-generator/commit/ed9c205d15d7f14ed73e54aecf40e4fad5664e9d)]:\n  - @graphql-codegen/visitor-plugin-common@5.1.0\n\n## 4.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`53f270a`](https://github.com/dotansimha/graphql-code-generator/commit/53f270acfa1da992e0f9d2e50921bb588392f8a5)]:\n  - @graphql-codegen/visitor-plugin-common@5.0.0\n\n## 4.0.4\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.2\n  - @graphql-codegen/schema-ast@4.0.2\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 4.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`7718a8113`](https://github.com/dotansimha/graphql-code-generator/commit/7718a8113dc6282475cb738f1e28698b8221fa2f)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.1\n\n## 4.0.2\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n  - @graphql-codegen/schema-ast@4.0.1\n  - @graphql-codegen/visitor-plugin-common@4.1.0\n\n## 4.0.1\n\n### Patch Changes\n\n- [#9497](https://github.com/dotansimha/graphql-code-generator/pull/9497) [`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a) Thanks [@eddeee888](https://github.com/eddeee888)! - Revert default ID scalar input type to string\n\n  We changed the ID Scalar input type from `string` to `string | number` in the latest major version of `typescript` plugin. This causes issues for server plugins (e.g. typescript-resolvers) that depends on `typescript` plugin. This is because the scalar type needs to be manually inverted on setup which is confusing.\n\n- Updated dependencies [[`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a)]:\n  - @graphql-codegen/visitor-plugin-common@4.0.1\n\n## 4.0.0\n\n### Major Changes\n\n- [#9375](https://github.com/dotansimha/graphql-code-generator/pull/9375) [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929) Thanks [@eddeee888](https://github.com/eddeee888)! - Implement Scalars with input/output types\n\n  In GraphQL, Scalar types can be different for client and server. For example, given the native GraphQL ID:\n\n  - A client may send `string` or `number` in the input\n  - A client receives `string` in its selection set (i.e output)\n  - A server receives `string` in the resolver (GraphQL parses `string` or `number` received from the client to `string`)\n  - A server may return `string` or `number` (GraphQL serializes the value to `string` before sending it to the client )\n\n  Currently, we represent every Scalar with only one type. This is what codegen generates as base type:\n\n  ```ts\n  export type Scalars = {\n    ID: string\n  }\n  ```\n\n  Then, this is used in both input and output type e.g.\n\n  ```ts\n  export type Book = {\n    __typename?: 'Book'\n    id: Scalars['ID'] // Output's ID can be `string` 👍\n  }\n\n  export type QueryBookArgs = {\n    id: Scalars['ID'] // Input's ID can be `string` or `number`. However, the type is only `string` here 👎\n  }\n  ```\n\n  This PR extends each Scalar to have input and output:\n\n  ```ts\n  export type Scalars = {\n    ID: {\n      input: string | number\n      output: string\n    }\n  }\n  ```\n\n  Then, each input/output GraphQL type can correctly refer to the correct input/output scalar type:\n\n  ```ts\n  export type Book = {\n    __typename?: 'Book'\n    id: Scalars['ID']['output'] // Output's ID can be `string` 👍\n  }\n\n  export type QueryBookArgs = {\n    id: Scalars['ID']['input'] // Input's ID can be `string` or `number` 👍\n  }\n  ```\n\n  Note that for `typescript-resolvers`, the type of ID needs to be inverted. However, the referenced types in GraphQL input/output types should still work correctly:\n\n  ```ts\n  export type Scalars = {\n    ID: {\n      input: string;\n      output: string | number;\n    }\n  }\n\n  export type Book = {\n    __typename?: \"Book\";\n    id: Scalars[\"ID\"]['output']; // Resolvers can return `string` or `number` in ID fields 👍\n  };\n\n  export type QueryBookArgs = {\n    id: Scalars[\"ID\"]['input']; // Resolvers receive `string` in ID fields 👍\n  };\n\n  export type ResolversTypes = {\n    ID: ID: ResolverTypeWrapper<Scalars['ID']['output']>; // Resolvers can return `string` or `number` in ID fields 👍\n  }\n\n  export type ResolversParentTypes = {\n    ID: Scalars['ID']['output']; // Resolvers receive `string` or `number` from parents 👍\n  };\n  ```\n\n  ***\n\n  Config changes:\n\n  1. Scalars option can now take input/output types:\n\n  ```ts\n  config: {\n    scalars: {\n      ID: {\n        input: 'string',\n        output: 'string | number'\n      }\n    }\n  }\n  ```\n\n  2. If a string is given (instead of an object with input/output fields), it will be used as both input and output types:\n\n  ```ts\n  config: {\n    scalars: {\n      ID: 'string' // This means `string` will be used for both ID's input and output types\n    }\n  }\n  ```\n\n  3. BREAKING CHANGE: External module Scalar types need to be an object with input/output fields\n\n  ```ts\n  config: {\n    scalars: {\n      ID: './path/to/scalar-module'\n    }\n  }\n  ```\n\n  If correctly, wired up, the following will be generated:\n\n  ```ts\n  // Previously, imported `ID` type can be a primitive type, now it must be an object with input/output fields\n  import { ID } from './path/to/scalar-module'\n\n  export type Scalars = {\n    ID: { input: ID['input']; output: ID['output'] }\n  }\n  ```\n\n  ***\n\n  BREAKING CHANGE: This changes Scalar types which could be referenced in other plugins. If you are a plugin maintainer and reference Scalar, please update your plugin to use the correct input/output types.\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Minor Changes\n\n- [#9196](https://github.com/dotansimha/graphql-code-generator/pull/9196) [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96) Thanks [@beerose](https://github.com/beerose)! - Add `@defer` directive support\n\n  When a query includes a deferred fragment field, the server will return a partial response with the non-deferred fields first, followed by the remaining fields once they have been resolved.\n\n  Once start using the `@defer` directive in your queries, the generated code will automatically include support for the directive.\n\n  ```jsx\n  // src/index.tsx\n  import { graphql } from './gql'\n  const OrdersFragment = graphql(`\n    fragment OrdersFragment on User {\n      orders {\n        id\n        total\n      }\n    }\n  `)\n  const GetUserQuery = graphql(`\n    query GetUser($id: ID!) {\n      user(id: $id) {\n        id\n        name\n        ...OrdersFragment @defer\n      }\n    }\n  `)\n  ```\n\n  The generated type for `GetUserQuery` will have information that the fragment is _incremental,_ meaning it may not be available right away.\n\n  ```tsx\n  // gql/graphql.ts\n  export type GetUserQuery = { __typename?: 'Query'; id: string; name: string } & ({\n    __typename?: 'Query'\n  } & {\n    ' $fragmentRefs'?: { OrdersFragment: Incremental<OrdersFragment> }\n  })\n  ```\n\n  Apart from generating code that includes support for the `@defer` directive, the Codegen also exports a utility function called `isFragmentReady`. You can use it to conditionally render components based on whether the data for a deferred\n  fragment is available:\n\n  ```jsx\n  const OrdersList = (props: { data: FragmentType<typeof OrdersFragment> }) => {\n    const data = useFragment(OrdersFragment, props.data);\n    return (\n      // render orders list\n    )\n  };\n\n  function App() {\n    const { data } = useQuery(GetUserQuery);\n    return (\n      {data && (\n        <>\n          {isFragmentReady(GetUserQuery, OrdersFragment, data)\n  \t\t\t\t\t&& <OrdersList data={data} />}\n        </>\n      )}\n    );\n  }\n  export default App;\n  ```\n\n- [#9304](https://github.com/dotansimha/graphql-code-generator/pull/9304) [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823) Thanks [@esfomeado](https://github.com/esfomeado)! - Added support for disabling suffixes on Enums.\n\n### Patch Changes\n\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96), [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`50471e651`](https://github.com/dotansimha/graphql-code-generator/commit/50471e6514557db827cd26157262401c6c600a8c), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c), [`ca02ad172`](https://github.com/dotansimha/graphql-code-generator/commit/ca02ad172a0e8f52570fdef4271ec286d883236d), [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0), [`5950f5a68`](https://github.com/dotansimha/graphql-code-generator/commit/5950f5a6843cdd92b9d5b8ced3a97b68eadf9f30), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n  - @graphql-codegen/schema-ast@4.0.0\n  - @graphql-codegen/visitor-plugin-common@4.0.0\n\n## 3.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`386cf9044`](https://github.com/dotansimha/graphql-code-generator/commit/386cf9044a41d87ed45069b22d26b30f4b262a85), [`402cb8ac0`](https://github.com/dotansimha/graphql-code-generator/commit/402cb8ac0f0c347b186d295c4b69c19e25a65d00)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.1\n\n## 3.0.3\n\n### Patch Changes\n\n- [#9150](https://github.com/dotansimha/graphql-code-generator/pull/9150) [`92d86b009`](https://github.com/dotansimha/graphql-code-generator/commit/92d86b009579edf70f60b0b8e28658af93ff9fd1) Thanks [@rliljest](https://github.com/rliljest)! - Properly escape enum identifiers when enumsAsConst is used\n\n- Updated dependencies [[`e56790104`](https://github.com/dotansimha/graphql-code-generator/commit/e56790104ae56d6c5b48ef71823345bd09d3b835), [`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29), [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087), [`acb647e4e`](https://github.com/dotansimha/graphql-code-generator/commit/acb647e4efbddecf732b6e55dc47ac40c9bdaf08), [`9f4d9c5a4`](https://github.com/dotansimha/graphql-code-generator/commit/9f4d9c5a479d34da25df8e060a8c2b3b162647dd)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.0\n  - @graphql-codegen/plugin-helpers@4.2.0\n\n## 3.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`ba0610bbd`](https://github.com/dotansimha/graphql-code-generator/commit/ba0610bbd4578d8a82078014766f56d8ae5fcf7a), [`4b49f6fbe`](https://github.com/dotansimha/graphql-code-generator/commit/4b49f6fbed802907b460bfb7b6e9a85f88c555bc), [`b343626c9`](https://github.com/dotansimha/graphql-code-generator/commit/b343626c978b9ee0f14e314cea6c01ae3dad057c)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.2\n\n## 3.0.1\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n  - @graphql-codegen/schema-ast@3.0.1\n  - @graphql-codegen/visitor-plugin-common@3.0.1\n\n## 3.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.0\n  - @graphql-codegen/plugin-helpers@4.0.0\n  - @graphql-codegen/schema-ast@3.0.0\n\n## 2.8.8\n\n### Patch Changes\n\n- Updated dependencies [[`a98198524`](https://github.com/dotansimha/graphql-code-generator/commit/a9819852443884b43de7c15040ccffc205f9177a)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.8\n\n## 2.8.7\n\n### Patch Changes\n\n- Updated dependencies [[`eb454d06c`](https://github.com/dotansimha/graphql-code-generator/commit/eb454d06c977f11f7d4a7b0b07eb80f8fd590560)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.7\n\n## 2.8.6\n\n### Patch Changes\n\n- Updated dependencies [[`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`6c6b6f2df`](https://github.com/dotansimha/graphql-code-generator/commit/6c6b6f2df88a3a37b437a25320dab5590f033316)]:\n  - @graphql-codegen/plugin-helpers@3.1.2\n  - @graphql-codegen/schema-ast@2.6.1\n  - @graphql-codegen/visitor-plugin-common@2.13.6\n\n## 2.8.5\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`fedd71cbb`](https://github.com/dotansimha/graphql-code-generator/commit/fedd71cbb7f37440a59032d942cb228df78d52e5), [`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81), [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a)]:\n  - @graphql-codegen/schema-ast@2.6.0\n  - @graphql-codegen/plugin-helpers@3.1.1\n  - @graphql-codegen/visitor-plugin-common@2.13.5\n\n## 2.8.4\n\n### Patch Changes\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n  - @graphql-codegen/visitor-plugin-common@2.13.4\n  - @graphql-codegen/schema-ast@2.5.2\n\n## 2.8.3\n\n### Patch Changes\n\n- Updated dependencies [[`62f655452`](https://github.com/dotansimha/graphql-code-generator/commit/62f6554520955dd675e11c920f35ef9bf0aaeffe)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.3\n\n## 2.8.2\n\n### Patch Changes\n\n- [#8586](https://github.com/dotansimha/graphql-code-generator/pull/8586) [`ef4c2c9c2`](https://github.com/dotansimha/graphql-code-generator/commit/ef4c2c9c233c68830f10eb4c167c7cceead27122) Thanks [@levrik](https://github.com/levrik)! - Fix incompatibility between `@oneOf` input types and declaration kind other than `type`\n\n- Updated dependencies [[`ef4c2c9c2`](https://github.com/dotansimha/graphql-code-generator/commit/ef4c2c9c233c68830f10eb4c167c7cceead27122)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.2\n\n## 2.8.1\n\n### Patch Changes\n\n- Updated dependencies [[`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.1\n  - @graphql-codegen/plugin-helpers@2.7.2\n\n## 2.8.0\n\n### Minor Changes\n\n- [#8390](https://github.com/dotansimha/graphql-code-generator/pull/8390) [`12ecbe067`](https://github.com/dotansimha/graphql-code-generator/commit/12ecbe067b37c340ffef99b96d487931be260f69) Thanks [@Diizzayy](https://github.com/Diizzayy)! - handle undefined namedType when including introspection type definitions\n\n## 2.7.5\n\n### Patch Changes\n\n- Updated dependencies [[`a46b8d99c`](https://github.com/dotansimha/graphql-code-generator/commit/a46b8d99c797283d773ec14163c62be9c84d4c2b)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.0\n\n## 2.7.4\n\n### Patch Changes\n\n- Updated dependencies [[`1bd7f771c`](https://github.com/dotansimha/graphql-code-generator/commit/1bd7f771ccb949a5a37395c7c57cb41c19340714)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.2\n\n## 2.7.3\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f), [`47d0a57e2`](https://github.com/dotansimha/graphql-code-generator/commit/47d0a57e27dd0d2334670bfc6c81c45e00ff4e74)]:\n  - @graphql-codegen/schema-ast@2.5.1\n  - @graphql-codegen/visitor-plugin-common@2.12.1\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 2.7.2\n\n### Patch Changes\n\n- Updated dependencies [2cbcbb371]\n  - @graphql-codegen/visitor-plugin-common@2.12.0\n  - @graphql-codegen/plugin-helpers@2.6.0\n\n## 2.7.1\n\n### Patch Changes\n\n- Updated dependencies [525ad580b]\n  - @graphql-codegen/visitor-plugin-common@2.11.1\n\n## 2.7.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [68bb30e19]\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/visitor-plugin-common@2.11.0\n  - @graphql-codegen/schema-ast@2.5.0\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 2.6.0\n\n### Minor Changes\n\n- aa1e6eafd: Add @Deprecated support for input\n\n### Patch Changes\n\n- 8b10f22be: Ensure falsy enum values are still mapped\n- Updated dependencies [aa1e6eafd]\n- Updated dependencies [a42fcbfe4]\n- Updated dependencies [8b10f22be]\n  - @graphql-codegen/visitor-plugin-common@2.10.0\n\n## 2.5.1\n\n### Patch Changes\n\n- Updated dependencies [d16bebacb]\n  - @graphql-codegen/visitor-plugin-common@2.9.1\n\n## 2.5.0\n\n### Minor Changes\n\n- c3d7b7226: support the `@oneOf` directive on input types.\n\n### Patch Changes\n\n- Updated dependencies [c3d7b7226]\n  - @graphql-codegen/visitor-plugin-common@2.9.0\n\n## 2.4.11\n\n### Patch Changes\n\n- Updated dependencies [f1fb77bd4]\n  - @graphql-codegen/visitor-plugin-common@2.8.0\n\n## 2.4.10\n\n### Patch Changes\n\n- 9a5f31cb6: New option `onlyEnums` for Typescript\n- Updated dependencies [9a5f31cb6]\n  - @graphql-codegen/visitor-plugin-common@2.7.6\n\n## 2.4.9\n\n### Patch Changes\n\n- Updated dependencies [2966686e9]\n  - @graphql-codegen/visitor-plugin-common@2.7.5\n\n## 2.4.8\n\n### Patch Changes\n\n- Updated dependencies [337fd4f77]\n  - @graphql-codegen/visitor-plugin-common@2.7.4\n\n## 2.4.7\n\n### Patch Changes\n\n- 54718c039: Improve @Deprecated Enum Type developer experience\n- Updated dependencies [54718c039]\n  - @graphql-codegen/visitor-plugin-common@2.7.3\n\n## 2.4.6\n\n### Patch Changes\n\n- Updated dependencies [11d05e361]\n  - @graphql-codegen/visitor-plugin-common@2.7.2\n\n## 2.4.5\n\n### Patch Changes\n\n- Updated dependencies [fd55e2039]\n  - @graphql-codegen/visitor-plugin-common@2.7.1\n\n## 2.4.4\n\n### Patch Changes\n\n- Updated dependencies [1479233df]\n  - @graphql-codegen/visitor-plugin-common@2.7.0\n\n## 2.4.3\n\n### Patch Changes\n\n- Updated dependencies [c8ef37ae0]\n- Updated dependencies [754a33715]\n- Updated dependencies [bef4376d5]\n- Updated dependencies [be7cb3a82]\n  - @graphql-codegen/visitor-plugin-common@2.6.0\n  - @graphql-codegen/plugin-helpers@2.4.0\n\n## 2.4.2\n\n### Patch Changes\n\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/schema-ast@2.4.1\n  - @graphql-codegen/visitor-plugin-common@2.5.2\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 2.4.1\n\n### Patch Changes\n\n- Updated dependencies [a9f1f1594]\n- Updated dependencies [9ea6621ec]\n  - @graphql-codegen/visitor-plugin-common@2.5.1\n\n## 2.4.0\n\n### Minor Changes\n\n- 4c5c84c1b: Added InputMaybe, a different type of Maybe type for input/arguments\n\n## 2.3.1\n\n### Patch Changes\n\n- 6c898efe5: list all dependencies used by the package in the package.json\n- Updated dependencies [f3833243d]\n- Updated dependencies [6c898efe5]\n  - @graphql-codegen/schema-ast@2.4.0\n\n## 2.3.0\n\n### Minor Changes\n\n- 97ddb487a: feat: GraphQL v16 compatibility\n\n### Patch Changes\n\n- Updated dependencies [97ddb487a]\n  - @graphql-codegen/visitor-plugin-common@2.5.0\n  - @graphql-codegen/plugin-helpers@2.3.0\n\n## 2.2.4\n\n### Patch Changes\n\n- Updated dependencies [ad02cb9b8]\n  - @graphql-codegen/visitor-plugin-common@2.4.0\n\n## 2.2.3\n\n### Patch Changes\n\n- Updated dependencies [b9e85adae]\n- Updated dependencies [7c60e5acc]\n- Updated dependencies [3c2c847be]\n  - @graphql-codegen/visitor-plugin-common@2.3.0\n  - @graphql-codegen/plugin-helpers@2.2.0\n\n## 2.2.2\n\n### Patch Changes\n\n- Updated dependencies [0b090e31a]\n  - @graphql-codegen/visitor-plugin-common@2.2.1\n\n## 2.2.1\n\n### Patch Changes\n\n- cfa0a8f80: Apply missing namingConvention when numericEnums is used\n\n## 2.2.0\n\n### Minor Changes\n\n- d6c2d4c09: Allow declaring Argument and InputType field mappings based on directive annotations.\n\n  **WARNING:** Using this option does only change the type definitions.\n\n  For actually ensuring that a type is correct at runtime you will have to use schema transforms (e.g. with [@graphql-tools/utils mapSchema](https://www.graphql-tools.com/docs/schema-directives)) that apply those rules! Otherwise, you might end up with a runtime type mismatch which could cause unnoticed bugs or runtime errors.\n\n  Please use this configuration option with care!\n\n  ```yaml\n  plugins:\n    config:\n      directiveArgumentAndInputFieldMappings:\n        asNumber: number\n  ```\n\n  ```graphql\n  directive @asNumber on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION\n\n  input MyInput {\n    id: ID! @asNumber\n  }\n\n  type User {\n    id: ID!\n  }\n\n  type Query {\n    user(id: ID! @asNumber): User\n  }\n  ```\n\n  Usage e.g. with `typescript-resolvers`\n\n  ```ts\n  const Query: QueryResolvers = {\n    user(_, args) {\n      // args.id is of type 'number'\n    }\n  }\n  ```\n\n- 8261e4161: Make futureProofEnums option work for all enum output types, (it worked only with enumsAsTypes)\n\n### Patch Changes\n\n- Updated dependencies [d6c2d4c09]\n- Updated dependencies [feeae1c66]\n- Updated dependencies [5086791ac]\n  - @graphql-codegen/visitor-plugin-common@2.2.0\n\n## 2.1.2\n\n### Patch Changes\n\n- Updated dependencies [6470e6cc9]\n- Updated dependencies [263570e50]\n- Updated dependencies [35199dedf]\n  - @graphql-codegen/visitor-plugin-common@2.1.2\n  - @graphql-codegen/plugin-helpers@2.1.1\n\n## 2.1.1\n\n### Patch Changes\n\n- Updated dependencies [aabeff181]\n  - @graphql-codegen/visitor-plugin-common@2.1.1\n\n## 2.1.0\n\n### Minor Changes\n\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- Updated dependencies [290170262]\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/visitor-plugin-common@2.1.0\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 2.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- Updated dependencies [d80efdec4]\n- Updated dependencies [d80efdec4]\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/visitor-plugin-common@2.0.0\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 1.23.0\n\n### Minor Changes\n\n- 9005cc17: add `allowEnumStringTypes` option for allowing string literals as valid return types from resolvers in addition to enum values.\\_\n\n### Patch Changes\n\n- Updated dependencies [df19a4ed]\n- Updated dependencies [470336a1]\n- Updated dependencies [9005cc17]\n  - @graphql-codegen/visitor-plugin-common@1.22.0\n  - @graphql-codegen/plugin-helpers@1.18.8\n\n## 1.22.4\n\n### Patch Changes\n\n- Updated dependencies [6762aff5]\n  - @graphql-codegen/visitor-plugin-common@1.21.3\n\n## 1.22.3\n\n### Patch Changes\n\n- Updated dependencies [6aaecf1c]\n  - @graphql-codegen/visitor-plugin-common@1.21.2\n\n## 1.22.2\n\n### Patch Changes\n\n- Updated dependencies [cf1e5abc]\n  - @graphql-codegen/visitor-plugin-common@1.21.1\n\n## 1.22.1\n\n### Patch Changes\n\n- Updated dependencies [dfd25caf]\n- Updated dependencies [8da7dff6]\n  - @graphql-codegen/visitor-plugin-common@1.21.0\n  - @graphql-codegen/plugin-helpers@1.18.7\n\n## 1.22.0\n\n### Minor Changes\n\n- f0b5ea53: Add entireFieldWrapperValue configuration option, to wrap arrays\n- 097bea2f: Added new configuration settings for scalars: `strictScalars` and `defaultScalarType`\n\n### Patch Changes\n\n- d9212aa0: fix(visitor-plugin-common): guard for a runtime type error\n- Updated dependencies [d9212aa0]\n- Updated dependencies [f0b5ea53]\n- Updated dependencies [097bea2f]\n  - @graphql-codegen/visitor-plugin-common@1.20.0\n  - @graphql-codegen/plugin-helpers@1.18.5\n\n## 1.21.1\n\n### Patch Changes\n\n- e947f8e3: Allow to have declarationKind of type: class, interface: interface\n- 29b75b1e: enhance(namingConvention): use change-case-all instead of individual packages for naming convention\n- Updated dependencies [e947f8e3]\n- Updated dependencies [29b75b1e]\n- Updated dependencies [d4942d04]\n- Updated dependencies [1f6f3db6]\n- Updated dependencies [29b75b1e]\n  - @graphql-codegen/visitor-plugin-common@1.19.0\n  - @graphql-codegen/plugin-helpers@1.18.3\n\n## 1.21.0\n\n### Minor Changes\n\n- 34b8087e: Adds futureProofUnion option to account for a possible unknown new type added to union types\n\n### Patch Changes\n\n- Updated dependencies [5749cb8a]\n- Updated dependencies [5a12fe58]\n  - @graphql-codegen/visitor-plugin-common@1.18.3\n\n## 1.20.2\n\n### Patch Changes\n\n- ca66569f: Fix issues with undefined calls for str.replace\n- Updated dependencies [ca66569f]\n  - @graphql-codegen/visitor-plugin-common@1.18.2\n\n## 1.20.1\n\n### Patch Changes\n\n- 4444348d: Correctly escape enum values defined in the GraphQLSchema object\n- Updated dependencies [63be0f40]\n- Updated dependencies [190482a1]\n- Updated dependencies [4444348d]\n- Updated dependencies [142b32b3]\n- Updated dependencies [42213fa0]\n  - @graphql-codegen/visitor-plugin-common@1.18.1\n\n## 1.20.0\n\n### Minor Changes\n\n- d95db95b: feat(typescript): bump visitor-plugin-common\n\n## 1.19.0\n\n### Minor Changes\n\n- 1d6a593f: Added `useImplementingTypes` flag for generating code that uses implementing types instead of interfaces\n\n### Patch Changes\n\n- Updated dependencies [8356f8a2]\n  - @graphql-codegen/visitor-plugin-common@1.17.21\n\n## 1.18.1\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/visitor-plugin-common@1.17.20\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 1.18.0\n\n### Minor Changes\n\n- 49242c20: Added a \"defaultValue\" option in the \"avoidOptionals\" config\n  See https://github.com/dotansimha/graphql-code-generator/issues/5112\n\n### Patch Changes\n\n- Updated dependencies [99819bf1]\n- Updated dependencies [c3b59e81]\n  - @graphql-codegen/visitor-plugin-common@1.17.19\n\n## 1.17.11\n\n### Patch Changes\n\n- 077cf064: Fixed reading of enumValues config values\n- 92d8f876: Fixed unquoted numeric enum identifiers\n- Updated dependencies [92d8f876]\n  - @graphql-codegen/visitor-plugin-common@1.17.16\n\n## 1.17.10\n\n### Patch Changes\n\n- 7ad7a1ae: Make non nullable input field with default value optional\n- Updated dependencies [d2cde3d5]\n- Updated dependencies [89a6aa80]\n- Updated dependencies [f603b8f8]\n- Updated dependencies [da8bdd17]\n  - @graphql-codegen/visitor-plugin-common@1.17.15\n  - @graphql-codegen/plugin-helpers@1.17.9\n\n## 1.17.9\n\n### Patch Changes\n\n- 07f9b1b2: Fix a bug caused numeric enum values defined in the GraphQLSchema to be printed incorrectly\n- Updated dependencies [07f9b1b2]\n- Updated dependencies [35f67120]\n  - @graphql-codegen/visitor-plugin-common@1.17.14\n\n## 1.17.8\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n- Updated dependencies [1d7c6432]\n- Updated dependencies [1d7c6432]\n  - @graphql-codegen/visitor-plugin-common@1.17.13\n  - @graphql-codegen/plugin-helpers@1.17.8\n"
  },
  {
    "path": "packages/plugins/typescript/typescript/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/typescript\",\n  \"version\": \"5.0.9\",\n  \"description\": \"GraphQL Code Generator plugin for generating TypeScript types\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/plugins/typescript/typescript\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"^6.1.1\",\n    \"@graphql-codegen/schema-ast\": \"^5.0.1\",\n    \"@graphql-codegen/visitor-plugin-common\": \"^6.2.4\",\n    \"auto-bind\": \"~4.0.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/typescript/src/config.ts",
    "content": "import { AvoidOptionalsConfig, RawTypesConfig } from '@graphql-codegen/visitor-plugin-common';\n\n/**\n * @description This plugin generates the base TypeScript types, based on your GraphQL schema.\n *\n * The types generated by this plugin are simple, and refers to the exact structure of your schema, and it's used as the base types for other plugins (such as `typescript-operations` / `typescript-resolvers`)\n */\nexport interface TypeScriptPluginConfig extends RawTypesConfig {\n  /**\n   * @description This will cause the generator to avoid using TypeScript optionals (`?`) on types,\n   * so the following definition: `type A { myField: String }` will output `myField: Maybe<string>`\n   * instead of `myField?: Maybe<string>`.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ## Override all definition types\n   *\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         avoidOptionals: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   *\n   * ## Override only specific definition types\n   *\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         avoidOptionals: {\n   *           field: true\n   *           inputValue: true\n   *           object: true\n   *           defaultValue: true\n   *         }\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  avoidOptionals?: boolean | AvoidOptionalsConfig;\n  /**\n   * @description Will prefix every generated `enum` with `const`, you can read more about const enums here: https://www.typescriptlang.org/docs/handbook/enums.html.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         constEnums: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  constEnums?: boolean;\n  /**\n   * @description Generates enum as TypeScript string union `type` instead of an `enum`. Useful if you wish to generate `.d.ts` declaration file instead of `.ts`, or if you want to avoid using TypeScript enums due to bundle size concerns\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         enumsAsTypes: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  enumsAsTypes?: boolean;\n  /**\n   * @description Controls whether to preserve typescript enum values as numbers\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         numericEnums: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  numericEnums?: boolean;\n  /**\n   * @description This option controls whether or not a catch-all entry is added to enum type definitions for values that may be added in the future.\n   * This is useful if you are using `relay`.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         enumsAsTypes: true,\n   *         futureProofEnums: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  futureProofEnums?: boolean;\n  /**\n   * @description This option controls whether or not a catch-all entry is added to union type definitions for values that may be added in the future.\n   * This is useful if you are using `relay`.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         futureProofUnions: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  futureProofUnions?: boolean;\n  /**\n   * @description Generates enum as TypeScript `const assertions` instead of `enum`. This can even be used to enable enum-like patterns in plain JavaScript code if you choose not to use TypeScript’s enum construct.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         enumsAsConst: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  enumsAsConst?: boolean;\n  /**\n   * @description This will cause the generator to emit types for enums only.\n   * @default false\n   *\n   * @exampleMarkdown\n   * Override all definition types\n   *\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         onlyEnums: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  onlyEnums?: boolean;\n  /**\n   * @description This will cause the generator to emit types for operations only (basically only enums and scalars).\n   * Interacts well with `preResolveTypes: true`\n   * @default false\n   *\n   * @exampleMarkdown\n   * Override all definition types\n   *\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         onlyOperationTypes: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  onlyOperationTypes?: boolean;\n  /**\n   * @description Generates immutable types by adding `readonly` to properties and uses `ReadonlyArray`.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         immutableTypes: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  immutableTypes?: boolean;\n  /**\n   * @description Allow to override the type value of `Maybe`.\n   * @default T | null\n   *\n   * @exampleMarkdown\n   * ## Allow undefined\n   *\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         maybeValue: 'T | null | undefined'\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   *\n   * ## Allow `null` in resolvers:\n   *\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript', 'typescript-resolvers'],\n   *       config: {\n   *         maybeValue: 'T extends PromiseLike<infer U> ? Promise<U | null> : T | null'\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  maybeValue?: string;\n  /**\n   * @description Allow to override the type value of `Maybe` for input types and arguments.\n   * This is useful in case you want to differentiate between the wrapper of input and output types.\n   * By default, this type just refers to `Maybe` type, but you can override its definition.\n   *\n   * @default Maybe<T>\n   *\n   * @exampleMarkdown\n   * ## Allow undefined\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         inputMaybeValue: 'T | null | undefined'\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   *\n   * ## Allow `null` in resolvers:\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         inputMaybeValue: 'T extends PromiseLike<infer U> ? Promise<U | null> : T | null'\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  inputMaybeValue?: string;\n  /**\n   * @description Set to `true` in order to generate output without `export` modifier.\n   * This is useful if you are generating `.d.ts` file and want it to be globally available.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ## Disable all export from a file\n   *\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         noExport: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  noExport?: boolean;\n  /**\n   * @description Set the value to `true` in order to disable all description generation.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ## Disable description generation\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         disableDescriptions: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  disableDescriptions?: boolean;\n  /**\n   * @description When a GraphQL interface is used for a field, this flag will use the implementing types, instead of the interface itself.\n   * @default false\n   *\n   * @exampleMarkdown\n   * ## Override all definition types\n   *\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         useImplementingTypes: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  useImplementingTypes?: boolean;\n  /**\n   * @name wrapEntireFieldDefinitions\n   * @type boolean\n   * @description Set to `true` in order to wrap field definitions with `EntireFieldWrapper`.\n   * This is useful to allow return types such as Promises and functions for fields.\n   * Differs from `wrapFieldDefinitions` in that this wraps the entire field definition if i.e. the field is an Array, while\n   * `wrapFieldDefinitions` will wrap every single value inside the array.\n   * @default false\n   *\n   * @example Enable wrapping entire fields\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         wrapEntireFieldDefinitions: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  wrapEntireFieldDefinitions?: boolean;\n  /**\n   * @name entireFieldWrapperValue\n   * @type string\n   * @description Allow to override the type value of `EntireFieldWrapper`. This wrapper applies outside of Array and Maybe\n   * unlike `fieldWrapperValue`, that will wrap the inner type.\n   * @default T | Promise<T> | (() => T | Promise<T>)\n   *\n   * @example Only allow values\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         entireFieldWrapperValue: 'T'\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  entireFieldWrapperValue?: string;\n  /**\n   * @description Allow using enum string values directly.\n   *\n   * @exampleMarkdown\n   * ```ts filename=\"codegen.ts\"\n   * import type { CodegenConfig } from '@graphql-codegen/cli'\n   *\n   * const config: CodegenConfig = {\n   *   // ...\n   *   generates: {\n   *     'path/to/file.ts': {\n   *       plugins: ['typescript'],\n   *       config: {\n   *         allowEnumStringTypes: true\n   *       }\n   *     }\n   *   }\n   * }\n   * export default config\n   * ```\n   */\n  allowEnumStringTypes?: boolean;\n}\n"
  },
  {
    "path": "packages/plugins/typescript/typescript/src/index.ts",
    "content": "import { oldVisit, PluginFunction, Types } from '@graphql-codegen/plugin-helpers';\nimport { transformSchemaAST } from '@graphql-codegen/schema-ast';\nimport {\n  DocumentNode,\n  getNamedType,\n  GraphQLNamedType,\n  GraphQLSchema,\n  isIntrospectionType,\n  isObjectType,\n  parse,\n  printIntrospectionSchema,\n  TypeInfo,\n  visit,\n  visitWithTypeInfo,\n} from 'graphql';\nimport { TypeScriptPluginConfig } from './config.js';\nimport { TsIntrospectionVisitor } from './introspection-visitor.js';\nimport { TsVisitor } from './visitor.js';\n\nexport * from './config.js';\nexport * from './introspection-visitor.js';\nexport * from './typescript-variables-to-object.js';\nexport * from './visitor.js';\n\nexport const plugin: PluginFunction<TypeScriptPluginConfig, Types.ComplexPluginOutput> = (\n  schema: GraphQLSchema,\n  documents: Types.DocumentFile[],\n  config: TypeScriptPluginConfig\n) => {\n  const { schema: _schema, ast } = transformSchemaAST(schema, config);\n\n  const visitor = new TsVisitor(_schema, config);\n\n  const visitorResult = oldVisit(ast, { leave: visitor });\n  const introspectionDefinitions = includeIntrospectionTypesDefinitions(_schema, documents, config);\n  const scalars = visitor.scalarsDefinition;\n  const directiveArgumentAndInputFieldMappings = visitor.directiveArgumentAndInputFieldMappingsDefinition;\n\n  return {\n    prepend: [\n      ...visitor.getEnumsImports(),\n      ...visitor.getDirectiveArgumentAndInputFieldMappingsImports(),\n      ...visitor.getScalarsImports(),\n      ...visitor.getWrapperDefinitions(),\n    ].filter(Boolean),\n    content: [\n      scalars,\n      directiveArgumentAndInputFieldMappings,\n      ...visitorResult.definitions,\n      ...introspectionDefinitions,\n    ]\n      .filter(Boolean)\n      .join('\\n'),\n  };\n};\n\nexport function includeIntrospectionTypesDefinitions(\n  schema: GraphQLSchema,\n  documents: Types.DocumentFile[],\n  config: TypeScriptPluginConfig\n): string[] {\n  const typeInfo = new TypeInfo(schema);\n  const usedTypes: GraphQLNamedType[] = [];\n  const documentsVisitor = visitWithTypeInfo(typeInfo, {\n    Field() {\n      const type = getNamedType(typeInfo.getType());\n\n      if (type && isIntrospectionType(type) && !usedTypes.includes(type)) {\n        usedTypes.push(type);\n      }\n    },\n  });\n\n  for (const doc of documents) {\n    visit(doc.document, documentsVisitor);\n  }\n\n  const typesToInclude: GraphQLNamedType[] = [];\n\n  for (const type of usedTypes) {\n    collectTypes(type);\n  }\n\n  const visitor = new TsIntrospectionVisitor(schema, config, typesToInclude);\n  const result: DocumentNode = oldVisit(parse(printIntrospectionSchema(schema)), { leave: visitor });\n\n  // recursively go through each `usedTypes` and their children and collect all used types\n  // we don't care about Interfaces, Unions and others, but Objects and Enums\n  function collectTypes(type: GraphQLNamedType): void {\n    if (typesToInclude.includes(type)) {\n      return;\n    }\n\n    typesToInclude.push(type);\n\n    if (isObjectType(type)) {\n      const fields = type.getFields();\n\n      for (const key of Object.keys(fields)) {\n        const field = fields[key];\n        const type = getNamedType(field.type);\n        collectTypes(type);\n      }\n    }\n  }\n\n  return result.definitions as any[];\n}\n"
  },
  {
    "path": "packages/plugins/typescript/typescript/src/introspection-visitor.ts",
    "content": "import autoBind from 'auto-bind';\nimport { EnumTypeDefinitionNode, GraphQLNamedType, GraphQLSchema, ObjectTypeDefinitionNode } from 'graphql';\nimport { TypeScriptPluginConfig } from './config.js';\nimport { TsVisitor } from './visitor.js';\n\nexport class TsIntrospectionVisitor extends TsVisitor {\n  private typesToInclude: GraphQLNamedType[] = [];\n\n  constructor(schema: GraphQLSchema, pluginConfig: TypeScriptPluginConfig = {}, typesToInclude: GraphQLNamedType[]) {\n    super(schema, pluginConfig);\n\n    this.typesToInclude = typesToInclude;\n    autoBind(this);\n  }\n\n  DirectiveDefinition() {\n    return null;\n  }\n\n  ObjectTypeDefinition(node: ObjectTypeDefinitionNode, key: string | number, parent: any) {\n    const name: string = node.name.value;\n\n    if (this.typesToInclude.some(type => type.name === name)) {\n      return super.ObjectTypeDefinition(node, key, parent);\n    }\n\n    return null;\n  }\n\n  EnumTypeDefinition(node: EnumTypeDefinitionNode): string {\n    const name: string = node.name.value;\n\n    if (this.typesToInclude.some(type => type.name === name)) {\n      return super.EnumTypeDefinition(node);\n    }\n\n    return null;\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/typescript/src/typescript-variables-to-object.ts",
    "content": "import {\n  ConvertNameFn,\n  NormalizedAvoidOptionalsConfig,\n  NormalizedScalarsMap,\n  OperationVariablesToObject,\n  ParsedDirectiveArgumentAndInputFieldMappings,\n  ParsedEnumValuesMap,\n} from '@graphql-codegen/visitor-plugin-common';\nimport { Kind, TypeNode } from 'graphql';\n\nexport class TypeScriptOperationVariablesToObject extends OperationVariablesToObject {\n  constructor(\n    _scalars: NormalizedScalarsMap,\n    _convertName: ConvertNameFn,\n    private _avoidOptionals: NormalizedAvoidOptionalsConfig,\n    private _immutableTypes: boolean,\n    _namespacedImportName: string | null = null,\n    _enumNames: string[] = [],\n    _enumPrefix = true,\n    _enumSuffix = true,\n    _enumValues: ParsedEnumValuesMap = {},\n    _applyCoercion: boolean = false,\n    _directiveArgumentAndInputFieldMappings: ParsedDirectiveArgumentAndInputFieldMappings = {},\n    private _maybeType = 'Maybe'\n  ) {\n    super(\n      _scalars,\n      _convertName,\n      _namespacedImportName,\n      _enumNames,\n      _enumPrefix,\n      _enumSuffix,\n      _enumValues,\n      _applyCoercion,\n      _directiveArgumentAndInputFieldMappings\n    );\n  }\n\n  private clearOptional(str: string): string {\n    const prefix = this._namespacedImportName ? `${this._namespacedImportName}.` : '';\n    const rgx = new RegExp(`^${this.wrapMaybe(`(.*?)`)}$`, 'i');\n\n    if (str.startsWith(`${prefix}${this._maybeType}`)) {\n      return str.replace(rgx, '$1');\n    }\n\n    return str;\n  }\n\n  public wrapAstTypeWithModifiers(baseType: string, typeNode: TypeNode, applyCoercion = false): string {\n    if (typeNode.kind === Kind.NON_NULL_TYPE) {\n      const type = this.wrapAstTypeWithModifiers(baseType, typeNode.type, applyCoercion);\n\n      return this.clearOptional(type);\n    }\n    if (typeNode.kind === Kind.LIST_TYPE) {\n      const innerType = this.wrapAstTypeWithModifiers(baseType, typeNode.type, applyCoercion);\n      const listInputCoercionExtension = applyCoercion ? ` | ${innerType}` : '';\n\n      return this.wrapMaybe(\n        `${this._immutableTypes ? 'ReadonlyArray' : 'Array'}<${innerType}>${listInputCoercionExtension}`\n      );\n    }\n    return this.wrapMaybe(baseType);\n  }\n\n  protected formatFieldString(fieldName: string, isNonNullType: boolean, hasDefaultValue: boolean): string {\n    return `${fieldName}${this.getAvoidOption(isNonNullType, hasDefaultValue) ? '?' : ''}`;\n  }\n\n  protected formatTypeString(fieldType: string, isNonNullType: boolean, hasDefaultValue: boolean): string {\n    if (!hasDefaultValue && isNonNullType) {\n      return this.clearOptional(fieldType);\n    }\n\n    return fieldType;\n  }\n\n  protected wrapMaybe(type?: string) {\n    const prefix = this._namespacedImportName ? `${this._namespacedImportName}.` : '';\n    return `${prefix}${this._maybeType}${type ? `<${type}>` : ''}`;\n  }\n\n  protected getAvoidOption(isNonNullType: boolean, hasDefaultValue: boolean) {\n    const options = this._avoidOptionals;\n    return ((options.object || !options.defaultValue) && hasDefaultValue) || (!options.object && !isNonNullType);\n  }\n\n  protected getPunctuation(): string {\n    return ';';\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/typescript/src/visitor.ts",
    "content": "import {\n  BaseTypesVisitor,\n  DeclarationBlock,\n  DeclarationKind,\n  getConfigValue,\n  indent,\n  isOneOfInputObjectType,\n  normalizeAvoidOptionals,\n  NormalizedAvoidOptionalsConfig,\n  ParsedTypesConfig,\n  transformComment,\n  wrapWithSingleQuotes,\n} from '@graphql-codegen/visitor-plugin-common';\nimport autoBind from 'auto-bind';\nimport {\n  EnumTypeDefinitionNode,\n  FieldDefinitionNode,\n  GraphQLObjectType,\n  GraphQLSchema,\n  InputValueDefinitionNode,\n  isEnumType,\n  Kind,\n  ListTypeNode,\n  NamedTypeNode,\n  NonNullTypeNode,\n  TypeDefinitionNode,\n  UnionTypeDefinitionNode,\n} from 'graphql';\nimport { TypeScriptPluginConfig } from './config.js';\nimport { TypeScriptOperationVariablesToObject } from './typescript-variables-to-object.js';\n\nexport interface TypeScriptPluginParsedConfig extends ParsedTypesConfig {\n  avoidOptionals: NormalizedAvoidOptionalsConfig;\n  constEnums: boolean;\n  enumsAsTypes: boolean;\n  futureProofEnums: boolean;\n  futureProofUnions: boolean;\n  enumsAsConst: boolean;\n  numericEnums: boolean;\n  onlyEnums: boolean;\n  onlyOperationTypes: boolean;\n  immutableTypes: boolean;\n  maybeValue: string;\n  inputMaybeValue: string;\n  noExport: boolean;\n  useImplementingTypes: boolean;\n}\n\nexport const EXACT_SIGNATURE = `type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };`;\nexport const MAKE_OPTIONAL_SIGNATURE = `type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };`;\nexport const MAKE_MAYBE_SIGNATURE = `type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };`;\nexport const MAKE_EMPTY_SIGNATURE = `type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };`;\nexport const MAKE_INCREMENTAL_SIGNATURE = `type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };`;\n\nexport class TsVisitor<\n  TRawConfig extends TypeScriptPluginConfig = TypeScriptPluginConfig,\n  TParsedConfig extends TypeScriptPluginParsedConfig = TypeScriptPluginParsedConfig\n> extends BaseTypesVisitor<TRawConfig, TParsedConfig> {\n  constructor(schema: GraphQLSchema, pluginConfig: TRawConfig, additionalConfig: Partial<TParsedConfig> = {}) {\n    super(schema, pluginConfig, {\n      noExport: getConfigValue(pluginConfig.noExport, false),\n      avoidOptionals: normalizeAvoidOptionals(getConfigValue(pluginConfig.avoidOptionals, false)),\n      maybeValue: getConfigValue(pluginConfig.maybeValue, 'T | null'),\n      inputMaybeValue: getConfigValue(\n        pluginConfig.inputMaybeValue,\n        getConfigValue(pluginConfig.maybeValue, 'Maybe<T>')\n      ),\n      constEnums: getConfigValue(pluginConfig.constEnums, false),\n      enumsAsTypes: getConfigValue(pluginConfig.enumsAsTypes, false),\n      futureProofEnums: getConfigValue(pluginConfig.futureProofEnums, false),\n      futureProofUnions: getConfigValue(pluginConfig.futureProofUnions, false),\n      enumsAsConst: getConfigValue(pluginConfig.enumsAsConst, false),\n      numericEnums: getConfigValue(pluginConfig.numericEnums, false),\n      onlyEnums: getConfigValue(pluginConfig.onlyEnums, false),\n      onlyOperationTypes: getConfigValue(pluginConfig.onlyOperationTypes, false),\n      immutableTypes: getConfigValue(pluginConfig.immutableTypes, false),\n      useImplementingTypes: getConfigValue(pluginConfig.useImplementingTypes, false),\n      entireFieldWrapperValue: getConfigValue(pluginConfig.entireFieldWrapperValue, 'T'),\n      wrapEntireDefinitions: getConfigValue(pluginConfig.wrapEntireFieldDefinitions, false),\n      ...additionalConfig,\n    } as TParsedConfig);\n\n    autoBind(this);\n    const enumNames = Object.values(schema.getTypeMap())\n      .filter(isEnumType)\n      .map(type => type.name);\n    this.setArgumentsTransformer(\n      new TypeScriptOperationVariablesToObject(\n        this.scalars,\n        this.convertName,\n        this.config.avoidOptionals,\n        this.config.immutableTypes,\n        null,\n        enumNames,\n        pluginConfig.enumPrefix,\n        pluginConfig.enumSuffix,\n        this.config.enumValues,\n        false,\n        this.config.directiveArgumentAndInputFieldMappings,\n        'InputMaybe'\n      )\n    );\n    this.setDeclarationBlockConfig({\n      enumNameValueSeparator: ' =',\n      ignoreExport: this.config.noExport,\n    });\n  }\n\n  protected _getTypeForNode(node: NamedTypeNode, isVisitingInputType: boolean): string {\n    const typeAsString = node.name.value;\n\n    if (this.config.useImplementingTypes) {\n      const allTypesMap = this._schema.getTypeMap();\n      const implementingTypes: string[] = [];\n\n      // TODO: Move this to a better place, since we are using this logic in some other places as well.\n      for (const graphqlType of Object.values(allTypesMap)) {\n        if (graphqlType instanceof GraphQLObjectType) {\n          const allInterfaces = graphqlType.getInterfaces();\n\n          if (allInterfaces.some(int => typeAsString === int.name)) {\n            implementingTypes.push(this.convertName(graphqlType.name));\n          }\n        }\n      }\n\n      if (implementingTypes.length > 0) {\n        return implementingTypes.join(' | ');\n      }\n    }\n\n    const typeString = super._getTypeForNode(node, isVisitingInputType);\n    const schemaType = this._schema.getType(node.name.value);\n\n    if (isEnumType(schemaType)) {\n      // futureProofEnums + enumsAsTypes combination adds the future value to the enum type itself\n      // so it's not necessary to repeat it in the usage\n      const futureProofEnumUsageEnabled = this.config.futureProofEnums === true && this.config.enumsAsTypes !== true;\n\n      if (futureProofEnumUsageEnabled && this.config.allowEnumStringTypes === true) {\n        return `${typeString} | '%future added value' | ` + '`${' + typeString + '}`';\n      }\n\n      if (futureProofEnumUsageEnabled) {\n        return `${typeString} | '%future added value'`;\n      }\n\n      if (this.config.allowEnumStringTypes === true) {\n        return `${typeString} | ` + '`${' + typeString + '}`';\n      }\n    }\n\n    return typeString;\n  }\n\n  public getWrapperDefinitions(): string[] {\n    if (this.config.onlyEnums) return [];\n\n    const definitions: string[] = [\n      this.getMaybeValue(),\n      this.getInputMaybeValue(),\n      this.getExactDefinition(),\n      this.getMakeOptionalDefinition(),\n      this.getMakeMaybeDefinition(),\n      this.getMakeEmptyDefinition(),\n      this.getIncrementalDefinition(),\n    ];\n\n    if (this.config.wrapFieldDefinitions) {\n      definitions.push(this.getFieldWrapperValue());\n    }\n    if (this.config.wrapEntireDefinitions) {\n      definitions.push(this.getEntireFieldWrapperValue());\n    }\n\n    return definitions;\n  }\n\n  public getExactDefinition(): string {\n    if (this.config.onlyEnums) return '';\n\n    return `${this.getExportPrefix()}${EXACT_SIGNATURE}`;\n  }\n\n  public getMakeOptionalDefinition(): string {\n    return `${this.getExportPrefix()}${MAKE_OPTIONAL_SIGNATURE}`;\n  }\n\n  public getMakeMaybeDefinition(): string {\n    if (this.config.onlyEnums) return '';\n\n    return `${this.getExportPrefix()}${MAKE_MAYBE_SIGNATURE}`;\n  }\n\n  public getMakeEmptyDefinition(): string {\n    return `${this.getExportPrefix()}${MAKE_EMPTY_SIGNATURE}`;\n  }\n\n  public getIncrementalDefinition(): string {\n    return `${this.getExportPrefix()}${MAKE_INCREMENTAL_SIGNATURE}`;\n  }\n\n  public getMaybeValue(): string {\n    return `${this.getExportPrefix()}type Maybe<T> = ${this.config.maybeValue};`;\n  }\n\n  public getInputMaybeValue(): string {\n    return `${this.getExportPrefix()}type InputMaybe<T> = ${this.config.inputMaybeValue};`;\n  }\n\n  protected clearOptional(str: string): string {\n    if (str.startsWith('Maybe')) {\n      return str.replace(/Maybe<(.*?)>$/, '$1');\n    }\n    if (str.startsWith('InputMaybe')) {\n      return str.replace(/InputMaybe<(.*?)>$/, '$1');\n    }\n\n    return str;\n  }\n\n  protected getExportPrefix(): string {\n    if (this.config.noExport) {\n      return '';\n    }\n\n    return super.getExportPrefix();\n  }\n\n  getMaybeWrapper(ancestors): string {\n    const currentVisitContext = this.getVisitorKindContextFromAncestors(ancestors);\n    const isInputContext = currentVisitContext.includes(Kind.INPUT_OBJECT_TYPE_DEFINITION);\n\n    return isInputContext ? 'InputMaybe' : 'Maybe';\n  }\n\n  NamedType(node: NamedTypeNode, key, parent, path, ancestors): string {\n    return `${this.getMaybeWrapper(ancestors)}<${super.NamedType(node, key, parent, path, ancestors)}>`;\n  }\n\n  ListType(node: ListTypeNode, key, parent, path, ancestors): string {\n    return `${this.getMaybeWrapper(ancestors)}<${super.ListType(node, key, parent, path, ancestors)}>`;\n  }\n\n  UnionTypeDefinition(node: UnionTypeDefinitionNode, key: string | number | undefined, parent: any): string {\n    if (this.config.onlyOperationTypes || this.config.onlyEnums) return '';\n\n    let withFutureAddedValue: string[] = [];\n    if (this.config.futureProofUnions) {\n      withFutureAddedValue = [\n        this.config.immutableTypes ? `{ readonly __typename?: \"%other\" }` : `{ __typename?: \"%other\" }`,\n      ];\n    }\n    const originalNode = parent[key] as UnionTypeDefinitionNode;\n    const possibleTypes = originalNode.types\n      .map(t => (this.scalars[t.name.value] ? this._getScalar(t.name.value, 'output') : this.convertName(t)))\n      .concat(...withFutureAddedValue)\n      .join(' | ');\n\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind('type')\n      .withName(this.convertName(node))\n      .withComment(node.description?.value)\n      .withContent(possibleTypes).string;\n    // return super.UnionTypeDefinition(node, key, parent).concat(withFutureAddedValue).join(\"\");\n  }\n\n  protected wrapWithListType(str: string): string {\n    return `${this.config.immutableTypes ? 'ReadonlyArray' : 'Array'}<${str}>`;\n  }\n\n  NonNullType(node: NonNullTypeNode): string {\n    const baseValue = super.NonNullType(node);\n\n    return this.clearOptional(baseValue);\n  }\n\n  FieldDefinition(node: FieldDefinitionNode, key?: number | string, parent?: any): string {\n    const typeString = this.config.wrapEntireDefinitions\n      ? `EntireFieldWrapper<${node.type}>`\n      : (node.type as any as string);\n    const originalFieldNode = parent[key] as FieldDefinitionNode;\n    const addOptionalSign = !this.config.avoidOptionals.field && originalFieldNode.type.kind !== Kind.NON_NULL_TYPE;\n    const comment = this.getNodeComment(node);\n    const { type } = this.config.declarationKind;\n\n    return (\n      comment +\n      indent(\n        `${this.config.immutableTypes ? 'readonly ' : ''}${node.name.value}${\n          addOptionalSign ? '?' : ''\n        }: ${typeString}${this.getPunctuation(type)}`\n      )\n    );\n  }\n\n  InputValueDefinition(\n    node: InputValueDefinitionNode,\n    key?: number | string,\n    parent?: any,\n    _path?: Array<string | number>,\n    ancestors?: Array<TypeDefinitionNode>\n  ): string {\n    const originalFieldNode = parent[key] as FieldDefinitionNode;\n\n    const addOptionalSign =\n      !this.config.avoidOptionals.inputValue &&\n      (originalFieldNode.type.kind !== Kind.NON_NULL_TYPE ||\n        (!this.config.avoidOptionals.defaultValue && node.defaultValue !== undefined));\n    const comment = this.getNodeComment(node);\n    const declarationKind = this.config.declarationKind.type;\n\n    let type: string = node.type as any as string;\n    if (node.directives && this.config.directiveArgumentAndInputFieldMappings) {\n      type = this._getDirectiveOverrideType(node.directives) || type;\n    }\n\n    const readonlyPrefix = this.config.immutableTypes ? 'readonly ' : '';\n\n    const buildFieldDefinition = (isOneOf = false) => {\n      return `${readonlyPrefix}${node.name.value}${addOptionalSign && !isOneOf ? '?' : ''}: ${\n        isOneOf ? this.clearOptional(type) : type\n      }${this.getPunctuation(declarationKind)}`;\n    };\n\n    const realParentDef = ancestors?.[ancestors.length - 1];\n    if (realParentDef) {\n      const parentType = this._schema.getType(realParentDef.name.value);\n\n      if (isOneOfInputObjectType(parentType)) {\n        if (originalFieldNode.type.kind === Kind.NON_NULL_TYPE) {\n          throw new Error(\n            'Fields on an input object type can not be non-nullable. It seems like the schema was not validated.'\n          );\n        }\n        const fieldParts: Array<string> = [];\n        for (const fieldName of Object.keys(parentType.getFields())) {\n          if (fieldName === node.name.value) {\n            fieldParts.push(buildFieldDefinition(true));\n            continue;\n          }\n          fieldParts.push(`${readonlyPrefix}${fieldName}?: never;`);\n        }\n        return comment + indent(`{ ${fieldParts.join(' ')} }`);\n      }\n    }\n\n    return comment + indent(buildFieldDefinition());\n  }\n\n  EnumTypeDefinition(node: EnumTypeDefinitionNode): string {\n    const enumName = node.name.value;\n\n    // In case of mapped external enum string\n    if (this.config.enumValues[enumName]?.sourceFile) {\n      return `export { ${this.config.enumValues[enumName].typeIdentifier} };\\n`;\n    }\n\n    const getValueFromConfig = (enumValue: string | number) => {\n      if (typeof this.config.enumValues[enumName]?.mappedValues?.[enumValue] !== 'undefined') {\n        return this.config.enumValues[enumName].mappedValues[enumValue];\n      }\n      return null;\n    };\n\n    const withFutureAddedValue = [\n      this.config.futureProofEnums ? [indent('| ' + wrapWithSingleQuotes('%future added value'))] : [],\n    ];\n\n    const enumTypeName = this.convertName(node, {\n      useTypesPrefix: this.config.enumPrefix,\n      useTypesSuffix: this.config.enumSuffix,\n    });\n\n    if (this.config.enumsAsTypes) {\n      return new DeclarationBlock(this._declarationBlockConfig)\n        .export()\n        .asKind('type')\n        .withComment(node.description?.value)\n        .withName(enumTypeName)\n        .withContent(\n          '\\n' +\n            node.values\n              .map(enumOption => {\n                const name = enumOption.name.value;\n                const enumValue: string | number = getValueFromConfig(name) ?? name;\n                const comment = transformComment(enumOption.description?.value, 1);\n\n                return comment + indent('| ' + wrapWithSingleQuotes(enumValue));\n              })\n              .concat(...withFutureAddedValue)\n              .join('\\n')\n        ).string;\n    }\n\n    if (this.config.numericEnums) {\n      const block = new DeclarationBlock(this._declarationBlockConfig)\n        .export()\n        .withComment(node.description?.value)\n        .withName(enumTypeName)\n        .asKind('enum')\n        .withBlock(\n          node.values\n            .map((enumOption, i) => {\n              const valueFromConfig = getValueFromConfig(enumOption.name.value);\n              const enumValue: string | number = valueFromConfig ?? i;\n              const comment = transformComment(enumOption.description?.value, 1);\n              const optionName = this.makeValidEnumIdentifier(\n                this.convertName(enumOption, {\n                  useTypesPrefix: false,\n                  transformUnderscore: true,\n                })\n              );\n              return comment + indent(optionName) + ` = ${enumValue}`;\n            })\n            .concat(...withFutureAddedValue)\n            .join(',\\n')\n        ).string;\n\n      return block;\n    }\n\n    if (this.config.enumsAsConst) {\n      const typeName = `export type ${enumTypeName} = typeof ${enumTypeName}[keyof typeof ${enumTypeName}];`;\n      const enumAsConst = new DeclarationBlock({\n        ...this._declarationBlockConfig,\n        blockTransformer: block => {\n          return block + ' as const';\n        },\n      })\n        .export()\n        .asKind('const')\n        .withName(enumTypeName)\n        .withComment(node.description?.value)\n        .withBlock(\n          node.values\n            .map(enumOption => {\n              const optionName = this.makeValidEnumIdentifier(\n                this.convertName(enumOption, {\n                  useTypesPrefix: false,\n                  transformUnderscore: true,\n                })\n              );\n              const comment = transformComment(enumOption.description?.value, 1);\n              const name = enumOption.name.value;\n              const enumValue: string | number = getValueFromConfig(name) ?? name;\n\n              return comment + indent(`${optionName}: ${wrapWithSingleQuotes(enumValue)}`);\n            })\n            .join(',\\n')\n        ).string;\n\n      return [enumAsConst, typeName].join('\\n');\n    }\n\n    return new DeclarationBlock(this._declarationBlockConfig)\n      .export()\n      .asKind(this.config.constEnums ? 'const enum' : 'enum')\n      .withName(enumTypeName)\n      .withComment(node.description?.value)\n      .withBlock(this.buildEnumValuesBlock(enumName, node.values)).string;\n  }\n\n  protected getPunctuation(_declarationKind: DeclarationKind): string {\n    return ';';\n  }\n}\n"
  },
  {
    "path": "packages/plugins/typescript/typescript/tests/__snapshots__/typescript.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`TypeScript > should use implementing types as node type - issue #5126 1`] = `\n\"/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string; }\n  String: { input: string; output: string; }\n  Boolean: { input: boolean; output: boolean; }\n  Int: { input: number; output: number; }\n  Float: { input: number; output: number; }\n};\n\nexport type Matrix = {\n  __typename?: 'Matrix';\n  pills: Array<RedPill | GreenPill>;\n};\n\nexport type Pill = {\n  id: Scalars['ID']['output'];\n};\n\nexport type RedPill = Pill & {\n  __typename?: 'RedPill';\n  red: Scalars['String']['output'];\n};\n\nexport type GreenPill = Pill & {\n  __typename?: 'GreenPill';\n  green: Scalars['String']['output'];\n};\n\nexport type Foo = {\n  id: Scalars['ID']['output'];\n};\n\nexport type Bar = Foo & {\n  __typename?: 'Bar';\n  lol: Scalars['String']['output'];\n};\n\nexport type Hello = {\n  __typename?: 'Hello';\n  foo: Bar;\n};\n\nexport type NoInterface = {\n  __typename?: 'NoInterface';\n  hello: Hello;\n};\n\nexport type NestedInterface = {\n  field: Scalars['String']['output'];\n};\n\nexport type NestedType1 = NestedInterface & {\n  __typename?: 'NestedType1';\n  hi: Scalars['String']['output'];\n};\n\nexport type NestedType2 = NestedInterface & {\n  __typename?: 'NestedType2';\n  ho: Scalars['String']['output'];\n};\n\nexport type NestedField = {\n  __typename?: 'NestedField';\n  nested: NestedType1 | NestedType2;\n};\n\"\n`;\n"
  },
  {
    "path": "packages/plugins/typescript/typescript/tests/typescript.spec.ts",
    "content": "import { mergeOutputs, Types } from '@graphql-codegen/plugin-helpers';\nimport { validateTs } from '@graphql-codegen/testing';\nimport { buildSchema, GraphQLEnumType, GraphQLObjectType, GraphQLSchema, parse } from 'graphql';\nimport { plugin } from '../src/index.js';\n\ndescribe('TypeScript', () => {\n  it('should expose Maybe', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      scalar A\n    `);\n    const result = await plugin(schema, [], {}, { outputFile: '' });\n    expect(result.prepend).toBeSimilarStringTo('export type Maybe<T> =');\n  });\n\n  describe('description to comment', () => {\n    it('Should include a description for Scalars type', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"My custom scalar\"\n        scalar A\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n      /** All built-in and custom scalars, mapped to their actual values */\n      export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n          /** My custom scalar */\n          A: { input: any; output: any; }\n        };\n      `);\n    });\n\n    it('Should add description for input types', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"MyInput\"\n        input MyInput {\n          f: String\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.prepend).toBeSimilarStringTo('export type InputMaybe<T> = Maybe<T>;');\n      expect(result.content).toBeSimilarStringTo(`\n        /** MyInput */\n        export type MyInput = {\n          f?: InputMaybe<Scalars['String']['input']>;\n        }`);\n    });\n\n    it('Should add description for input fields', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"MyInput\"\n        input MyInput {\n          \"f is something\"\n          f: String!\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        /** MyInput */\n        export type MyInput = {\n          /** f is something */\n          f: Scalars['String']['input'];\n        }`);\n    });\n\n    it('Should work with multiline comment', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"\"\"\n        MyInput\n        multiline\n        \"\"\"\n        input MyInput {\n          f: String!\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        /**\n         * MyInput\n         * multiline\n         */\n        export type MyInput = {\n          f: Scalars['String']['input'];\n        }`);\n    });\n\n    it('Should work with unions', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"my union\"\n        union A = B | C\n\n        type B {\n          id: ID\n        }\n        type C {\n          id: ID\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        /** my union */\n        export type A = B | C`);\n    });\n\n    it('Should work with types', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"this is b\"\n        type B {\n          id: ID\n        }\n        \"this is c\"\n        type C {\n          id: ID\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        /** this is b */\n        export type B = {\n          __typename?: 'B';\n          id?: Maybe<Scalars['ID']['output']>;\n        }`);\n\n      expect(result.content).toBeSimilarStringTo(`\n        /** this is c */\n        export type C = {\n          __typename?: 'C';\n          id?: Maybe<Scalars['ID']['output']>;\n        }`);\n    });\n\n    it('Should work with type fields', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type B {\n          \"the id\"\n          id: ID\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n      export type B = {\n        __typename?: 'B';\n        /** the id */\n        id?: Maybe<Scalars['ID']['output']>;\n      };`);\n    });\n\n    it('Should work with inteface and inteface fields', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface Node {\n          \"the id\"\n          id: ID!\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n      export type Node = {\n        /** the id */\n        id: Scalars['ID']['output'];\n      };`);\n    });\n\n    it('Should work with enum and enum values', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"custom enum\"\n        enum MyEnum {\n          \"this is a\"\n          A\n          \"this is b\"\n          B\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n      /** custom enum */\n      export enum MyEnum {\n        /** this is a */\n        A = 'A',\n        /** this is b */\n        B = 'B'\n      }`);\n    });\n\n    it('Should remove underscore from enum values', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        enum MyEnum {\n          A_B_C\n          X_Y_Z\n          _TEST\n          My_Value\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n      export enum MyEnum {\n        ABC = 'A_B_C',\n        XYZ = 'X_Y_Z',\n        Test = '_TEST',\n        MyValue = 'My_Value'\n      }`);\n    });\n\n    it('Should leave underscores in enum values when the value is only underscores', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        enum MyEnum {\n          _\n          __\n          _TEST\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n      export enum MyEnum {\n        _ = '_',\n        __ = '__',\n        Test = '_TEST'\n      }`);\n    });\n\n    it('Should work with enum as const', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        enum MyEnum {\n          A_B_C\n          X_Y_Z\n          _TEST\n          My_Value\n          _123\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumsAsConst: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n      export const MyEnum = {\n        ABC: 'A_B_C',\n        XYZ: 'X_Y_Z',\n        Test: '_TEST',\n        MyValue: 'My_Value',\n        '123': '_123'\n      } as const;\n      export type MyEnum = typeof MyEnum[keyof typeof MyEnum];`);\n    });\n\n    it('Should work with enum as const combined with enum values', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        enum MyEnum {\n          A_B_C\n          X_Y_Z\n          _TEST\n          My_Value\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          enumsAsConst: true,\n          enumValues: {\n            MyEnum: {\n              A_B_C: 0,\n              X_Y_Z: 'Foo',\n              _TEST: 'Bar',\n              My_Value: 1,\n            },\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n      export const MyEnum = {\n        ABC: 0,\n        XYZ: 'Foo',\n        Test: 'Bar',\n        MyValue: 1\n      } as const;\n      export type MyEnum = typeof MyEnum[keyof typeof MyEnum];`);\n    });\n\n    it('Should work with enum and enum values (enumsAsTypes)', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"custom enum\"\n        enum MyEnum {\n          \"this is a\"\n          A\n          \"this is b\"\n          B\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumsAsTypes: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n      /** custom enum */\n      export type MyEnum =\n        /** this is a */\n        | 'A'\n        /** this is b */\n        | 'B';`);\n    });\n\n    it('Should work with directives', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"My custom directive\"\n        directive @AsNumber on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION\n      `);\n      const result = await plugin(\n        schema,\n        [],\n        { directiveArgumentAndInputFieldMappings: { AsNumber: 'number' } },\n        { outputFile: '' }\n      );\n\n      expect(result.content).toBeSimilarStringTo(`\n      /** Type overrides using directives */\n      export type DirectiveArgumentAndInputFieldMappings = {\n        /** My custom directive */\n        AsNumber: number;\n      };\n      `);\n    });\n  });\n\n  describe('disable comment generation', () => {\n    it('Should not include a description for Scalars type', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"My custom scalar\"\n        scalar A\n      `);\n      const result = await plugin(schema, [], { disableDescriptions: true }, { outputFile: '' });\n\n      expect(result.content).not.toBeSimilarStringTo(`/** My custom scalar */`);\n      expect(result.content).toBeSimilarStringTo(`\n      export type Scalars = {\n          ID: { input: string; output: string;   }\n          String: { input: string; output: string;   }\n          Boolean: { input: boolean; output: boolean;   }\n          Int: { input: number; output: number;   }\n          Float: { input: number; output: number;   }\n          A: { input: any; output: any;   }\n        };\n      `);\n    });\n\n    it('Should not add description for input types', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"MyInput\"\n        input MyInput {\n          f: String\n        }\n      `);\n      const result = await plugin(schema, [], { disableDescriptions: true }, { outputFile: '' });\n\n      expect(result.content).not.toBeSimilarStringTo('/** MyInput */');\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInput = {\n          f?: InputMaybe<Scalars['String']['input']>;\n        }`);\n    });\n\n    it('Should not add description for input fields', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"MyInput\"\n        input MyInput {\n          \"f is something\"\n          f: String!\n        }\n      `);\n      const result = await plugin(schema, [], { disableDescriptions: true }, { outputFile: '' });\n\n      expect(result.content).not.toBeSimilarStringTo('/** MyInput */');\n      expect(result.content).not.toBeSimilarStringTo('/** f is something */');\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInput = {\n          f: Scalars['String']['input'];\n        }`);\n    });\n\n    it('Should remove multiline comment', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"\"\"\n        MyInput\n        multiline\n        \"\"\"\n        input MyInput {\n          f: String!\n        }\n      `);\n      const result = await plugin(schema, [], { disableDescriptions: true }, { outputFile: '' });\n\n      expect(result.content).not.toBeSimilarStringTo(`\n        /**\n         * MyInput\n         * multiline\n         */\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInput = {\n          f: Scalars['String']['input'];\n        }`);\n    });\n\n    it('Should work with unions', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"my union\"\n        union A = B | C\n\n        type B {\n          id: ID\n        }\n        type C {\n          id: ID\n        }\n      `);\n      const result = await plugin(schema, [], { disableDescriptions: true }, { outputFile: '' });\n\n      expect(result.content).not.toBeSimilarStringTo('/** my union */');\n      expect(result.content).toBeSimilarStringTo(`\n        export type A = B | C`);\n    });\n\n    it('Should work with types', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"this is b\"\n        type B {\n          id: ID\n        }\n        \"this is c\"\n        type C {\n          id: ID\n        }\n      `);\n      const result = await plugin(schema, [], { disableDescriptions: true }, { outputFile: '' });\n\n      expect(result.content).not.toBeSimilarStringTo('/** this is b */');\n      expect(result.content).toBeSimilarStringTo(`\n        export type B = {\n          __typename?: 'B';\n          id?: Maybe<Scalars['ID']['output']>;\n        }`);\n\n      expect(result.content).not.toBeSimilarStringTo('/** this is c */');\n      expect(result.content).toBeSimilarStringTo(`\n        export type C = {\n          __typename?: 'C';\n          id?: Maybe<Scalars['ID']['output']>;\n        }`);\n    });\n\n    it('Should work with type fields', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type B {\n          \"the id\"\n          id: ID\n        }\n      `);\n      const result = await plugin(schema, [], { disableDescriptions: true }, { outputFile: '' });\n\n      expect(result.content).not.toBeSimilarStringTo('/** the id */');\n      expect(result.content).toBeSimilarStringTo(`\n      export type B = {\n        __typename?: 'B';\n        id?: Maybe<Scalars['ID']['output']>;\n      };`);\n    });\n\n    it('Should work with inteface and inteface fields', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface Node {\n          \"the id\"\n          id: ID!\n        }\n      `);\n      const result = await plugin(schema, [], { disableDescriptions: true }, { outputFile: '' });\n\n      expect(result.content).not.toBeSimilarStringTo('/** the id */');\n      expect(result.content).toBeSimilarStringTo(`\n      export type Node = {\n        id: Scalars['ID']['output'];\n      };`);\n    });\n\n    it('Should work with enum and enum values', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"custom enum\"\n        enum MyEnum {\n          \"this is a\"\n          A\n          \"this is b\"\n          B\n        }\n      `);\n      const result = await plugin(schema, [], { disableDescriptions: true }, { outputFile: '' });\n\n      expect(result.content).not.toBeSimilarStringTo('/** custom enum */');\n      expect(result.content).not.toBeSimilarStringTo('/** this is a */');\n      expect(result.content).not.toBeSimilarStringTo('/** this is b */');\n      expect(result.content).toBeSimilarStringTo(`\n      export enum MyEnum {\n        A = 'A',\n        B = 'B'\n      }`);\n    });\n\n    it('Should work with enum and enum values (enumsAsTypes)', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"custom enum\"\n        enum MyEnum {\n          \"this is a\"\n          A\n          \"this is b\"\n          B\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumsAsTypes: true, disableDescriptions: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).not.toBeSimilarStringTo('/** custom enum */');\n      expect(result.content).not.toBeSimilarStringTo('/** this is a */');\n      expect(result.content).not.toBeSimilarStringTo('/** this is b */');\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyEnum =\n        | 'A'\n        | 'B';`);\n    });\n\n    it('Should not work when config is false', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        \"custom enum\"\n        enum MyEnum {\n          \"this is a\"\n          A\n          \"this is b\"\n          B\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumsAsTypes: true, disableDescriptions: false },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n      /** custom enum */\n      export type MyEnum =\n        /** this is a */\n        | 'A'\n        /** this is b */\n        | 'B';`);\n    });\n  });\n\n  describe('Issues', () => {\n    it('#6815 - Generate different type for Maybe wrapper based on input variables', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          test(id: ID): String\n          testWithInput(filter: Filter): String\n        }\n\n        input Filter {\n          a: String\n          b: Int\n        }\n      `);\n\n      const result = (await plugin(\n        testSchema,\n        [],\n        {\n          maybeValue: 'T | null',\n          inputMaybeValue: 'T | null | undefined',\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      const output = mergeOutputs([result]);\n      expect(output).toContain(`export type InputMaybe<T> = T | null | undefined;`);\n      expect(output).toContain(`export type Maybe<T> = T | null;`);\n      expect(output).toContain(`test?: Maybe<Scalars['String']['output']>;`);\n      expect(output).toContain(`id?: InputMaybe<Scalars['ID']['input']>;`);\n      expect(output).toContain(`filter?: InputMaybe<Filter>;`);\n      expect(output).toContain(`a?: InputMaybe<Scalars['String']['input']>;`);\n      expect(output).toContain(`b?: InputMaybe<Scalars['Int']['input']>;`);\n    });\n\n    it('#5643 - Incorrect combinations of declartionKinds leads to syntax error', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Base {\n          id: ID!\n        }\n\n        type MyType implements Base {\n          id: ID!\n        }\n\n        type Query {\n          t: MyType!\n        }\n      `);\n\n      const result = (await plugin(\n        testSchema,\n        [],\n        {\n          declarationKind: {\n            type: 'class',\n            interface: 'interface',\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n      const output = mergeOutputs([result]);\n      expect(output).not.toContain(`export class MyType extends Base {`);\n      expect(output).toContain(`export class MyType implements Base {`);\n    });\n\n    it('#4564 - numeric enum values set on schema level', async () => {\n      const testSchema = new GraphQLSchema({\n        types: [\n          new GraphQLObjectType({\n            name: 'Query',\n            fields: {\n              test: {\n                type: new GraphQLEnumType({\n                  name: 'MyEnum',\n                  values: {\n                    missing: {\n                      value: 0,\n                    },\n                  },\n                }),\n              },\n            },\n          }),\n        ],\n      });\n\n      const result = (await plugin(testSchema, [], {}, { outputFile: '' })) as Types.ComplexPluginOutput;\n      const output = mergeOutputs([result]);\n      expect(output).not.toContain(`Missing = 'missing'`);\n      expect(output).toContain(`Missing = 0`);\n    });\n\n    it('#4564 - numeric enum values set on schema level - complex numeric', async () => {\n      const testSchema = new GraphQLSchema({\n        types: [\n          new GraphQLObjectType({\n            name: 'Query',\n            fields: {\n              test: {\n                type: new GraphQLEnumType({\n                  name: 'MyEnum',\n                  values: {\n                    available: {\n                      value: '01',\n                    },\n                    somethingElse: {\n                      value: '99',\n                    },\n                  },\n                }),\n              },\n            },\n          }),\n        ],\n      });\n\n      const result = (await plugin(testSchema, [], {}, { outputFile: '' })) as Types.ComplexPluginOutput;\n      const output = mergeOutputs([result]);\n      expect(output).toContain(`Available = '01'`);\n      expect(output).toContain(`SomethingElse = '99'`);\n    });\n\n    it('#7898 - falsy enum value set on schema with enumsAsTypes set', async () => {\n      const testSchema = new GraphQLSchema({\n        types: [\n          new GraphQLObjectType({\n            name: 'Query',\n            fields: {\n              test: {\n                type: new GraphQLEnumType({\n                  name: 'MyEnum',\n                  values: {\n                    EnumValueName: {\n                      value: 0,\n                    },\n                  },\n                }),\n              },\n            },\n          }),\n        ],\n      });\n\n      const result = (await plugin(\n        testSchema,\n        [],\n        { enumsAsTypes: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n      const output = mergeOutputs([result]);\n      expect(output).not.toContain('EnumValueName');\n      expect(output).toContain('0');\n    });\n\n    it('#6532 - numeric enum values with namingConvention', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          test: Test!\n        }\n\n        enum Test {\n          Boop\n          BIP\n          BaP\n          TEST_VALUE\n        }\n      `);\n\n      const result = (await plugin(\n        testSchema,\n        [],\n        {\n          numericEnums: true,\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n      const output = mergeOutputs([result]);\n      expect(output).toBeSimilarStringTo(`export enum Test {\n        Boop = 0,\n        Bip = 1,\n        BaP = 2,\n        TestValue = 3\n      }`);\n    });\n\n    it('#3137 - numeric enum value', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Query {\n          test: Test!\n        }\n\n        enum Test {\n          A\n          B\n          C\n        }\n      `);\n\n      const result = (await plugin(\n        testSchema,\n        [],\n        {\n          enumValues: {\n            Test: {\n              A: 0,\n              B: 'test',\n              C: '2',\n            },\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n      const output = mergeOutputs([result]);\n      expect(output).toBeSimilarStringTo(`export enum Test {\n        A = 0,\n        B = 'test',\n        C = '2'\n      }`);\n    });\n\n    it('#4157 - Should generate numeric values for enums if numericEnums is set to true', async () => {\n      const testSchema = buildSchema(/* GraphQl */ `\n        enum Status {\n            Idle\n            Running\n            Error\n        }\n      `);\n\n      const result = (await plugin(\n        testSchema,\n        [],\n        {\n          numericEnums: true,\n        },\n        {\n          outputFile: '',\n        }\n      )) as Types.ComplexPluginOutput;\n      const output = mergeOutputs([result]);\n      validateTs(output);\n\n      expect(output).toBeSimilarStringTo(`\n        export enum Status {\n            Idle = 0,\n            Running = 1,\n            Error = 2\n        }\n      `);\n    });\n\n    it('#2679 - incorrect prefix for enums', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        enum FilterOption {\n          New\n          Active\n          Closed\n        }\n\n        input UpdateFilterOptionInput {\n          newOption: FilterOption!\n        }\n\n        type Query {\n          exampleQuery(i: UpdateFilterOptionInput, t: FilterOption): String\n        }\n      `);\n\n      const result = (await plugin(\n        testSchema,\n        [],\n        {\n          typesPrefix: 'I',\n          enumPrefix: false,\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n      const output = mergeOutputs([result]);\n      validateTs(output);\n\n      expect(output).toBeSimilarStringTo(`\n      export enum FilterOption {\n        New = 'New',\n        Active = 'Active',\n        Closed = 'Closed'\n      }`);\n\n      expect(output).toBeSimilarStringTo(`\n      export type IUpdateFilterOptionInput = {\n        newOption: FilterOption;\n      };`);\n      expect(output).toBeSimilarStringTo(`\n      export type IQueryExampleQueryArgs = {\n        i?: InputMaybe<IUpdateFilterOptionInput>;\n        t?: InputMaybe<FilterOption>;\n      };`);\n    });\n\n    it('#3180 - enumValues and named default import', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        enum MyEnum {\n          A\n          B\n          C\n        }\n\n        type Test {\n          t: MyEnum\n          test(a: MyEnum): String\n        }\n      `);\n      const result = (await plugin(\n        testSchema,\n        [],\n        {\n          typesPrefix: 'I',\n          namingConvention: { enumValues: 'change-case-all#constantCase' },\n          enumValues: {\n            MyEnum: './files#default as MyEnum',\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.prepend[0]).toBe(`import MyEnum from './files';`);\n    });\n\n    it('#4834 - enum members should be quoted if numeric', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        enum MediaItemSizeEnum {\n          AXB\n          _1X2\n          _3X4\n        }\n      `);\n\n      const result = (await plugin(testSchema, [], {})) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`export enum MediaItemSizeEnum {\n        Axb = 'AXB',\n        '1X2' = '_1X2',\n        '3X4' = '_3X4'\n      }`);\n    });\n\n    it('#2976 - Issues with mapped enumValues and type prefix in args', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        enum MyEnum {\n          A\n          B\n          C\n        }\n\n        type Test {\n          t: MyEnum\n          test(a: MyEnum): String\n        }\n      `);\n      const result = (await plugin(\n        testSchema,\n        [],\n        {\n          typesPrefix: 'I',\n          namingConvention: { enumValues: 'change-case-all#constantCase' },\n          enumValues: {\n            MyEnum: './files#MyEnum',\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`export type ITest = {\n        __typename?: 'Test';\n       t?: Maybe<MyEnum>;\n       test?: Maybe<Scalars['String']['output']>;\n     };`);\n\n      expect(result.content).toBeSimilarStringTo(`export type ITestTestArgs = {\n      a?: InputMaybe<MyEnum>;\n    };`);\n    });\n\n    it('#2082 - Issues with enumValues and types prefix', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        enum MyEnum {\n          A\n          B\n          C\n        }\n\n        enum OtherEnum {\n          V\n        }\n\n        type Test {\n          a: MyEnum\n          b: OtherEnum\n        }\n      `);\n      const result = (await plugin(\n        testSchema,\n        [],\n        {\n          typesPrefix: 'GQL_',\n          enumValues: {\n            MyEnum: './files#MyEnum',\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n      expect(result.prepend).toContain(`import { MyEnum } from './files';`);\n      expect(result.content).toContain(`enum GQL_OtherEnum {`);\n      expect(result.content).toContain(`a?: Maybe<MyEnum>;`);\n      expect(result.content).toContain(`b?: Maybe<GQL_OtherEnum>`);\n    });\n\n    it('#1488 - Should generate readonly also in input types when immutableTypes is set', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        input MyInput {\n          f: String!\n        }\n      `);\n\n      const result = (await plugin(\n        schema,\n        [],\n        { immutableTypes: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyInput = {\n        readonly f: Scalars['String']['input'];\n      };`);\n      validateTs(result);\n    });\n\n    it('#3141 - @deprecated directive support', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type User {\n          fullName: String!\n          firstName: String! @deprecated(reason: \"Field \\`fullName\\` has been superseded by \\`firstName\\`.\")\n        }\n      `);\n\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n      expect(result.content).toBeSimilarStringTo(`\n      export type User = {\n        __typename?: 'User';\n        fullName: Scalars['String']['output'];\n        /** @deprecated Field \\`fullName\\` has been superseded by \\`firstName\\`. */\n        firstName: Scalars['String']['output'];\n      };`);\n      validateTs(result);\n    });\n\n    it('#7627 - enum value @deprecated directive support', async () => {\n      const schema = buildSchema(`\n      enum MyEnum {\n        A\n        B @deprecated(reason: \"Enum value \\`B\\` has been deprecated.\")\n      }`);\n\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n      expect(result.content).toBeSimilarStringTo(`\n      export enum MyEnum {\n        A = 'A',\n        /** @deprecated Enum value \\`B\\` has been deprecated. */\n        B = 'B'\n      }`);\n      validateTs(result);\n    });\n\n    it('#7766 - input value @deprecated directive support', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        input MyInput {\n          A: Int\n          B: Int @deprecated(reason: \"input value \\`B\\` has been deprecated.\")\n        }\n      `);\n\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyInput = {\n        A?: InputMaybe<Scalars['Int']['input']>;\n        /** @deprecated input value \\`B\\` has been deprecated. */\n        B?: InputMaybe<Scalars['Int']['input']>;\n      };`);\n      validateTs(result);\n    });\n\n    it('#1462 - Union of scalars and argument of directive', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        union Any = String | Int | Float | ID\n\n        directive @default(value: Any) on ENUM_VALUE | FIELD_DEFINITION\n\n        type CardEdge {\n          count: Int! @default(value: 1)\n        }\n      `);\n\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n      expect(result.content).toBeSimilarStringTo(\n        `export type Any = Scalars['String']['output'] | Scalars['Int']['output'] | Scalars['Float']['output'] | Scalars['ID']['output'];`\n      );\n      expect(result.content).toBeSimilarStringTo(`\n      export type CardEdge = {\n        __typename?: 'CardEdge';\n        count: Scalars['Int']['output'];\n      };`);\n      validateTs(result);\n    });\n\n    it('#1954 - Duplicate type names for args type', async () => {\n      const schema = buildSchema(`\n      type PullRequest {\n        reviewThreads(first: Int!): Int\n      }\n\n      type PullRequestReview {\n          threads(first: Int!, last: Int!): Int\n      }`);\n\n      const result = (await plugin(\n        schema,\n        [],\n        { addUnderscoreToArgsType: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toContain('PullRequest_ReviewThreadsArgs');\n      expect(result.content).toContain('PullRequestReview_ThreadsArgs');\n    });\n    it('#1980 Do not put prefix on enums in args when enumPrefix: false', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        enum SuggestionType {\n          concern\n          goal\n        }\n\n        type Suggestion {\n          id: ID!\n          userId: ID!\n          suggestionType: SuggestionType!\n          text: String!\n        }\n\n        type RootQueryType {\n          suggestionsForUser(userId: ID!, suggestionType: SuggestionType!): [Suggestion!]\n        }\n      `);\n      const result = (await plugin(schema, [], {\n        skipTypename: true,\n        declarationKind: 'interface',\n        typesPrefix: 'I',\n        enumPrefix: false,\n        constEnums: true,\n        scalars: {\n          DateTime: 'string',\n          Time: 'string',\n          Date: 'string',\n        },\n      })) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n          export interface ISuggestion {\n            id: Scalars['ID']['output'];\n            userId: Scalars['ID']['output'];\n            suggestionType: SuggestionType;\n            text: Scalars['String']['output'];\n          }\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n          export const enum SuggestionType {\n            Concern = 'concern',\n            Goal = 'goal'\n          };\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n          export interface IRootQueryType {\n            suggestionsForUser?: Maybe<Array<ISuggestion>>;\n          }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n          export interface IRootQueryTypeSuggestionsForUserArgs {\n            userId: Scalars['ID']['input'];\n            suggestionType: SuggestionType;\n          }\n      `);\n    });\n  });\n\n  describe('Config', () => {\n    it('Should build type correctly when specified with avoidOptionals config', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type MyType {\n          foo: String\n          bar: String!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { avoidOptionals: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          foo: Maybe<Scalars['String']['output']>;\n          bar: Scalars['String']['output'];\n        };\n      `);\n      validateTs(result);\n    });\n\n    it('Should build input type correctly when specified with avoidInputOptionals config', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        input MyInput {\n          foo: String\n          bar: String!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { avoidOptionals: { inputValue: true } },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInput = {\n          foo: InputMaybe<Scalars['String']['input']>;\n          bar: Scalars['String']['input'];\n        }\n      `);\n\n      validateTs(result);\n    });\n\n    it('Should build type correctly when specified with immutableTypes config', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type MyType {\n          foo: [String!]!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { immutableTypes: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          readonly  __typename?: 'MyType';\n          readonly foo: ReadonlyArray<Scalars['String']['output']>;\n        };\n      `);\n      validateTs(result);\n    });\n\n    it('Should use const enums when constEnums is set', async () => {\n      const schema = buildSchema(`\n      enum MyEnum {\n        A\n      }`);\n      const result = await plugin(schema, [], { constEnums: true }, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n      export const enum MyEnum {\n        A = 'A'\n      };\n    `);\n      validateTs(result);\n    });\n\n    it('Should use enum as type when enumsAsTypes is set', async () => {\n      const schema = buildSchema(`\n      enum MyEnum {\n        A\n        B\n      }`);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumsAsTypes: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyEnum =\n          | 'A'\n          | 'B';\n      `);\n      validateTs(result);\n    });\n\n    it('Should use enum as type when enumsAsTypes is set and also enumValues', async () => {\n      const schema = buildSchema(`\n      enum MyEnum {\n        A\n        B\n      }`);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumValues: { MyEnum: { A: 'BOOP' } }, enumsAsTypes: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyEnum =\n          | 'BOOP'\n          | 'B';\n      `);\n      validateTs(result);\n    });\n\n    it('Should add `%future added value` to enum when futureProofEnums is set and also enumAsTypes', async () => {\n      const schema = buildSchema(`\n      enum MyEnum {\n        A\n        B\n      }\n\n      type MyType {\n        required: MyEnum!\n        optional: MyEnum\n      }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumsAsTypes: true, futureProofEnums: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyEnum =\n        | 'A'\n        | 'B'\n        | '%future added value'\n    `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          required: MyEnum;\n          optional?: Maybe<MyEnum>;\n        }\n      `);\n      validateTs(result);\n    });\n\n    it('Should add `%future added value` to enum usage when futureProofEnums is set, but not enumAsTypes', async () => {\n      const schema = buildSchema(`\n        enum MyEnum {\n          A\n          B\n        }\n\n        type MyType {\n          required: MyEnum!\n          optional: MyEnum\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { futureProofEnums: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export enum MyEnum {\n          A = 'A',\n          B = 'B'\n        }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          required: MyEnum | '%future added value';\n          optional?: Maybe<MyEnum | '%future added value'>;\n        }\n      `);\n      validateTs(result);\n    });\n\n    it('Should add `%future added value` to enum usage when futureProofEnums is set and allowEnumStringTypes is set', async () => {\n      const schema = buildSchema(`\n        enum MyEnum {\n          A\n          B\n        }\n\n        type MyType {\n          required: MyEnum!\n          optional: MyEnum\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { futureProofEnums: true, allowEnumStringTypes: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export enum MyEnum {\n          A = 'A',\n          B = 'B'\n        }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          required: MyEnum | '%future added value' | \\`\\${MyEnum}\\`;\n          optional?: Maybe<MyEnum | '%future added value' | \\`\\${MyEnum}\\`>;\n        }\n      `);\n      validateTs(result);\n    });\n\n    it('Should use custom namingConvention for enums (keep)', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        enum Foo {\n          YES\n          NO\n        }\n        type MyType {\n          foo(a: String!, b: String, c: [String], d: [Int!]!): Foo\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          namingConvention: {\n            typeNames: 'change-case-all#lowerCase',\n            enumValues: 'keep',\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export enum foo {\n          YES = 'YES',\n          NO = 'NO'\n        }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type mytypefooargs = {\n          a: Scalars['String']['input'];\n          b?: InputMaybe<Scalars['String']['input']>;\n          c?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;\n          d: Array<Scalars['Int']['input']>;\n        };\n    `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type mytype = {\n          __typename?: 'MyType';\n          foo?: Maybe<foo>;\n        };\n    `);\n\n      validateTs(result);\n    });\n\n    it('Should use custom namingConvention for enums values as string, without specifying other type converters', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        enum Foo {\n          YES\n          NO\n        }\n        type MyType {\n          foo(a: String!, b: String, c: [String], d: [Int!]!): Foo\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          namingConvention: {\n            enumValues: 'change-case-all#lowerCase',\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n      export enum Foo {\n        yes = 'YES',\n        no = 'NO'\n      }`);\n    });\n\n    it('Should use custom namingConvention for enums', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        enum Foo {\n          YES\n          NO\n        }\n        type MyType {\n          foo(a: String!, b: String, c: [String], d: [Int!]!): Foo\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          namingConvention: {\n            typeNames: 'keep',\n            enumValues: 'change-case-all#lowerCase',\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export enum Foo {\n          yes = 'YES',\n          no = 'NO'\n        }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypefooArgs = {\n          a: Scalars['String']['input'];\n          b?: InputMaybe<Scalars['String']['input']>;\n          c?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;\n          d: Array<Scalars['Int']['input']>;\n        };\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          foo?: Maybe<Foo>;\n        };\n      `);\n\n      validateTs(result);\n    });\n\n    it('should handle introspection types (like __TypeKind)', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        type Post {\n          title: String\n        }\n        type Query {\n          post: Post!\n        }\n      `);\n      const query = parse(/* GraphQL */ `\n        query Info {\n          __type(name: \"Post\") {\n            name\n            fields {\n              name\n              type {\n                name\n                kind\n              }\n            }\n          }\n        }\n      `);\n\n      const result = (await plugin(\n        testSchema,\n        [{ location: '', document: query }],\n        {},\n        {\n          outputFile: 'graphql.ts',\n        }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n      /** An enum describing what kind of type a given \\`__Type\\` is. */\n      export enum __TypeKind {\n        /** Indicates this type is a scalar. */\n        Scalar = 'SCALAR',\n        /** Indicates this type is an object. \\`fields\\` and \\`interfaces\\` are valid fields. */\n        Object = 'OBJECT',\n        /** Indicates this type is an interface. \\`fields\\`, \\`interfaces\\`, and \\`possibleTypes\\` are valid fields. */\n        Interface = 'INTERFACE',\n        /** Indicates this type is a union. \\`possibleTypes\\` is a valid field. */\n        Union = 'UNION',\n        /** Indicates this type is an enum. \\`enumValues\\` is a valid field. */\n        Enum = 'ENUM',\n        /** Indicates this type is an input object. \\`inputFields\\` is a valid field. */\n        InputObject = 'INPUT_OBJECT',\n        /** Indicates this type is a list. \\`ofType\\` is a valid field. */\n        List = 'LIST',\n        /** Indicates this type is a non-null. \\`ofType\\` is a valid field. */\n        NonNull = 'NON_NULL'\n      }\n      `);\n    });\n\n    it('Should use class correctly when declarationKind: class is set', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        input MyInput {\n          id: ID!\n          displayName: String\n        }\n\n        type MyType {\n          id: ID!\n          displayName: String\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          declarationKind: 'class',\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export class MyInput {\n          id: Scalars['ID']['input'];\n          displayName?: InputMaybe<Scalars['String']['input']>;\n        }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export class MyType {\n          __typename?: 'MyType';\n          id: Scalars['ID']['output'];\n          displayName?: Maybe<Scalars['String']['output']>;\n        }\n      `);\n\n      validateTs(result);\n    });\n\n    it('Should use interface for type when declarationKind for types is set', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        input MyInput {\n          id: ID!\n          displayName: String\n        }\n\n        type MyType {\n          id: ID!\n          displayName: String\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          declarationKind: {\n            type: 'interface',\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInput = {\n          id: Scalars['ID']['input'];\n          displayName?: InputMaybe<Scalars['String']['input']>;\n        }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export interface MyType {\n          __typename?: 'MyType';\n          id: Scalars['ID']['output'];\n          displayName?: Maybe<Scalars['String']['output']>;\n        }\n      `);\n      validateTs(result);\n    });\n\n    it('Should use interface for input when declarationKind for inputs is set', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        input MyInput {\n          id: ID!\n          displayName: String\n        }\n\n        type MyType {\n          id: ID!\n          displayName: String\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          declarationKind: {\n            input: 'interface',\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export interface MyInput {\n          id: Scalars['ID']['input'];\n          displayName?: InputMaybe<Scalars['String']['input']>;\n        }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          id: Scalars['ID']['output'];\n          displayName?: Maybe<Scalars['String']['output']>;\n        }\n      `);\n      validateTs(result);\n    });\n\n    it('Should use interface for arguments when declarationKind for arguments is set', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type MyType {\n          id: ID!\n          displayName: String\n          child(id: ID!): MyType\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          declarationKind: {\n            arguments: 'interface',\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          id: Scalars['ID']['output'];\n          displayName?: Maybe<Scalars['String']['output']>;\n          child?: Maybe<MyType>;\n        }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export interface MyTypeChildArgs {\n          id: Scalars['ID']['input'];\n        }\n      `);\n      validateTs(result);\n    });\n\n    it('Should use interface for all objects when declarationKind is interface', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        input MyInput {\n          id: ID!\n          displayName: String\n        }\n\n        type MyType {\n          id: ID!\n          displayName: String\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          declarationKind: 'interface',\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export interface MyInput {\n          id: Scalars['ID']['input'];\n          displayName?: InputMaybe<Scalars['String']['input']>;\n        }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export interface MyType {\n          __typename?: 'MyType';\n          id: Scalars['ID']['output'];\n          displayName?: Maybe<Scalars['String']['output']>;\n        }\n      `);\n      validateTs(result);\n    });\n\n    it('Should correctly render empty interfaces', async () => {\n      const schema = buildSchema(`\n        input MyInput\n\n        type MyType\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          declarationKind: 'interface',\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export interface MyInput {}\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export interface MyType {\n          __typename?: 'MyType';\n        }\n      `);\n      validateTs(result);\n    });\n\n    it('Should extend one interface from another', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface MyInterface {\n          id: ID!\n          displayName: String\n        }\n\n        type MyType implements MyInterface {\n          id: ID!\n          displayName: String\n          value: Int\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          declarationKind: 'interface',\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export interface MyInterface {\n          id: Scalars['ID']['output'];\n          displayName?: Maybe<Scalars['String']['output']>;\n        }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export interface MyType extends MyInterface {\n          __typename?: 'MyType';\n          id: Scalars['ID']['output'];\n          displayName?: Maybe<Scalars['String']['output']>;\n          value?: Maybe<Scalars['Int']['output']>;\n        }\n      `);\n      validateTs(result);\n    });\n\n    it('Should extend mutiple interfaces', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface MyInterface1 {\n          id: ID!\n          displayName: String\n        }\n\n        interface MyInterface2 {\n          value: Int\n        }\n\n        type MyType implements MyInterface1 & MyInterface2 {\n          id: ID!\n          displayName: String\n          value: Int\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          declarationKind: 'interface',\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export interface MyInterface1 {\n          id: Scalars['ID']['output'];\n          displayName?: Maybe<Scalars['String']['output']>;\n        }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export interface MyInterface2 {\n          value?: Maybe<Scalars['Int']['output']>;\n        }\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export interface MyType extends MyInterface1, MyInterface2 {\n          __typename?: 'MyType';\n          id: Scalars['ID']['output'];\n          displayName?: Maybe<Scalars['String']['output']>;\n          value?: Maybe<Scalars['Int']['output']>;\n        }\n      `);\n      validateTs(result);\n    });\n  });\n\n  describe('Scalars', () => {\n    it('Should generate a scalars mapping correctly for built-in scalars', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type MyType {\n          foo: String\n          bar: String!\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n      export type Scalars = {\n        ID: { input: string; output: string;   }\n        String: { input: string; output: string;   }\n        Boolean: { input: boolean; output: boolean;   }\n        Int: { input: number; output: number;   }\n        Float: { input: number; output: number;   }\n      };`);\n\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyType = {\n        __typename?: 'MyType';\n        foo?: Maybe<Scalars['String']['output']>;\n        bar: Scalars['String']['output'];\n      };`);\n      validateTs(result);\n    });\n\n    it('Should generate a scalars mapping correctly when using scalars as path', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        scalar MyScalar\n        scalar MyScalarInput\n\n        type MyType {\n          foo: String\n          bar: MyScalar!\n          baz(input: MyScalarInput): MyScalarInput\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          scalars: '../../scalars',\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.prepend).toContain(`import { MyScalar } from '../../scalars';`);\n      expect(result.prepend).toContain(`import { MyScalarInput } from '../../scalars';`);\n      expect(result.prepend).toContain(`import { String } from '../../scalars';`);\n      expect(result.prepend).toContain(`import { Boolean } from '../../scalars';`);\n      expect(result.content).toBeSimilarStringTo(`\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: String['input']; output: String['output']; }\n          Boolean: { input: Boolean['input']; output: Boolean['output']; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n          MyScalar: { input: MyScalar['input']; output: MyScalar['output']; }\n          MyScalarInput: { input: MyScalarInput['input']; output: MyScalarInput['output']; }\n        };`);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          foo?: Maybe<Scalars['String']['output']>;\n          bar: Scalars['MyScalar']['output'];\n          baz?: Maybe<Scalars['MyScalarInput']['output']>;\n        };`);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypeBazArgs = {\n          input?: InputMaybe<Scalars['MyScalarInput']['input']>;\n        };`);\n      validateTs(result);\n    });\n\n    it('Should import a type of a mapped scalar', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        scalar MyScalar\n        scalar MyOtherScalar\n        scalar MyAliasedScalar\n        scalar OrgScalar\n        scalar OrgOtherScalar\n        scalar OrgAliasedScalar\n\n        type MyType {\n          foo: String\n          bar: MyScalar!\n          baz: MyOtherScalar!\n          qux: MyAliasedScalar!\n          tux(in: MyScalar!): MyScalar!\n          ay: OrgScalar!\n          bee: OrgOtherScalar!\n          ce: OrgAliasedScalar!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          scalars: {\n            MyScalar: '../../scalars#default',\n            MyOtherScalar: '../../scalars#MyOtherScalar',\n            MyAliasedScalar: '../../scalars#MyAliasedScalar as AliasedScalar',\n            OrgScalar: '@org/scalars#default',\n            OrgOtherScalar: '@org/scalars#OrgOtherScalar',\n            OrgAliasedScalar: '@org/scalars#OrgOtherScalar as OrgAliasedScalar',\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      // It seems like we don't group imports...\n      expect(result.prepend).toContain(`import MyScalar from '../../scalars';`);\n      expect(result.prepend).toContain(`import { MyOtherScalar } from '../../scalars';`);\n      expect(result.prepend).toContain(`import { MyAliasedScalar as AliasedScalar } from '../../scalars';`);\n      expect(result.prepend).toContain(`import OrgScalar from '@org/scalars';`);\n      expect(result.prepend).toContain(`import { OrgOtherScalar } from '@org/scalars';`);\n      expect(result.prepend).toContain(`import { OrgOtherScalar as OrgAliasedScalar } from '@org/scalars';`);\n      expect(result.content).toBeSimilarStringTo(`\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n          MyScalar: { input: MyScalar; output: MyScalar; }\n          MyOtherScalar: { input: MyOtherScalar; output: MyOtherScalar; }\n          MyAliasedScalar: { input: AliasedScalar; output: AliasedScalar; }\n          OrgScalar: { input: OrgScalar; output: OrgScalar; }\n          OrgOtherScalar: { input: OrgOtherScalar; output: OrgOtherScalar; }\n          OrgAliasedScalar: { input: OrgAliasedScalar; output: OrgAliasedScalar; }\n        };`);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          foo?: Maybe<Scalars['String']['output']>;\n          bar: Scalars['MyScalar']['output'];\n          baz: Scalars['MyOtherScalar']['output'];\n          qux: Scalars['MyAliasedScalar']['output'];\n          tux: Scalars['MyScalar']['output'];\n          ay: Scalars['OrgScalar']['output'];\n          bee: Scalars['OrgOtherScalar']['output'];\n          ce: Scalars['OrgAliasedScalar']['output'];\n        };`);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypeTuxArgs = {\n          in: Scalars['MyScalar']['input'];\n        }`);\n      validateTs(result);\n    });\n\n    it('Should import a type of a mapped scalar for input/output mapping', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        scalar MyScalar\n        scalar MyOtherScalar\n        scalar MyAliasedScalar\n        scalar OrgScalar\n        scalar OrgOtherScalar\n        scalar OrgAliasedScalar\n\n        type MyType {\n          foo: String\n          bar: MyScalar!\n          baz: MyOtherScalar!\n          qux: MyAliasedScalar!\n          tux(in: MyScalar!): MyScalar!\n          ay: OrgScalar!\n          bee: OrgOtherScalar!\n          ce: OrgAliasedScalar!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        {\n          scalars: {\n            MyScalar: {\n              input: '../../scalarsInput#default as MyScalarInput',\n              output: '../../scalarsOutput#default as MyScalarOutput',\n            },\n            MyOtherScalar: {\n              input: '../../scalars#MyOtherScalarInput',\n              output: '../../scalars#MyOtherScalarOutput',\n            },\n            MyAliasedScalar: {\n              input: '../../scalars#MyAliasedScalar as AliasedScalarInput',\n              output: '../../scalars#MyAliasedScalar as AliasedScalarOutput',\n            },\n            OrgScalar: {\n              input: '@org/scalars-input#default as OrgScalarInput',\n              output: '@org/scalars-output#default as OrgScalarOutput',\n            },\n            OrgOtherScalar: {\n              input: '@org/scalars#OrgOtherScalarInput',\n              output: '@org/scalars#OrgOtherScalarOutput',\n            },\n            OrgAliasedScalar: {\n              input: '@org/scalars#OrgOtherScalar as OrgAliasedScalarInput',\n              output: '@org/scalars#OrgOtherScalar as OrgAliasedScalarOutput',\n            },\n          },\n        },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.prepend).toContain(`import MyScalarInput from '../../scalarsInput';`);\n      expect(result.prepend).toContain(`import MyScalarOutput from '../../scalarsOutput';`);\n      expect(result.prepend).toContain(`import { MyOtherScalarInput } from '../../scalars';`);\n      expect(result.prepend).toContain(`import { MyOtherScalarOutput } from '../../scalars';`);\n      expect(result.prepend).toContain(`import { MyAliasedScalar as AliasedScalarInput } from '../../scalars';`);\n      expect(result.prepend).toContain(`import { MyAliasedScalar as AliasedScalarOutput } from '../../scalars';`);\n      expect(result.prepend).toContain(`import OrgScalarInput from '@org/scalars-input';`);\n      expect(result.prepend).toContain(`import OrgScalarOutput from '@org/scalars-output';`);\n      expect(result.prepend).toContain(`import { OrgOtherScalarInput } from '@org/scalars';`);\n      expect(result.prepend).toContain(`import { OrgOtherScalarOutput } from '@org/scalars';`);\n      expect(result.prepend).toContain(`import { OrgOtherScalar as OrgAliasedScalarInput } from '@org/scalars';`);\n      expect(result.prepend).toContain(`import { OrgOtherScalar as OrgAliasedScalarOutput } from '@org/scalars';`);\n      expect(result.content).toBeSimilarStringTo(`\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n          MyScalar: { input: MyScalarInput; output: MyScalarOutput; }\n          MyOtherScalar: { input: MyOtherScalarInput; output: MyOtherScalarOutput; }\n          MyAliasedScalar: { input: AliasedScalarInput; output: AliasedScalarOutput; }\n          OrgScalar: { input: OrgScalarInput; output: OrgScalarOutput; }\n          OrgOtherScalar: { input: OrgOtherScalarInput; output: OrgOtherScalarOutput; }\n          OrgAliasedScalar: { input: OrgAliasedScalarInput; output: OrgAliasedScalarOutput; }\n        };`);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          foo?: Maybe<Scalars['String']['output']>;\n          bar: Scalars['MyScalar']['output'];\n          baz: Scalars['MyOtherScalar']['output'];\n          qux: Scalars['MyAliasedScalar']['output'];\n          tux: Scalars['MyScalar']['output'];\n          ay: Scalars['OrgScalar']['output'];\n          bee: Scalars['OrgOtherScalar']['output'];\n          ce: Scalars['OrgAliasedScalar']['output'];\n        };`);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypeTuxArgs = {\n          in: Scalars['MyScalar']['input'];\n        }`);\n      validateTs(result);\n    });\n\n    it('Should generate a scalars mapping correctly for custom scalars', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        scalar MyScalar\n\n        type MyType {\n          foo: String\n          bar: MyScalar!\n          buz(input: MyScalar!): MyScalar!\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n          MyScalar: { input: any; output: any; }\n        };`);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          foo?: Maybe<Scalars['String']['output']>;\n          bar: Scalars['MyScalar']['output'];\n          buz: Scalars['MyScalar']['output'];\n        };`);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypeBuzArgs = {\n          input: Scalars['MyScalar']['input'];\n        }`);\n      validateTs(result);\n    });\n\n    it('Should generate a scalars mapping correctly for custom scalars with mapping', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        scalar MyScalar\n\n        type MyType {\n          foo: String\n          bar: MyScalar!\n          buz(input: MyScalar!): MyScalar!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { scalars: { MyScalar: 'Date' } },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n          MyScalar: { input: Date; output: Date; }\n        };`);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          foo?: Maybe<Scalars['String']['output']>;\n          bar: Scalars['MyScalar']['output'];\n          buz: Scalars['MyScalar']['output'];\n        };`);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypeBuzArgs = {\n          input: Scalars['MyScalar']['input'];\n        }`);\n      validateTs(result);\n    });\n\n    it('Should generate a scalars mapping correctly for custom scalars with input/output mapping', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        scalar MyScalar\n\n        type MyType {\n          foo: String\n          bar: MyScalar!\n          buz(input: MyScalar!): MyScalar!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { scalars: { MyScalar: { input: 'bigint', output: 'number | bigint' } } },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n          MyScalar: { input: bigint; output: number | bigint; }\n        };`);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          foo?: Maybe<Scalars['String']['output']>;\n          bar: Scalars['MyScalar']['output'];\n          buz: Scalars['MyScalar']['output'];\n        };`);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypeBuzArgs = {\n          input: Scalars['MyScalar']['input'];\n        }`);\n      validateTs(result);\n    });\n\n    it('Should correctly throw an error when an unknown scalar is detected while using `strictScalars`', () => {\n      const schema = buildSchema(/* GraphQL */ `\n        scalar MyScalar\n\n        type MyType {\n          foo: String\n          bar: MyScalar!\n        }\n      `);\n\n      expect(() => {\n        plugin(schema, [], { strictScalars: true }, { outputFile: '' });\n      }).toThrow('Unknown scalar type MyScalar');\n    });\n\n    it('Should allow overriding default scalar type', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        scalar MyScalar\n\n        type MyType {\n          foo: String\n          bar: MyScalar!\n          buz(input: MyScalar!): MyScalar!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { defaultScalarType: 'unknown' },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n          MyScalar: { input: unknown; output: unknown; }\n        };`);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          foo?: Maybe<Scalars['String']['output']>;\n          bar: Scalars['MyScalar']['output'];\n          buz: Scalars['MyScalar']['output'];\n        };`);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypeBuzArgs = {\n          input: Scalars['MyScalar']['input'];\n        }`);\n      validateTs(result);\n    });\n\n    it('Should add FieldWrapper when field definition wrapping is enabled', async () => {\n      const schema = buildSchema(`\n      scalar A\n      `);\n\n      const result = (await plugin(\n        schema,\n        [],\n        { wrapFieldDefinitions: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n      expect(result.prepend).toBeSimilarStringTo('export type FieldWrapper<T> =');\n      validateTs(result);\n    });\n\n    it('Should allow the FieldWrapper type to be modified', async () => {\n      const schema = buildSchema(`\n      scalar A\n      `);\n\n      const result = (await plugin(\n        schema,\n        [],\n        { fieldWrapperValue: 'T | Promise<T>', wrapFieldDefinitions: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n      expect(result.prepend).toBeSimilarStringTo('export type FieldWrapper<T> = T | Promise<T>');\n      validateTs(result);\n    });\n  });\n\n  describe('Object (type)', () => {\n    it('Should build type correctly', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type MyType {\n          foo: String\n          bar: String!\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          foo?: Maybe<Scalars['String']['output']>;\n          bar: Scalars['String']['output'];\n        };\n      `);\n      validateTs(result);\n    });\n\n    it('Should build type correctly when implementing interface', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface MyInterface {\n          foo: String!\n        }\n\n        type MyType implements MyInterface {\n          foo: String!\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInterface = {\n          foo: Scalars['String']['output'];\n        };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = MyInterface & {\n          __typename?: 'MyType';\n          foo: Scalars['String']['output'];\n        };\n      `);\n      validateTs(result);\n    });\n\n    it('Should build type correctly when implementing multiple interfaces', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface MyInterface {\n          foo: String!\n        }\n\n        interface MyOtherInterface {\n          bar: String!\n        }\n\n        type MyType implements MyInterface & MyOtherInterface {\n          foo: String!\n          bar: String!\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInterface = {\n          foo: Scalars['String']['output'];\n        };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyOtherInterface = {\n          bar: Scalars['String']['output'];\n        };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = MyInterface & MyOtherInterface & {\n          __typename?: 'MyType';\n          foo: Scalars['String']['output'];\n          bar: Scalars['String']['output'];\n        };\n      `);\n      validateTs(result);\n    });\n\n    it('Should build type correctly when implementing interface without adding fields', async () => {\n      const schema = buildSchema(`\n        interface MyInterface {\n          foo: String!\n        }\n\n        type MyType implements MyInterface\n        `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInterface = {\n          foo: Scalars['String']['output'];\n        };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = MyInterface & {\n          __typename?: 'MyType';\n        };\n      `);\n      validateTs(result);\n    });\n\n    it('Should build type correctly with links between types', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type MyType {\n          foo: MyOtherType!\n        }\n\n        type MyOtherType {\n          bar: String!\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = {\n          __typename?: 'MyType';\n          foo: MyOtherType;\n        };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyOtherType = {\n          __typename?: 'MyOtherType';\n          bar: Scalars['String']['output'];\n        };\n      `);\n      validateTs(result);\n    });\n\n    it('Should build type correctly when wrapping field definitions', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface MyInterface {\n          foo: String!\n        }\n\n        type MyType implements MyInterface {\n          foo: String!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { wrapFieldDefinitions: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInterface = {\n          foo: FieldWrapper<Scalars['String']['output']>;\n        };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyType = MyInterface & {\n          __typename?: 'MyType';\n          foo: FieldWrapper<Scalars['String']['output']>;\n        };\n      `);\n      validateTs(result);\n    });\n\n    it('Should build list type correctly when wrapping field definitions', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type ListOfStrings {\n          foo: [String!]!\n        }\n\n        type ListOfMaybeStrings {\n          foo: [String]!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { wrapFieldDefinitions: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type ListOfStrings = {\n          __typename?: 'ListOfStrings';\n          foo: Array<FieldWrapper<Scalars['String']['output']>>;\n        };\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type ListOfMaybeStrings = {\n          __typename?: 'ListOfMaybeStrings';\n          foo: Array<Maybe<FieldWrapper<Scalars['String']['output']>>>;\n        };\n      `);\n\n      validateTs(result);\n    });\n\n    it('Should build list type correctly when wrapping entire field definitions', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type ListOfStrings {\n          foo: [String!]!\n        }\n\n        type ListOfMaybeStrings {\n          foo: [String]!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { wrapEntireFieldDefinitions: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type ListOfStrings = {\n          __typename?: 'ListOfStrings';\n          foo: EntireFieldWrapper<Array<Scalars['String']['output']>>;\n        };\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type ListOfMaybeStrings = {\n          __typename?: 'ListOfMaybeStrings';\n          foo: EntireFieldWrapper<Array<Maybe<Scalars['String']['output']>>>;\n        };\n      `);\n\n      validateTs(result);\n    });\n\n    it('Should build list type correctly when wrapping both field definitions and entire field definitions', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type ListOfStrings {\n          foo: [String!]!\n        }\n\n        type ListOfMaybeStrings {\n          foo: [String]!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { wrapEntireFieldDefinitions: true, wrapFieldDefinitions: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type ListOfStrings = {\n          __typename?: 'ListOfStrings';\n          foo: EntireFieldWrapper<Array<FieldWrapper<Scalars['String']['output']>>>;\n        };\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type ListOfMaybeStrings = {\n          __typename?: 'ListOfMaybeStrings';\n          foo: EntireFieldWrapper<Array<Maybe<FieldWrapper<Scalars['String']['output']>>>>;\n        };\n      `);\n\n      validateTs(result);\n    });\n\n    it('Should not wrap input type fields', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        input MyInput {\n          foo: String!\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { wrapFieldDefinitions: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInput = {\n          foo: Scalars['String']['input'];\n        };\n      `);\n      validateTs(result);\n    });\n  });\n\n  describe('Union', () => {\n    it('Should build union as type correctly', async () => {\n      const schema = buildSchema(`\n      type MyType {\n        foo: String!\n      }\n\n      type MyOtherType {\n        bar: String!\n      }\n\n      union MyUnion = MyType | MyOtherType\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyUnion = MyType | MyOtherType;\n    `);\n      validateTs(result);\n    });\n    it('Should add `%other` object typename to union when futureProofUnions is set', async () => {\n      const schema = buildSchema(`\n      type MyType {\n        foo: String!\n      }\n\n      type MyOtherType {\n        bar: String!\n      }\n\n      union MyUnion = MyType | MyOtherType\n      `);\n      const result = await plugin(schema, [], { futureProofUnions: true }, { outputFile: '' });\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyUnion = MyType | MyOtherType | { __typename?: \"%other\" };\n    `);\n      validateTs(result);\n    });\n    it('Should add `%other` object typename to union when futureProofUnions and immutableTypes is set', async () => {\n      const schema = buildSchema(`\n      type MyType {\n        foo: String!\n      }\n\n      type MyOtherType {\n        bar: String!\n      }\n\n      union MyUnion = MyType | MyOtherType\n      `);\n      const result = await plugin(schema, [], { futureProofUnions: true, immutableTypes: true }, { outputFile: '' });\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyUnion = MyType | MyOtherType | { readonly __typename?: \"%other\" };\n    `);\n      validateTs(result);\n    });\n  });\n\n  describe('Interface', () => {\n    it('Should build interface correctly', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        interface MyInterface {\n          foo: String\n          bar: String!\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInterface = {\n          foo?: Maybe<Scalars['String']['output']>;\n          bar: Scalars['String']['output'];\n        };\n      `);\n      validateTs(result);\n    });\n  });\n\n  describe('Directives', () => {\n    it('Should handle directive declarations correctly', async () => {\n      const schema = buildSchema(`\n        directive @simple on FIELD_DEFINITION\n        directive @withArgument(arg: Int!) on FIELD_DEFINITION\n        directive @objSimple on OBJECT\n        directive @universal on OBJECT | FIELD_DEFINITION | ENUM_VALUE\n      `);\n\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).not.toContain('simple');\n      expect(result.content).not.toContain('withArguments');\n      expect(result.content).not.toContain('objSimple');\n      expect(result.content).not.toContain('universal');\n      validateTs(result);\n    });\n\n    it('Should handle type override', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        directive @AsNumber on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION\n\n        input MyInput {\n          id: ID! @AsNumber\n        }\n\n        type Query {\n          myField(id: ID! @AsNumber): Boolean\n        }\n      `);\n      const result = await plugin(\n        schema,\n        [],\n        { directiveArgumentAndInputFieldMappings: { AsNumber: 'number' } },\n        { outputFile: '' }\n      );\n\n      expect(result.content).toBeSimilarStringTo(`\n      export type DirectiveArgumentAndInputFieldMappings = {\n        AsNumber: number;\n      };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyInput = {\n        id: DirectiveArgumentAndInputFieldMappings['AsNumber'];\n      };\n\n      export type Query = {\n        __typename?: 'Query';\n        myField?: Maybe<Scalars['Boolean']['output']>;\n      };\n\n      export type QueryMyFieldArgs = {\n        id: DirectiveArgumentAndInputFieldMappings['AsNumber'];\n      };\n      `);\n      validateTs(result);\n    });\n\n    it('Should allow imported types', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        directive @AsNumber on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION\n\n        input MyInput {\n          id: ID! @AsNumber\n        }\n      `);\n      const result = await plugin(\n        schema,\n        [],\n        {\n          directiveArgumentAndInputFieldMappings: { AsNumber: './someModule#MyType' },\n          directiveArgumentAndInputFieldMappingTypeSuffix: 'Model',\n        },\n        { outputFile: '' }\n      );\n\n      expect(result.prepend).toContain(\"import { MyType as MyTypeModel } from './someModule';\");\n      expect(result.content).toBeSimilarStringTo(`\n      export type DirectiveArgumentAndInputFieldMappings = {\n        AsNumber: MyTypeModel;\n      };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyInput = {\n        id: DirectiveArgumentAndInputFieldMappings['AsNumber'];\n      };\n      `);\n      validateTs(result);\n    });\n\n    it('Should use last directive override', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        directive @AsNumber on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION\n        directive @AsString on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION\n\n        input MyInput {\n          id: ID! @AsNumber @AsString\n        }\n      `);\n      const result = await plugin(\n        schema,\n        [],\n        { directiveArgumentAndInputFieldMappings: { AsNumber: 'number', AsString: 'AsString' } },\n        { outputFile: '' }\n      );\n\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyInput = {\n        id: DirectiveArgumentAndInputFieldMappings['AsString'];\n      };\n      `);\n      validateTs(result);\n    });\n\n    it('Should ignore unmapped directives', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        directive @AsNumber on ARGUMENT_DEFINITION | INPUT_FIELD_DEFINITION\n\n        input MyInput {\n          id: ID! @AsNumber\n        }\n      `);\n      const result = await plugin(schema, [], { directiveArgumentAndInputFieldMappings: {} }, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyInput = {\n        id: Scalars['ID']['input'];\n      };\n      `);\n      validateTs(result);\n    });\n\n    describe('@oneOf on input types', () => {\n      const oneOfDirectiveDefinition = /* GraphQL */ `\n        directive @oneOf on INPUT_OBJECT\n      `;\n\n      it('correct output for type with single field', async () => {\n        const schema = buildSchema(\n          /* GraphQL */ `\n          input Input @oneOf {\n            int: Int\n          }\n\n          type Query {\n            foo(input: Input!): Boolean!\n          }\n        `.concat(oneOfDirectiveDefinition)\n        );\n\n        const result = await plugin(schema, [], {}, { outputFile: '' });\n\n        expect(result.content).toBeSimilarStringTo(`\n          export type Input =\n            { int: Scalars['Int']['input']; };\n        `);\n      });\n\n      it('correct output for type with multiple fields', async () => {\n        const schema = buildSchema(\n          /* GraphQL */ `\n          input Input @oneOf {\n            int: Int\n            boolean: Boolean\n          }\n\n          type Query {\n            foo(input: Input!): Boolean!\n          }\n        `.concat(oneOfDirectiveDefinition)\n        );\n\n        const result = await plugin(schema, [], {}, { outputFile: '' });\n\n        expect(result.content).toBeSimilarStringTo(`\n          export type Input =\n            { int: Scalars['Int']['input']; boolean?: never; }\n            | { int?: never; boolean: Scalars['Boolean']['input']; };\n        `);\n      });\n\n      it('respects configured declaration kind with single field', async () => {\n        const schema = buildSchema(\n          /* GraphQL */ `\n          input Input @oneOf {\n            int: Int\n          }\n\n          type Query {\n            foo(input: Input!): Boolean!\n          }\n        `.concat(oneOfDirectiveDefinition)\n        );\n\n        const result = await plugin(schema, [], { declarationKind: 'interface' }, { outputFile: '' });\n\n        expect(result.content).toBeSimilarStringTo(`\n          export interface Input {\n            int: Scalars['Int']['input'];\n          }\n        `);\n      });\n\n      it('forces declaration kind of type with multiple fields', async () => {\n        const schema = buildSchema(\n          /* GraphQL */ `\n          input Input @oneOf {\n            int: Int\n            boolean: Boolean\n          }\n\n          type Query {\n            foo(input: Input!): Boolean!\n          }\n        `.concat(oneOfDirectiveDefinition)\n        );\n\n        const result = await plugin(schema, [], { declarationKind: 'interface' }, { outputFile: '' });\n\n        expect(result.content).toBeSimilarStringTo(`\n          export type Input =\n            { int: Scalars['Int']['input']; boolean?: never; }\n            | { int?: never; boolean: Scalars['Boolean']['input']; };\n        `);\n      });\n\n      it('raises exception for type with non-optional fields', async () => {\n        const schema = buildSchema(\n          /* GraphQL */ `\n          input Input @oneOf {\n            int: Int!\n            boolean: Boolean!\n          }\n\n          type Query {\n            foo(input: Input!): Boolean!\n          }\n        `.concat(oneOfDirectiveDefinition)\n        );\n\n        try {\n          await plugin(schema, [], {}, { outputFile: '' });\n          throw new Error('Plugin should have raised an exception.');\n        } catch (err) {\n          expect(err.message).toEqual(\n            'Fields on an input object type can not be non-nullable. It seems like the schema was not validated.'\n          );\n        }\n      });\n\n      it('handles extensions properly', async () => {\n        const schema = buildSchema(\n          /* GraphQL */ `\n          input Input @oneOf {\n            int: Int\n          }\n\n          extend input Input {\n            boolean: Boolean\n          }\n\n          type Query {\n            foo(input: Input!): Boolean!\n          }\n        `.concat(oneOfDirectiveDefinition)\n        );\n\n        const result = await plugin(schema, [], {}, { outputFile: '' });\n        expect(result.content).toBeSimilarStringTo(`\n          export type Input =\n            { int: Scalars['Int']['input']; boolean?: never; }\n            | { int?: never; boolean: Scalars['Boolean']['input']; };\n        `);\n      });\n\n      it('handles .isOneOf property on input object types properly', async () => {\n        const schema = buildSchema(\n          /* GraphQL */ `\n          input Input {\n            int: Int\n            boolean: Boolean\n          }\n\n          type Query {\n            foo(input: Input!): Boolean!\n          }\n        `.concat(oneOfDirectiveDefinition)\n        );\n\n        const inputType: Record<'isOneOf', boolean> = schema.getType('Input') as any;\n        inputType.isOneOf = true;\n\n        const result = await plugin(schema, [], {}, { outputFile: '' });\n        expect(result.content).toBeSimilarStringTo(`\n          export type Input =\n            { int: Scalars['Int']['input']; boolean?: never; }\n            | { int?: never; boolean: Scalars['Boolean']['input']; };\n        `);\n      });\n    });\n  });\n\n  describe('Naming Convention & Types Prefix', () => {\n    it('Should use custom namingConvention for type name and args typename', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type MyType {\n          foo(a: String!, b: String, c: [String], d: [Int!]!): String\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { namingConvention: 'change-case-all#lowerCase' },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type mytypefooargs = {\n          a: Scalars['String']['input'];\n          b?: InputMaybe<Scalars['String']['input']>;\n          c?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;\n          d: Array<Scalars['Int']['input']>;\n        };\n    `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type mytype = {\n          __typename?: 'MyType';\n          foo?: Maybe<Scalars['String']['output']>;\n        };\n    `);\n\n      validateTs(result);\n    });\n\n    it('Should use custom namingConvention and add custom prefix', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type MyType {\n          foo(a: String!, b: String, c: [String], d: [Int!]!): String\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { namingConvention: 'change-case-all#lowerCase', typesPrefix: 'I' },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type Imytypefooargs = {\n          a: Scalars['String']['input'];\n          b?: InputMaybe<Scalars['String']['input']>;\n          c?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;\n          d: Array<Scalars['Int']['input']>;\n        };\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type Imytype = {\n          __typename?: 'MyType';\n          foo?: Maybe<Scalars['String']['output']>;\n        };\n      `);\n\n      validateTs(result);\n    });\n\n    it('Should allow to disable typesPrefix for enums', async () => {\n      const schema = buildSchema(`type T { f: String, e: E } enum E { A }`);\n      const result = (await plugin(\n        schema,\n        [],\n        { typesPrefix: 'I', enumPrefix: false },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toContain(`export enum E {`);\n      expect(result.content).toContain(`e?: Maybe<E>;`);\n\n      validateTs(result);\n    });\n\n    it('Should allow to disable typesSuffix for enums', async () => {\n      const schema = buildSchema(`type T { f: String, e: E } enum E { A }`);\n      const result = (await plugin(\n        schema,\n        [],\n        { typesSuffix: 'I', enumSuffix: false },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toContain(`export enum E {`);\n      expect(result.content).toContain(`e?: Maybe<E>;`);\n\n      validateTs(result);\n    });\n\n    it('Should enable typesPrefix for enums by default', async () => {\n      const schema = buildSchema(`type T { f: String, e: E } enum E { A }`);\n      const result = await plugin(schema, [], { typesPrefix: 'I' }, { outputFile: '' });\n\n      expect(result.content).toContain(`export enum IE {`);\n      expect(result.content).toContain(`e?: Maybe<IE>;`);\n\n      validateTs(result);\n    });\n\n    const schema = buildSchema(/* GraphQL */ `\n      enum MyEnum {\n        A\n        B\n        C\n      }\n\n      type MyType {\n        f: String\n        bar: MyEnum\n        b_a_r: String\n        myOtherField: String\n      }\n\n      type My_Type {\n        linkTest: MyType\n      }\n\n      union MyUnion = My_Type | MyType\n\n      interface Some_Interface {\n        id: ID!\n      }\n\n      type Impl1 implements Some_Interface {\n        id: ID!\n      }\n\n      type Impl_2 implements Some_Interface {\n        id: ID!\n      }\n\n      type impl_3 implements Some_Interface {\n        id: ID!\n      }\n\n      type Query {\n        something: MyUnion\n        use_interface: Some_Interface\n      }\n    `);\n\n    it('Should generate correct values when using links between types - lowerCase', async () => {\n      const result = (await plugin(\n        schema,\n        [],\n        { namingConvention: 'change-case-all#lowerCase' },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export enum myenum {\n          a = 'A',\n          b = 'B',\n          c = 'C'\n        }\n        `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type mytype = {\n          __typename?: 'MyType';\n          f?: Maybe<Scalars['String']['output']>;\n          bar?: Maybe<myenum>;\n          b_a_r?: Maybe<Scalars['String']['output']>;\n          myOtherField?: Maybe<Scalars['String']['output']>;\n        };\n        `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type my_type = {\n          __typename?: 'My_Type';\n          linkTest?: Maybe<mytype>;\n        };\n        `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type myunion = my_type | mytype;\n        `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type some_interface = {\n          id: Scalars['ID']['output'];\n        };\n        `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type impl1 = some_interface & {\n          __typename?: 'Impl1';\n          id: Scalars['ID']['output'];\n        };\n        `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type impl_2 = some_interface & {\n          __typename?: 'Impl_2';\n          id: Scalars['ID']['output'];\n        };\n        `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type impl_3 = some_interface & {\n          __typename?: 'impl_3';\n          id: Scalars['ID']['output'];\n        };\n        `);\n      expect(result.content).toBeSimilarStringTo(`\n        export type query = {\n          __typename?: 'Query';\n          something?: Maybe<myunion>;\n          use_interface?: Maybe<some_interface>;\n        };\n      `);\n\n      validateTs(result);\n    });\n\n    it('Should generate correct values when using links between types - pascalCase (default)', async () => {\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n      export enum MyEnum {\n        A = 'A',\n        B = 'B',\n        C = 'C'\n      }\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyType = {\n        __typename?: 'MyType';\n        f?: Maybe<Scalars['String']['output']>;\n        bar?: Maybe<MyEnum>;\n        b_a_r?: Maybe<Scalars['String']['output']>;\n        myOtherField?: Maybe<Scalars['String']['output']>;\n      };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type My_Type = {\n        __typename?: 'My_Type';\n        linkTest?: Maybe<MyType>;\n      };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type MyUnion = My_Type | MyType;\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type Some_Interface = {\n        id: Scalars['ID']['output'];\n      };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type Impl1 = Some_Interface & {\n        __typename?: 'Impl1';\n        id: Scalars['ID']['output'];\n      };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type Impl_2 = Some_Interface & {\n        __typename?: 'Impl_2';\n        id: Scalars['ID']['output'];\n      };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type Impl_3 = Some_Interface & {\n        __typename?: 'impl_3';\n        id: Scalars['ID']['output'];\n      };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type Query = {\n        __typename?: 'Query';\n        something?: Maybe<MyUnion>;\n        use_interface?: Maybe<Some_Interface>;\n      };\n      `);\n\n      validateTs(result);\n    });\n\n    it('Should generate correct values when using links between types - pascalCase (default) with custom prefix', async () => {\n      const result = await plugin(schema, [], { typesPrefix: 'I' }, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n      export enum IMyEnum {\n        A = 'A',\n        B = 'B',\n        C = 'C'\n      }`);\n\n      expect(result.content).toBeSimilarStringTo(`\n      export type IMyType = {\n        __typename?: 'MyType';\n        f?: Maybe<Scalars['String']['output']>;\n        bar?: Maybe<IMyEnum>;\n        b_a_r?: Maybe<Scalars['String']['output']>;\n        myOtherField?: Maybe<Scalars['String']['output']>;\n      };`);\n      expect(result.content).toBeSimilarStringTo(`\n      export type IMy_Type = {\n        __typename?: 'My_Type';\n        linkTest?: Maybe<IMyType>;\n      };\n  `);\n      expect(result.content).toBeSimilarStringTo(`export type IMyUnion = IMy_Type | IMyType;`);\n      expect(result.content).toBeSimilarStringTo(`\n      export type ISome_Interface = {\n        id: Scalars['ID']['output'];\n      };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type IImpl1 = ISome_Interface & {\n        __typename?: 'Impl1';\n        id: Scalars['ID']['output'];\n      };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type IImpl_2 = ISome_Interface & {\n        __typename?: 'Impl_2';\n        id: Scalars['ID']['output'];\n      };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type IImpl_3 = ISome_Interface & {\n        __typename?: 'impl_3';\n        id: Scalars['ID']['output'];\n      };\n      `);\n      expect(result.content).toBeSimilarStringTo(`\n      export type IQuery = {\n        __typename?: 'Query';\n        something?: Maybe<IMyUnion>;\n        use_interface?: Maybe<ISome_Interface>;\n      };\n      `);\n\n      validateTs(result);\n    });\n  });\n\n  describe('Arguments', () => {\n    it('Should generate correctly types for field arguments - with basic fields', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type MyType {\n          foo(a: String!, b: String, c: [String], d: [Int!]!): String\n        }\n      `);\n\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypeFooArgs = {\n          a: Scalars['String']['input'];\n          b?: InputMaybe<Scalars['String']['input']>;\n          c?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>;\n          d: Array<Scalars['Int']['input']>;\n        };\n    `);\n\n      validateTs(result);\n    });\n\n    it('Should generate correctly types for field arguments - with default value', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type MyType {\n          foo(a: String = \"default\", b: String! = \"default\", c: String, d: String!): String\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypeFooArgs = {\n          a?: InputMaybe<Scalars['String']['input']>;\n          b?: Scalars['String']['input'];\n          c?: InputMaybe<Scalars['String']['input']>;\n          d: Scalars['String']['input'];\n        };\n    `);\n\n      validateTs(result);\n    });\n\n    it('Should generate correctly types for field arguments - with default value and avoidOptionals option set to true', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type MyType {\n          foo(a: String = \"default\", b: String! = \"default\", c: String, d: String!): String\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { avoidOptionals: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypeFooArgs = {\n          a?: InputMaybe<Scalars['String']['input']>;\n          b?: Scalars['String']['input'];\n          c: InputMaybe<Scalars['String']['input']>;\n          d: Scalars['String']['input'];\n      };\n    `);\n\n      validateTs(result);\n    });\n\n    it('Should generate correctly types for field arguments - with input type', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        input MyInput {\n          f: String\n        }\n        type MyType {\n          foo(a: MyInput, b: MyInput!, c: [MyInput], d: [MyInput]!, e: [MyInput!]!): String\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypeFooArgs = {\n          a?: InputMaybe<MyInput>;\n          b: MyInput;\n          c?: InputMaybe<Array<InputMaybe<MyInput>>>;\n          d: Array<InputMaybe<MyInput>>;\n          e: Array<MyInput>;\n        };\n    `);\n\n      validateTs(result);\n    });\n\n    it('Should add custom prefix for mutation arguments', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        input Input {\n          name: String\n        }\n        type Mutation {\n          foo(id: ID, input: Input): String\n        }\n      `);\n      const result = await plugin(schema, [], { typesPrefix: 'T' }, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type TInput = {\n          name?: InputMaybe<Scalars['String']['input']>;\n        };\n      `);\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type TMutation = {\n          __typename?: 'Mutation';\n          foo?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type TMutationFooArgs = {\n          id?: InputMaybe<Scalars['ID']['input']>;\n          input?: InputMaybe<TInput>;\n        };\n      `);\n\n      validateTs(result);\n    });\n\n    it('Should generate the correct type for a method with arguments (interface object)', async () => {\n      const testSchema = buildSchema(/* GraphQL */ `\n        interface Node {\n          text(arg1: String!, arg2: String): String\n        }\n\n        type Book implements Node {\n          id: ID!\n          text(arg: String, arg2: String!): String\n        }\n\n        type Query {\n          books: [Book!]!\n        }\n      `);\n      const result = await plugin(testSchema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type NodeTextArgs = {\n          arg1: Scalars['String']['input'];\n          arg2?: InputMaybe<Scalars['String']['input']>;\n        };\n      `);\n      await validateTs(result);\n    });\n\n    it('Should generate correctly types for inputs with default value - #4273', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        input MyInput {\n          a: String = \"default\"\n          b: String! = \"default\"\n          c: String\n          d: String!\n        }\n      `);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInput = {\n          a?: InputMaybe<Scalars['String']['input']>;\n          b?: Scalars['String']['input'];\n          c?: InputMaybe<Scalars['String']['input']>;\n          d: Scalars['String']['input'];\n        };\n    `);\n\n      validateTs(result);\n    });\n\n    it('Should generate correctly types for inputs with default value and avoidOptionals.defaultValue set to true - #5112', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        input MyInput {\n          a: String = \"default\"\n          b: String! = \"default\"\n          c: String\n          d: String!\n        }\n      `);\n      const result = await plugin(schema, [], { avoidOptionals: { defaultValue: true } }, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyInput = {\n          a?: InputMaybe<Scalars['String']['input']>;\n          b: Scalars['String']['input'];\n          c?: InputMaybe<Scalars['String']['input']>;\n          d: Scalars['String']['input'];\n        };\n    `);\n\n      validateTs(result);\n    });\n\n    it('Should generate correctly types for field arguments with default value and avoidOptionals.defaultValue option set to true - #5112', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type MyType {\n          foo(a: String = \"default\", b: String! = \"default\", c: String, d: String!): String\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { avoidOptionals: { defaultValue: true } },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export type MyTypeFooArgs = {\n          a?: InputMaybe<Scalars['String']['input']>;\n          b: Scalars['String']['input'];\n          c?: InputMaybe<Scalars['String']['input']>;\n          d: Scalars['String']['input'];\n        };\n    `);\n\n      validateTs(result);\n    });\n  });\n\n  describe('Enum', () => {\n    it('Should build basic enum correctly', async () => {\n      const schema = buildSchema(`enum MyEnum { A, B, C }`);\n      const result = await plugin(schema, [], {}, { outputFile: '' });\n\n      expect(result.content).toBeSimilarStringTo(`\n        export enum MyEnum {\n          A = 'A',\n          B = 'B',\n          C = 'C'\n        }\n      `);\n\n      validateTs(result);\n    });\n\n    it('Should build enum correctly with custom values', async () => {\n      const schema = buildSchema(`enum MyEnum { A, B, C }`);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumValues: { MyEnum: { A: 'SomeValue', B: 'TEST' } } },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toBeSimilarStringTo(`\n        export enum MyEnum {\n          A = 'SomeValue',\n          B = 'TEST',\n          C = 'C'\n        }\n      `);\n\n      validateTs(result);\n    });\n\n    it('Should build enum correctly with custom imported enum', async () => {\n      const schema = buildSchema(`enum MyEnum { A, B, C }`);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumValues: { MyEnum: './my-file#MyEnum' } },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).not.toContain(`export enum MyEnum`);\n      expect(result.prepend).toContain(`import { MyEnum } from './my-file';`);\n\n      validateTs(result);\n    });\n\n    it('Should build enum correctly with custom imported enum from namespace with different name', async () => {\n      const schema = buildSchema(`enum MyEnum { A, B, C }`);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumValues: { MyEnum: './my-file#NS.ETest' } },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).not.toContain(`export enum MyEnum`);\n      expect(result.content).toContain(`export { MyEnum }`);\n      expect(result.prepend).toContain(`import MyEnum = NS.ETest;`);\n      expect(result.prepend).toContain(`import { NS } from './my-file';`);\n\n      validateTs(result);\n    });\n\n    it('Should build enum correctly with custom imported enum from namespace with same name', async () => {\n      const schema = buildSchema(`enum MyEnum { A, B, C }`);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumValues: { MyEnum: './my-file#NS.MyEnum' } },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).not.toContain(`export enum MyEnum`);\n      expect(result.content).toContain(`export { MyEnum };`);\n      expect(result.prepend).toContain(`import MyEnum = NS.MyEnum;`);\n      expect(result.prepend).toContain(`import { NS } from './my-file';`);\n\n      validateTs(result);\n    });\n\n    it('Should build enum correctly with custom imported enum with different name', async () => {\n      const schema = buildSchema(`enum MyEnum { A, B, C } type Query { t: MyEnum }`);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumValues: { MyEnum: './my-file#MyCustomEnum' } },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).not.toContain(`export enum MyEnum`);\n      expect(result.prepend).toContain(`import { MyCustomEnum as MyEnum } from './my-file';`);\n      expect(result.content).toContain(`export { MyEnum };`);\n\n      validateTs(result);\n    });\n\n    it('Should import all enums from a single file when specified as string', async () => {\n      const schema = buildSchema(`enum MyEnum { A, B, C } enum MyEnum2 { X, Y, Z }`);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumValues: './my-file' },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).not.toContain(`export enum MyEnum`);\n      expect(result.content).not.toContain(`export enum MyEnum2`);\n      expect(result.prepend).toContain(`import { MyEnum } from './my-file';`);\n      expect(result.prepend).toContain(`import { MyEnum2 } from './my-file';`);\n\n      validateTs(result);\n    });\n\n    it('Should re-export external enums', async () => {\n      const schema = buildSchema(`enum MyEnum { A, B, C } enum MyEnum2 { X, Y, Z }`);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumValues: { MyEnum: './my-file#MyEnum', MyEnum2: './my-file#MyEnum2X' } },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.content).toContain(`export { MyEnum };`);\n      expect(result.content).toContain(`export { MyEnum2 };`);\n      expect(result.prepend).toContain(`import { MyEnum2X as MyEnum2 } from './my-file';`);\n\n      validateTs(result);\n    });\n\n    it('Should re-export external enums when single file option used', async () => {\n      const schema = buildSchema(`enum MyEnum { A, B, C } enum MyEnum2 { X, Y, Z }`);\n      const result = (await plugin(\n        schema,\n        [],\n        { enumValues: './my-file' },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      expect(result.prepend).toContain(`import { MyEnum } from './my-file';`);\n      expect(result.prepend).toContain(`import { MyEnum2 } from './my-file';`);\n      expect(result.content).toContain(`export { MyEnum };`);\n      expect(result.content).toContain(`export { MyEnum2 };`);\n\n      validateTs(result);\n    });\n\n    it('allowEnumStringTypes', async () => {\n      const schema = buildSchema(/* GraphQL */ `\n        enum MyEnum {\n          A\n          B\n          C\n        }\n        type Query {\n          a: MyEnum\n        }\n      `);\n      const result = (await plugin(\n        schema,\n        [],\n        { allowEnumStringTypes: true },\n        { outputFile: '' }\n      )) as Types.ComplexPluginOutput;\n\n      validateTs(result);\n\n      expect(result.content).toBeSimilarStringTo('a?: Maybe<MyEnum | `${MyEnum}`>;');\n    });\n  });\n\n  it('should not have [object Object]', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type User {\n        id: Int!\n        name: String!\n        email: String!\n      }\n\n      type QueryRoot {\n        allUsers: [User]!\n        userById(id: Int!): User\n\n        # Generates a new answer for the guessing game\n        answer: [Int!]!\n      }\n\n      type SubscriptionRoot {\n        newUser: User\n      }\n\n      schema {\n        query: QueryRoot\n        subscription: SubscriptionRoot\n      }\n    `);\n\n    const content = await plugin(schema, [], {}, { outputFile: '' });\n\n    expect(content).not.toContainEqual('[object Object]');\n\n    validateTs(content);\n  });\n\n  it('should contain __typename', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type User {\n        id: Int!\n        name: String!\n        email: String!\n      }\n      type QueryRoot {\n        allUsers: [User]!\n        userById(id: Int!): User\n        # Generates a new answer for the guessing game\n        answer: [Int!]!\n      }\n      type SubscriptionRoot {\n        newUser: User\n      }\n      schema {\n        query: QueryRoot\n        subscription: SubscriptionRoot\n      }\n    `);\n\n    const result = await plugin(schema, [], {}, { outputFile: '' });\n    expect(result.content).toContain('__typename');\n\n    validateTs(result);\n  });\n\n  it('should not contain __typename', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type User {\n        id: Int!\n        name: String!\n        email: String!\n      }\n      type QueryRoot {\n        allUsers: [User]!\n        userById(id: Int!): User\n        # Generates a new answer for the guessing game\n        answer: [Int!]!\n      }\n      type SubscriptionRoot {\n        newUser: User\n      }\n      schema {\n        query: QueryRoot\n        subscription: SubscriptionRoot\n      }\n    `);\n\n    const result = await plugin(schema, [], { skipTypename: true }, { outputFile: '' });\n    expect(result.content).not.toContain('__typename');\n\n    validateTs(result);\n  });\n\n  it('should not contain \"export\" when noExport is set to true', async () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type User {\n        id: Int!\n        name: String!\n        email: String!\n      }\n      type QueryRoot {\n        allUsers: [User]!\n        userById(id: Int!): User\n        # Generates a new answer for the guessing game\n        answer: [Int!]!\n      }\n      type SubscriptionRoot {\n        newUser: User\n      }\n      schema {\n        query: QueryRoot\n        subscription: SubscriptionRoot\n      }\n    `);\n\n    const result = await plugin(schema, [], { noExport: true }, { outputFile: '' });\n    expect(result.content).not.toContain('export');\n\n    validateTs(result);\n  });\n\n  it('should keep non-optional arguments non-optional - issue #2323', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      enum OrderBy {\n        name\n        id\n      }\n\n      input Filter {\n        contain: String\n      }\n\n      type Node {\n        id: ID!\n        name: String!\n      }\n\n      type Connection {\n        nodes: [Node]\n      }\n\n      type Query {\n        list(after: String, orderBy: OrderBy = name, filter: Filter!): Connection!\n      }\n    `);\n\n    const output = (await plugin(\n      testSchema,\n      [],\n      {\n        avoidOptionals: false,\n        maybeValue: 'T | undefined',\n      } as any,\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    // Filter.contain should be optional\n    expect(output.content).toBeSimilarStringTo(`\n      export type Filter = {\n        contain?: InputMaybe<Scalars['String']['input']>;\n      };\n    `);\n    // filter should be non-optional\n    expect(output.content).toBeSimilarStringTo(`\n      export type QueryListArgs = {\n        after?: InputMaybe<Scalars['String']['input']>;\n        orderBy?: InputMaybe<OrderBy>;\n        filter: Filter;\n      };\n    `);\n  });\n\n  it('should respect defined enum values', async () => {\n    const testSchema = new GraphQLSchema({\n      query: new GraphQLObjectType({\n        name: 'Query',\n        fields: {\n          foo: {\n            type: new GraphQLEnumType({\n              name: 'Foo',\n              values: {\n                Bar: {\n                  value: 'Qux',\n                },\n              },\n            }),\n          },\n        },\n      }),\n    });\n    const output = await plugin(testSchema, [], {}, { outputFile: 'graphql.ts' });\n\n    expect(output.content).toBeSimilarStringTo(`\n      export enum Foo {\n        Bar = 'Qux'\n      }\n    `);\n  });\n\n  it('should use implementing types as node type - issue #5126', async () => {\n    const testSchema = buildSchema(/* GraphQL */ `\n      type Matrix {\n        pills: [Pill!]!\n      }\n\n      interface Pill {\n        id: ID!\n      }\n\n      type RedPill implements Pill {\n        red: String!\n      }\n\n      type GreenPill implements Pill {\n        green: String!\n      }\n\n      interface Foo {\n        id: ID!\n      }\n\n      type Bar implements Foo {\n        lol: String!\n      }\n\n      type Hello {\n        foo: Foo!\n      }\n\n      type NoInterface {\n        hello: Hello!\n      }\n\n      interface NestedInterface implements Foo {\n        field: String!\n      }\n\n      type NestedType1 implements NestedInterface {\n        hi: String!\n      }\n\n      type NestedType2 implements NestedInterface {\n        ho: String!\n      }\n\n      type NestedField {\n        nested: NestedInterface!\n      }\n    `);\n\n    const output = (await plugin(\n      testSchema,\n      [],\n      {\n        useImplementingTypes: true,\n      } as any,\n      { outputFile: 'graphql.ts' }\n    )) as Types.ComplexPluginOutput;\n\n    expect(output.content).toMatchSnapshot();\n\n    // Type should be Array<RedPill|GreenPill> and not Pill\n    expect(output.content).toBeSimilarStringTo(`\n      export type Matrix = {\n        __typename?: 'Matrix';\n        pills: Array<RedPill | GreenPill>;\n      };\n    `);\n    // Type should be Bar and not Foo\n    expect(output.content).toBeSimilarStringTo(`\n      export type Hello = {\n        __typename?: 'Hello';\n        foo: Bar;\n      };\n    `);\n    // Type should be Hello and not empty\n    expect(output.content).toBeSimilarStringTo(`\n      export type NoInterface = {\n        __typename?: 'NoInterface';\n        hello: Hello;\n      };\n    `);\n    // Type should be NestedType1|NestedType2\n    expect(output.content).toBeSimilarStringTo(`\n      export type NestedField = {\n        __typename?: 'NestedField';\n        nested: NestedType1 | NestedType2;\n      };\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/plugins/typescript/typescript/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'typescript',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/presets/client/CHANGELOG.md",
    "content": "# @graphql-codegen/client-preset\n\n## 5.2.4\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^11.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/11.0.0) (from `^10.0.0`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/gql-tag-operations@5.1.4\n  - @graphql-codegen/plugin-helpers@6.1.1\n  - @graphql-codegen/typed-document-node@6.1.7\n  - @graphql-codegen/typescript@5.0.9\n  - @graphql-codegen/typescript-operations@5.0.9\n  - @graphql-codegen/visitor-plugin-common@6.2.4\n\n## 5.2.3\n\n### Patch Changes\n\n- Updated dependencies [[`6038634`](https://github.com/dotansimha/graphql-code-generator/commit/60386344081917f2884db933309821603a2be2bf)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.3\n  - @graphql-codegen/typescript-operations@5.0.8\n  - @graphql-codegen/gql-tag-operations@5.1.3\n  - @graphql-codegen/typed-document-node@6.1.6\n  - @graphql-codegen/typescript@5.0.8\n\n## 5.2.2\n\n### Patch Changes\n\n- Updated dependencies [[`f588d91`](https://github.com/dotansimha/graphql-code-generator/commit/f588d91ac43ea0aa5931915ce980d2e6876bb59c)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.2\n  - @graphql-codegen/gql-tag-operations@5.1.2\n  - @graphql-codegen/typescript-operations@5.0.7\n  - @graphql-codegen/typed-document-node@6.1.5\n  - @graphql-codegen/typescript@5.0.7\n\n## 5.2.1\n\n### Patch Changes\n\n- Updated dependencies [[`b995ed1`](https://github.com/dotansimha/graphql-code-generator/commit/b995ed13a49379ea05e0e313fac68b557527523a)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.1\n  - @graphql-codegen/gql-tag-operations@5.1.1\n  - @graphql-codegen/typescript-operations@5.0.6\n  - @graphql-codegen/typed-document-node@6.1.4\n  - @graphql-codegen/typescript@5.0.6\n\n## 5.2.0\n\n### Minor Changes\n\n- [#10510](https://github.com/dotansimha/graphql-code-generator/pull/10510) [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670) Thanks [@nickmessing](https://github.com/nickmessing)! - add importExtension configuration option\n\n### Patch Changes\n\n- Updated dependencies [[`f821e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f821e8ab9351f23a9f7e5d5e6fc69c8e8868cad8), [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.0\n  - @graphql-codegen/gql-tag-operations@5.1.0\n  - @graphql-codegen/plugin-helpers@6.1.0\n  - @graphql-codegen/typescript-operations@5.0.5\n  - @graphql-codegen/typed-document-node@6.1.3\n  - @graphql-codegen/typescript@5.0.5\n\n## 5.1.3\n\n### Patch Changes\n\n- [#10499](https://github.com/dotansimha/graphql-code-generator/pull/10499) [`51a1a72`](https://github.com/dotansimha/graphql-code-generator/commit/51a1a7280578d43681391df11d320a8416c0b41d) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix nested fragment not getting correct meta field in Client Preset\n\n- Updated dependencies [[`51a1a72`](https://github.com/dotansimha/graphql-code-generator/commit/51a1a7280578d43681391df11d320a8416c0b41d)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.2\n  - @graphql-codegen/gql-tag-operations@5.0.5\n  - @graphql-codegen/typescript-operations@5.0.4\n  - @graphql-codegen/typed-document-node@6.1.2\n  - @graphql-codegen/typescript@5.0.4\n\n## 5.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`6715330`](https://github.com/dotansimha/graphql-code-generator/commit/67153304646694d75aee24afd70c3fce12e9f1f2)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.1\n  - @graphql-codegen/gql-tag-operations@5.0.4\n  - @graphql-codegen/typescript-operations@5.0.3\n  - @graphql-codegen/typed-document-node@6.1.1\n  - @graphql-codegen/typescript@5.0.3\n\n## 5.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`1debf51`](https://github.com/dotansimha/graphql-code-generator/commit/1debf51aa714e2a53256419c549f6770b6c894a6)]:\n  - @graphql-codegen/gql-tag-operations@5.0.3\n\n## 5.1.0\n\n### Minor Changes\n\n- [#10459](https://github.com/dotansimha/graphql-code-generator/pull/10459) [`87184aa`](https://github.com/dotansimha/graphql-code-generator/commit/87184aa240cb6209e7b3ade13aa54da6ff0b3dff) Thanks [@eddeee888](https://github.com/eddeee888)! - Forward immutableTypes to client preset config\n\n## 5.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`8258f1f`](https://github.com/dotansimha/graphql-code-generator/commit/8258f1f6012c106d02ef28bca9ec424f70c4aa26)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.0\n  - @graphql-codegen/gql-tag-operations@5.0.2\n  - @graphql-codegen/typescript-operations@5.0.2\n  - @graphql-codegen/typed-document-node@6.0.2\n  - @graphql-codegen/typescript@5.0.2\n\n## 5.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`accdab6`](https://github.com/dotansimha/graphql-code-generator/commit/accdab69106605241933e9d66d64dc7077656f30)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.1\n  - @graphql-codegen/gql-tag-operations@5.0.1\n  - @graphql-codegen/typescript-operations@5.0.1\n  - @graphql-codegen/typed-document-node@6.0.1\n  - @graphql-codegen/typescript@5.0.1\n\n## 5.0.1\n\n### Patch Changes\n\n- [#10393](https://github.com/dotansimha/graphql-code-generator/pull/10393) [`ee2276c`](https://github.com/dotansimha/graphql-code-generator/commit/ee2276cb073a87458eda957a17c9e296c1cf313a) Thanks [@eddeee888](https://github.com/eddeee888)! - Include undefined explicitly for input maybe value in Client Preset\n\n## 5.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - BREAKING CHANGE: Use Record<PropertyKey, never> instead of {} for empty object type\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Stop passing through the deprecated config option `dedupeFragments`\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.0\n  - @graphql-codegen/plugin-helpers@6.0.0\n  - @graphql-codegen/typescript@5.0.0\n  - @graphql-codegen/typescript-operations@5.0.0\n  - @graphql-codegen/add@6.0.0\n  - @graphql-codegen/gql-tag-operations@5.0.0\n  - @graphql-codegen/typed-document-node@6.0.0\n\n## 4.8.3\n\n### Patch Changes\n\n- [#10362](https://github.com/dotansimha/graphql-code-generator/pull/10362) [`3188b8c`](https://github.com/dotansimha/graphql-code-generator/commit/3188b8c39e9fd24e3dbbd0bcc8767052153eb399) Thanks [@Brookke](https://github.com/Brookke)! - Make generated type compatible with noImplicitOverride=true\n\n- [#10373](https://github.com/dotansimha/graphql-code-generator/pull/10373) [`c3295f9`](https://github.com/dotansimha/graphql-code-generator/commit/c3295f9c60383e5631ccc4080bc28e7c00a4d61b) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix client preset not working with exactOptionalPropertyTypes=true when documentMode=string\n\n- Updated dependencies [[`3188b8c`](https://github.com/dotansimha/graphql-code-generator/commit/3188b8c39e9fd24e3dbbd0bcc8767052153eb399), [`c3295f9`](https://github.com/dotansimha/graphql-code-generator/commit/c3295f9c60383e5631ccc4080bc28e7c00a4d61b)]:\n  - @graphql-codegen/typed-document-node@5.1.2\n\n## 4.8.2\n\n### Patch Changes\n\n- [#10120](https://github.com/dotansimha/graphql-code-generator/pull/10120) [`98392fc`](https://github.com/dotansimha/graphql-code-generator/commit/98392fc5d91035b5b5b0ffdefd78d0398762a523) Thanks [@yangirov](https://github.com/yangirov)! - The `@graphql-codegen/client-preset` package now supports the `enumValues` option.\n\n- Updated dependencies [[`e324382`](https://github.com/dotansimha/graphql-code-generator/commit/e3243824cfe0d7ab463cf0d5a6455715510959be)]:\n  - @graphql-codegen/plugin-helpers@5.1.1\n\n## 4.8.1\n\n### Patch Changes\n\n- [#10330](https://github.com/dotansimha/graphql-code-generator/pull/10330) [`c5efba3`](https://github.com/dotansimha/graphql-code-generator/commit/c5efba34a7b422720be9ce32937dd19fb0784bae) Thanks [@jnoordsij](https://github.com/jnoordsij)! - Make graphql-sock optional peerDep\n\n- Updated dependencies [[`c5efba3`](https://github.com/dotansimha/graphql-code-generator/commit/c5efba34a7b422720be9ce32937dd19fb0784bae)]:\n  - @graphql-codegen/typescript-operations@4.6.1\n\n## 4.8.0\n\n### Minor Changes\n\n- [#10323](https://github.com/dotansimha/graphql-code-generator/pull/10323) [`f3cf4df`](https://github.com/dotansimha/graphql-code-generator/commit/f3cf4df358a896c5df0a7d8909c2fbf192e10c01) Thanks [@eddeee888](https://github.com/eddeee888)! - Add support for `nullability.errorHandlingClient`. This allows clients to get stronger types with [semantic nullability](https://github.com/graphql/graphql-wg/blob/main/rfcs/SemanticNullability.md)-enabled schemas.\n\n### Patch Changes\n\n- Updated dependencies [[`f6909d1`](https://github.com/dotansimha/graphql-code-generator/commit/f6909d1797c15b79a0afb7ec089471763a485bfc), [`f3cf4df`](https://github.com/dotansimha/graphql-code-generator/commit/f3cf4df358a896c5df0a7d8909c2fbf192e10c01)]:\n  - @graphql-codegen/visitor-plugin-common@5.8.0\n  - @graphql-codegen/typescript-operations@4.6.0\n  - @graphql-codegen/gql-tag-operations@4.0.17\n  - @graphql-codegen/typed-document-node@5.1.1\n  - @graphql-codegen/typescript@4.1.6\n\n## 4.7.0\n\n### Minor Changes\n\n- [#10307](https://github.com/dotansimha/graphql-code-generator/pull/10307) [`bfe3c75`](https://github.com/dotansimha/graphql-code-generator/commit/bfe3c7575e0b5f3a252fe9d72416f7829e44c885) Thanks [@mvantellingen](https://github.com/mvantellingen)! - Update generated code to be compatible with TypeScript 5.8 `erasableSyntaxOnly` flag\n\n### Patch Changes\n\n- Updated dependencies [[`bfe3c75`](https://github.com/dotansimha/graphql-code-generator/commit/bfe3c7575e0b5f3a252fe9d72416f7829e44c885)]:\n  - @graphql-codegen/typed-document-node@5.1.0\n\n## 4.6.4\n\n### Patch Changes\n\n- [#10302](https://github.com/dotansimha/graphql-code-generator/pull/10302) [`d8566c0`](https://github.com/dotansimha/graphql-code-generator/commit/d8566c015943ea4dbcaeaf57d3d8406553ae230a) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix Apollo unmask directive incorrectly generating fragmentRefs\n\n- Updated dependencies [[`d8566c0`](https://github.com/dotansimha/graphql-code-generator/commit/d8566c015943ea4dbcaeaf57d3d8406553ae230a)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.1\n  - @graphql-codegen/typescript-operations@4.5.1\n  - @graphql-codegen/gql-tag-operations@4.0.16\n  - @graphql-codegen/typed-document-node@5.0.15\n  - @graphql-codegen/typescript@4.1.5\n\n## 4.6.3\n\n### Patch Changes\n\n- [#10298](https://github.com/dotansimha/graphql-code-generator/pull/10298) [`3efc472`](https://github.com/dotansimha/graphql-code-generator/commit/3efc472b970754b05b1e1f9fe7d33cfa5ec65455) Thanks [@dotansimha](https://github.com/dotansimha)! - Fix a bug where fragment spreads with `@client` directives is not being removed from the generated persisted documents\n\n- Updated dependencies [[`6d7c1d7`](https://github.com/dotansimha/graphql-code-generator/commit/6d7c1d7c0a4662acdc0efafd4234229ad0a8dd3c)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.0\n  - @graphql-codegen/typescript-operations@4.5.0\n  - @graphql-codegen/gql-tag-operations@4.0.15\n  - @graphql-codegen/typed-document-node@5.0.14\n  - @graphql-codegen/typescript@4.1.4\n\n## 4.6.2\n\n### Patch Changes\n\n- [#10280](https://github.com/dotansimha/graphql-code-generator/pull/10280) [`6da52a3`](https://github.com/dotansimha/graphql-code-generator/commit/6da52a3248c0ac9ef32140d130ac3da6fcaa1445) Thanks [@konomae](https://github.com/konomae)! - fix `onlyEnums` passthrough in client-preset\n\n## 4.6.1\n\n### Patch Changes\n\n- Updated dependencies [[`ec07018`](https://github.com/dotansimha/graphql-code-generator/commit/ec070189a1a3c4d41f2457b56a68b506c81f28ba)]:\n  - @graphql-codegen/gql-tag-operations@4.0.14\n\n## 4.6.0\n\n### Minor Changes\n\n- [#10268](https://github.com/dotansimha/graphql-code-generator/pull/10268) [`8737dd8`](https://github.com/dotansimha/graphql-code-generator/commit/8737dd86b4ce3d14234a515fa494736bf7ec35dd) Thanks [@eddeee888](https://github.com/eddeee888)! - Forward customDirectives to support Apollo unmask\n\n- [#10155](https://github.com/dotansimha/graphql-code-generator/pull/10155) [`ed71811`](https://github.com/dotansimha/graphql-code-generator/commit/ed71811ace083be61c575609e361c629ed7c1740) Thanks [@nebbles](https://github.com/nebbles)! - client-preset generated output is configurable with onlyOperationTypes and onlyEnumTypes\n\n### Patch Changes\n\n- Updated dependencies [[`60dd72f`](https://github.com/dotansimha/graphql-code-generator/commit/60dd72fb103fd7fd70b4e1def98da29588865517)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.1\n  - @graphql-codegen/gql-tag-operations@4.0.13\n  - @graphql-codegen/typescript-operations@4.4.1\n  - @graphql-codegen/typed-document-node@5.0.13\n  - @graphql-codegen/typescript@4.1.3\n\n## 4.5.1\n\n### Patch Changes\n\n- [#9981](https://github.com/dotansimha/graphql-code-generator/pull/9981) [`05aa6b4`](https://github.com/dotansimha/graphql-code-generator/commit/05aa6b4cee6214674b25c9d20df27ce5e0e3927c) Thanks [@azu](https://github.com/azu)! - The client preset now allows the use of the `enumsAsConst` config option\n\n- Updated dependencies [[`1617e3c`](https://github.com/dotansimha/graphql-code-generator/commit/1617e3cf38f3059cc5ea88b540033f521f03725a), [`fa64fbf`](https://github.com/dotansimha/graphql-code-generator/commit/fa64fbf8a44e1cee7ae17806dcd178dc7350c4ba)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.0\n  - @graphql-codegen/typescript-operations@4.4.0\n  - @graphql-codegen/gql-tag-operations@4.0.12\n  - @graphql-codegen/typed-document-node@5.0.12\n  - @graphql-codegen/typescript@4.1.2\n\n## 4.5.0\n\n### Minor Changes\n\n- [#10136](https://github.com/dotansimha/graphql-code-generator/pull/10136) [`3fd4486`](https://github.com/dotansimha/graphql-code-generator/commit/3fd4486a548c27099377c7bd696a22d1638227f4) Thanks [@wxt2005](https://github.com/wxt2005)! - foward skipTypeNameForRoot to client-preset\n\n### Patch Changes\n\n- [#10182](https://github.com/dotansimha/graphql-code-generator/pull/10182) [`effd875`](https://github.com/dotansimha/graphql-code-generator/commit/effd875b205fa9c5a99ce5e7fcdeb86cea7723fc) Thanks [@eddeee888](https://github.com/eddeee888)! - Revert slimmer client preset output\n\n- Updated dependencies [[`55a1e9e`](https://github.com/dotansimha/graphql-code-generator/commit/55a1e9e63830df17ed40602ea7e322bbf48b17bc), [`a235051`](https://github.com/dotansimha/graphql-code-generator/commit/a23505180ac2f275a55ece27162ec9bfcdc52e03), [`c7af639`](https://github.com/dotansimha/graphql-code-generator/commit/c7af63964089938150402db69d49f11f93bb5175)]:\n  - @graphql-codegen/visitor-plugin-common@5.5.0\n  - @graphql-codegen/plugin-helpers@5.1.0\n  - @graphql-codegen/typed-document-node@5.0.11\n  - @graphql-codegen/gql-tag-operations@4.0.11\n  - @graphql-codegen/typescript-operations@4.3.1\n  - @graphql-codegen/typescript@4.1.1\n\n## 4.4.0\n\n### Minor Changes\n\n- [#10073](https://github.com/dotansimha/graphql-code-generator/pull/10073) [`8471a18`](https://github.com/dotansimha/graphql-code-generator/commit/8471a180cd61dc03dedace87876c5973b09b35f8) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Reduce noise of generated code by only generating code relevant to GraphQL operations.\n\n### Patch Changes\n\n- [#10075](https://github.com/dotansimha/graphql-code-generator/pull/10075) [`67e7556`](https://github.com/dotansimha/graphql-code-generator/commit/67e75561a3e862f26cfbb40e8ec5a08f821f9ddf) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Add note about enabling bundle size reduction for the generated `graphql` tag file.\n\n- Updated dependencies [[`67e7556`](https://github.com/dotansimha/graphql-code-generator/commit/67e75561a3e862f26cfbb40e8ec5a08f821f9ddf), [`3f4f546`](https://github.com/dotansimha/graphql-code-generator/commit/3f4f5466ff168ad822b9a00d83d3779078e6d8c4)]:\n  - @graphql-codegen/gql-tag-operations@4.0.10\n  - @graphql-codegen/visitor-plugin-common@5.4.0\n  - @graphql-codegen/typescript-operations@4.3.0\n  - @graphql-codegen/typescript@4.1.0\n  - @graphql-codegen/typed-document-node@5.0.10\n\n## 4.3.3\n\n### Patch Changes\n\n- [#9817](https://github.com/dotansimha/graphql-code-generator/pull/9817) [`7ac42a3`](https://github.com/dotansimha/graphql-code-generator/commit/7ac42a33915985b9504bc16f38a22e057bbcd1ab) Thanks [@nikitalocalhost](https://github.com/nikitalocalhost)! - Resolve runtime error when using the babel plugin within an ESM environment.\n\n## 4.3.2\n\n### Patch Changes\n\n- Updated dependencies [[`79fee3c`](https://github.com/dotansimha/graphql-code-generator/commit/79fee3cada20d683d250aad5aa5fef9d6ed9f4d2)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.1\n  - @graphql-codegen/gql-tag-operations@4.0.9\n  - @graphql-codegen/typescript-operations@4.2.3\n  - @graphql-codegen/typed-document-node@5.0.9\n  - @graphql-codegen/typescript@4.0.9\n\n## 4.3.1\n\n### Patch Changes\n\n- Updated dependencies [[`808ada5`](https://github.com/dotansimha/graphql-code-generator/commit/808ada595d83d39cad045da5824cac6378e9eca3), [`14ce39e`](https://github.com/dotansimha/graphql-code-generator/commit/14ce39e41dfee38c652be736664177fa2b1df421)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.0\n  - @graphql-codegen/gql-tag-operations@4.0.8\n  - @graphql-codegen/typescript-operations@4.2.2\n  - @graphql-codegen/typed-document-node@5.0.8\n  - @graphql-codegen/typescript@4.0.8\n\n## 4.3.0\n\n### Minor Changes\n\n- [#10001](https://github.com/dotansimha/graphql-code-generator/pull/10001) [`1be6e65`](https://github.com/dotansimha/graphql-code-generator/commit/1be6e65943b85162f3d465189d0a6df4b962df5d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Support discriminating `null` and `undefined` within the `useFragment` function.\n\n  ```ts\n  function MyComponent(props: FragmentType<typeof MyFragment> | null) {\n    const data = useFragment(MyFragment, props)\n    // data is `MyFragment | null`\n  }\n\n  function MyComponent(props: FragmentType<typeof MyFragment> | undefined) {\n    const data = useFragment(MyFragment, props)\n    // data is `MyFragment | undefined`\n  }\n  ```\n\n  Before, the returned type from `useFragment` was always `TType | null | undefined`.\n\n- [#9804](https://github.com/dotansimha/graphql-code-generator/pull/9804) [`5e594ef`](https://github.com/dotansimha/graphql-code-generator/commit/5e594ef8f39b9e1036b6bcaa977f914a66fec03e) Thanks [@rachel-church](https://github.com/rachel-church)! - Preserving `Array<T>` or `ReadonlyArray<T>` in `useFragment()` return type.\n\n### Patch Changes\n\n- [#9996](https://github.com/dotansimha/graphql-code-generator/pull/9996) [`99f449c`](https://github.com/dotansimha/graphql-code-generator/commit/99f449c8dcd645d49eda26e4ddfcb8ad7056ecbf) Thanks [@nahn20](https://github.com/nahn20)! - Added configuration to allow for custom hash functions for persisted documents in the client preset\n\n  ### Example\n\n  ```ts filename=\"codegen.ts\" {10-12}\n  import { type CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'schema.graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        presetConfig: {\n          persistedDocuments: {\n            hashAlgorithm: operation => {\n              const shasum = crypto.createHash('sha512')\n              shasum.update(operation)\n              return shasum.digest('hex')\n            }\n          }\n        }\n      }\n    }\n  }\n  ```\n\n- Updated dependencies [[`5501c62`](https://github.com/dotansimha/graphql-code-generator/commit/5501c621f19eb5ef8e703a21f7367e07e41f199c)]:\n  - @graphql-codegen/add@5.0.3\n\n## 4.2.6\n\n### Patch Changes\n\n- Updated dependencies [[`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`156cc2b`](https://github.com/dotansimha/graphql-code-generator/commit/156cc2b9a2a5129beba121cfa987b04e29899431), [`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`b49457b`](https://github.com/dotansimha/graphql-code-generator/commit/b49457b5f29328d2dc23c642788a2e697cb8966e)]:\n  - @graphql-codegen/plugin-helpers@5.0.4\n  - @graphql-codegen/visitor-plugin-common@5.2.0\n  - @graphql-codegen/gql-tag-operations@4.0.7\n  - @graphql-codegen/typescript-operations@4.2.1\n  - @graphql-codegen/typed-document-node@5.0.7\n  - @graphql-codegen/typescript@4.0.7\n\n## 4.2.5\n\n### Patch Changes\n\n- [#9889](https://github.com/dotansimha/graphql-code-generator/pull/9889) [`cd60e14`](https://github.com/dotansimha/graphql-code-generator/commit/cd60e14c4dc5a496a93089dae677fc797c04671e) Thanks [@Sojaner](https://github.com/Sojaner)! - Omit `__typename` from being added on the root node of a subscription when using `addTypenameSelectionDocumentTransform` with documentTransforms since a single root node is expected and the code generator fails because of that (refer to https://spec.graphql.org/draft/#sec-Single-root-field)\n\n## 4.2.4\n\n### Patch Changes\n\n- Updated dependencies [[`920b443`](https://github.com/dotansimha/graphql-code-generator/commit/920b443a401b8cc4811f64ec5b25fc7b4ae32b53), [`ed9c205`](https://github.com/dotansimha/graphql-code-generator/commit/ed9c205d15d7f14ed73e54aecf40e4fad5664e9d)]:\n  - @graphql-codegen/visitor-plugin-common@5.1.0\n  - @graphql-codegen/typescript-operations@4.2.0\n  - @graphql-codegen/gql-tag-operations@4.0.6\n  - @graphql-codegen/typed-document-node@5.0.6\n  - @graphql-codegen/typescript@4.0.6\n\n## 4.2.3\n\n### Patch Changes\n\n- Updated dependencies [[`53f270a`](https://github.com/dotansimha/graphql-code-generator/commit/53f270acfa1da992e0f9d2e50921bb588392f8a5)]:\n  - @graphql-codegen/visitor-plugin-common@5.0.0\n  - @graphql-codegen/gql-tag-operations@4.0.5\n  - @graphql-codegen/typescript-operations@4.1.3\n  - @graphql-codegen/typed-document-node@5.0.5\n  - @graphql-codegen/typescript@4.0.5\n\n## 4.2.2\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.2\n  - @graphql-codegen/typescript-operations@4.1.2\n  - @graphql-codegen/add@5.0.2\n  - @graphql-codegen/gql-tag-operations@4.0.4\n  - @graphql-codegen/typed-document-node@5.0.4\n  - @graphql-codegen/typescript@4.0.4\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 4.2.1\n\n### Patch Changes\n\n- [#9557](https://github.com/dotansimha/graphql-code-generator/pull/9557) [`48ddaeae1`](https://github.com/dotansimha/graphql-code-generator/commit/48ddaeae1809cb52e6de5aa14f0d47bedde9d547) Thanks [@konomae](https://github.com/konomae)! - Add eslint-disable comment to fragment-masking.ts\n\n- Updated dependencies [[`7718a8113`](https://github.com/dotansimha/graphql-code-generator/commit/7718a8113dc6282475cb738f1e28698b8221fa2f)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.1\n  - @graphql-codegen/gql-tag-operations@4.0.3\n  - @graphql-codegen/typescript-operations@4.1.1\n  - @graphql-codegen/typed-document-node@5.0.3\n  - @graphql-codegen/typescript@4.0.3\n\n## 4.2.0\n\n### Minor Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - The client preset now allows the use of the `futureProofEnums` config option\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/add@5.0.1\n  - @graphql-codegen/gql-tag-operations@4.0.2\n  - @graphql-codegen/plugin-helpers@5.0.2\n  - @graphql-codegen/typed-document-node@5.0.2\n  - @graphql-codegen/typescript@4.0.2\n  - @graphql-codegen/typescript-operations@4.1.0\n  - @graphql-codegen/visitor-plugin-common@4.1.0\n\n## 4.1.0\n\n### Minor Changes\n\n- [#9562](https://github.com/dotansimha/graphql-code-generator/pull/9562) [`5beee9794`](https://github.com/dotansimha/graphql-code-generator/commit/5beee9794de208fed17e516a259535f56d626c9d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Add the `addTypenameSelectionDocumentTransform` for automatically adding `__typename` selections to all objct type selection sets.\n\n  This is useful for GraphQL Clients such as Apollo Client or urql that need typename information for their cache to function.\n\n  **Example Usage**\n\n  ```\n  import { addTypenameSelectionDocumentTransform } from '@graphql-codegen/client-preset';\n  import { CodegenConfig } from \"@graphql-codegen/cli\";\n\n  const config: CodegenConfig = {\n    schema: \"YOUR_GRAPHQL_ENDPOINT\",\n    documents: [\"./**/*.{ts,tsx}\"],\n    ignoreNoDocuments: true,\n    generates: {\n      \"./gql/\": {\n        preset: \"client\",\n        plugins: [],\n        presetConfig: {\n          persistedDocuments: true,\n        },\n        documentTransforms: [addTypenameSelectionDocumentTransform],\n      },\n    },\n  };\n\n  export default config;\n  ```\n\n### Patch Changes\n\n- Updated dependencies [[`bb1e0e96e`](https://github.com/dotansimha/graphql-code-generator/commit/bb1e0e96ed9d519684630cd7ea53869b48b4632e)]:\n  - @graphql-codegen/plugin-helpers@5.0.1\n\n## 4.0.1\n\n### Patch Changes\n\n- [#9497](https://github.com/dotansimha/graphql-code-generator/pull/9497) [`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a) Thanks [@eddeee888](https://github.com/eddeee888)! - Revert default ID scalar input type to string\n\n  We changed the ID Scalar input type from `string` to `string | number` in the latest major version of `typescript` plugin. This causes issues for server plugins (e.g. typescript-resolvers) that depends on `typescript` plugin. This is because the scalar type needs to be manually inverted on setup which is confusing.\n\n- Updated dependencies [[`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a)]:\n  - @graphql-codegen/visitor-plugin-common@4.0.1\n  - @graphql-codegen/typescript-operations@4.0.1\n  - @graphql-codegen/typescript@4.0.1\n  - @graphql-codegen/gql-tag-operations@4.0.1\n  - @graphql-codegen/typed-document-node@5.0.1\n\n## 4.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Minor Changes\n\n- [#9196](https://github.com/dotansimha/graphql-code-generator/pull/9196) [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96) Thanks [@beerose](https://github.com/beerose)! - Add `@defer` directive support\n\n  When a query includes a deferred fragment field, the server will return a partial response with the non-deferred fields first, followed by the remaining fields once they have been resolved.\n\n  Once start using the `@defer` directive in your queries, the generated code will automatically include support for the directive.\n\n  ```jsx\n  // src/index.tsx\n  import { graphql } from './gql'\n  const OrdersFragment = graphql(`\n    fragment OrdersFragment on User {\n      orders {\n        id\n        total\n      }\n    }\n  `)\n  const GetUserQuery = graphql(`\n    query GetUser($id: ID!) {\n      user(id: $id) {\n        id\n        name\n        ...OrdersFragment @defer\n      }\n    }\n  `)\n  ```\n\n  The generated type for `GetUserQuery` will have information that the fragment is _incremental,_ meaning it may not be available right away.\n\n  ```tsx\n  // gql/graphql.ts\n  export type GetUserQuery = { __typename?: 'Query'; id: string; name: string } & ({\n    __typename?: 'Query'\n  } & {\n    ' $fragmentRefs'?: { OrdersFragment: Incremental<OrdersFragment> }\n  })\n  ```\n\n  Apart from generating code that includes support for the `@defer` directive, the Codegen also exports a utility function called `isFragmentReady`. You can use it to conditionally render components based on whether the data for a deferred\n  fragment is available:\n\n  ```jsx\n  const OrdersList = (props: { data: FragmentType<typeof OrdersFragment> }) => {\n    const data = useFragment(OrdersFragment, props.data);\n    return (\n      // render orders list\n    )\n  };\n\n  function App() {\n    const { data } = useQuery(GetUserQuery);\n    return (\n      {data && (\n        <>\n          {isFragmentReady(GetUserQuery, OrdersFragment, data)\n  \t\t\t\t\t&& <OrdersList data={data} />}\n        </>\n      )}\n    );\n  }\n  export default App;\n  ```\n\n- [#9353](https://github.com/dotansimha/graphql-code-generator/pull/9353) [`d7e335b58`](https://github.com/dotansimha/graphql-code-generator/commit/d7e335b5874a821c9f609c66d554921ed8c6de19) Thanks [@charpeni](https://github.com/charpeni)! - Implement the ability the specify the hash algorithm used for persisted documents via `persistedDocuments.hashAlgorithm`\n\n### Patch Changes\n\n- [#9449](https://github.com/dotansimha/graphql-code-generator/pull/9449) [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n\n  - Updated dependency [`@graphql-tools/documents@^1.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/documents/v/1.0.0) (from `^0.1.0`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/utils@^10.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.0.0) (from `^9.0.0`, in `dependencies`)\n\n- [#9315](https://github.com/dotansimha/graphql-code-generator/pull/9315) [`6d2de206a`](https://github.com/dotansimha/graphql-code-generator/commit/6d2de206abdcce9e176bbc157cd27b37a20b0f97) Thanks [@luvejo](https://github.com/luvejo)! - improve error message\n\n- [#9385](https://github.com/dotansimha/graphql-code-generator/pull/9385) [`a7dda3546`](https://github.com/dotansimha/graphql-code-generator/commit/a7dda3546567b5bb70015fc3ae197562231d7911) Thanks [@beerose](https://github.com/beerose)! - Improve isFragmentReady utility function to work with noUncheckedIndexedAccess TSC setting\n\n- [#9196](https://github.com/dotansimha/graphql-code-generator/pull/9196) [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96) Thanks [@beerose](https://github.com/beerose)! - Pass `emitLegacyCommonJSImports` and `isStringDocumentMode` to the client preset config\n\n- [#9414](https://github.com/dotansimha/graphql-code-generator/pull/9414) [`ca02ad172`](https://github.com/dotansimha/graphql-code-generator/commit/ca02ad172a0e8f52570fdef4271ec286d883236d) Thanks [@beerose](https://github.com/beerose)! - Include nested fragments in string documentMode\n\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96), [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`50471e651`](https://github.com/dotansimha/graphql-code-generator/commit/50471e6514557db827cd26157262401c6c600a8c), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c), [`ca02ad172`](https://github.com/dotansimha/graphql-code-generator/commit/ca02ad172a0e8f52570fdef4271ec286d883236d), [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0), [`5950f5a68`](https://github.com/dotansimha/graphql-code-generator/commit/5950f5a6843cdd92b9d5b8ced3a97b68eadf9f30), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c)]:\n  - @graphql-codegen/gql-tag-operations@4.0.0\n  - @graphql-codegen/plugin-helpers@5.0.0\n  - @graphql-codegen/visitor-plugin-common@4.0.0\n  - @graphql-codegen/typed-document-node@5.0.0\n  - @graphql-codegen/typescript-operations@4.0.0\n  - @graphql-codegen/typescript@4.0.0\n  - @graphql-codegen/add@5.0.0\n\n## 3.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`386cf9044`](https://github.com/dotansimha/graphql-code-generator/commit/386cf9044a41d87ed45069b22d26b30f4b262a85), [`402cb8ac0`](https://github.com/dotansimha/graphql-code-generator/commit/402cb8ac0f0c347b186d295c4b69c19e25a65d00)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.1\n  - @graphql-codegen/gql-tag-operations@3.0.1\n  - @graphql-codegen/typescript-operations@3.0.4\n  - @graphql-codegen/typed-document-node@4.0.1\n  - @graphql-codegen/typescript@3.0.4\n\n## 3.0.0\n\n### Major Changes\n\n- [#9137](https://github.com/dotansimha/graphql-code-generator/pull/9137) [`2256c8b5d`](https://github.com/dotansimha/graphql-code-generator/commit/2256c8b5d0e13057d35692bbeba3b7b8f94d8712) Thanks [@beerose](https://github.com/beerose)! - Add `TypedDocumentNode` string alternative that doesn't require GraphQL AST on the client. This change requires `@graphql-typed-document-node/core` in version `3.2.0` or higher.\n\n### Patch Changes\n\n- [#9137](https://github.com/dotansimha/graphql-code-generator/pull/9137) [`2256c8b5d`](https://github.com/dotansimha/graphql-code-generator/commit/2256c8b5d0e13057d35692bbeba3b7b8f94d8712) Thanks [@beerose](https://github.com/beerose)! - dependencies updates:\n  - Updated dependency [`@graphql-typed-document-node/core@3.2.0` ↗︎](https://www.npmjs.com/package/@graphql-typed-document-node/core/v/3.2.0) (from `3.1.2`, in `dependencies`)\n- Updated dependencies [[`e56790104`](https://github.com/dotansimha/graphql-code-generator/commit/e56790104ae56d6c5b48ef71823345bd09d3b835), [`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29), [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087), [`92d86b009`](https://github.com/dotansimha/graphql-code-generator/commit/92d86b009579edf70f60b0b8e28658af93ff9fd1), [`2256c8b5d`](https://github.com/dotansimha/graphql-code-generator/commit/2256c8b5d0e13057d35692bbeba3b7b8f94d8712), [`acb647e4e`](https://github.com/dotansimha/graphql-code-generator/commit/acb647e4efbddecf732b6e55dc47ac40c9bdaf08), [`9f4d9c5a4`](https://github.com/dotansimha/graphql-code-generator/commit/9f4d9c5a479d34da25df8e060a8c2b3b162647dd)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.0\n  - @graphql-codegen/plugin-helpers@4.2.0\n  - @graphql-codegen/typescript@3.0.3\n  - @graphql-codegen/typed-document-node@4.0.0\n  - @graphql-codegen/gql-tag-operations@3.0.0\n  - @graphql-codegen/typescript-operations@3.0.3\n\n## 2.1.1\n\n### Patch Changes\n\n- [#9049](https://github.com/dotansimha/graphql-code-generator/pull/9049) [`9430c3811`](https://github.com/dotansimha/graphql-code-generator/commit/9430c38111579c8c0023cbabfae047156ae2df42) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`@graphql-typed-document-node/core@3.1.2` ↗︎](https://www.npmjs.com/package/@graphql-typed-document-node/core/v/3.1.2) (from `3.1.1`, in `dependencies`)\n- Updated dependencies [[`ba0610bbd`](https://github.com/dotansimha/graphql-code-generator/commit/ba0610bbd4578d8a82078014766f56d8ae5fcf7a), [`4b49f6fbe`](https://github.com/dotansimha/graphql-code-generator/commit/4b49f6fbed802907b460bfb7b6e9a85f88c555bc), [`b343626c9`](https://github.com/dotansimha/graphql-code-generator/commit/b343626c978b9ee0f14e314cea6c01ae3dad057c)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.2\n  - @graphql-codegen/gql-tag-operations@2.0.2\n  - @graphql-codegen/typescript-operations@3.0.2\n  - @graphql-codegen/typed-document-node@3.0.2\n  - @graphql-codegen/typescript@3.0.2\n\n## 2.1.0\n\n### Minor Changes\n\n- [#8893](https://github.com/dotansimha/graphql-code-generator/pull/8893) [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c) Thanks [@n1ru4l](https://github.com/n1ru4l)! - It is no longer mandatory to declare an empty plugins array when using a preset\n\n- [#8723](https://github.com/dotansimha/graphql-code-generator/pull/8723) [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15) Thanks [@kazekyo](https://github.com/kazekyo)! - Introduce a new feature called DocumentTransform.\n\n  DocumentTransform is a functionality that allows you to modify `documents` before they are processed by plugins. You can use functions passed to the `documentTransforms` option to make changes to GraphQL documents.\n\n  To use this feature, you can write `documentTransforms` as follows:\n\n  ```ts\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: [\n          {\n            transform: ({ documents }) => {\n              // Make some changes to the documents\n              return documents\n            }\n          }\n        ]\n      }\n    }\n  }\n  export default config\n  ```\n\n  For instance, to remove a `@localOnlyDirective` directive from `documents`, you can write the following code:\n\n  ```js\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n  import { visit } from 'graphql'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: [\n          {\n            transform: ({ documents }) => {\n              return documents.map(documentFile => {\n                documentFile.document = visit(documentFile.document, {\n                  Directive: {\n                    leave(node) {\n                      if (node.name.value === 'localOnlyDirective') return null\n                    }\n                  }\n                })\n                return documentFile\n              })\n            }\n          }\n        ]\n      }\n    }\n  }\n  export default config\n  ```\n\n  DocumentTransform can also be specified by file name. You can create a custom file for a specific transformation and pass it to `documentTransforms`.\n\n  Let's create the document transform as a file:\n\n  ```js\n  module.exports = {\n    transform: ({ documents }) => {\n      // Make some changes to the documents\n      return documents\n    }\n  }\n  ```\n\n  Then, you can specify the file name as follows:\n\n  ```ts\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: ['./my-document-transform.js']\n      }\n    }\n  }\n  export default config\n  ```\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n\n- [#8995](https://github.com/dotansimha/graphql-code-generator/pull/8995) [`fe2e9c7a5`](https://github.com/dotansimha/graphql-code-generator/commit/fe2e9c7a5f2731e06dd285e391936608dfa3fb51) Thanks [@charpeni](https://github.com/charpeni)! - Use `gqlTagName` for generated examples\n\n- [#8971](https://github.com/dotansimha/graphql-code-generator/pull/8971) [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Allow passing fragment documents to APIs like Apollos `readFragment`\n\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`fe2e9c7a5`](https://github.com/dotansimha/graphql-code-generator/commit/fe2e9c7a5f2731e06dd285e391936608dfa3fb51), [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098), [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/add@4.0.1\n  - @graphql-codegen/gql-tag-operations@2.0.1\n  - @graphql-codegen/plugin-helpers@4.1.0\n  - @graphql-codegen/typed-document-node@3.0.1\n  - @graphql-codegen/typescript@3.0.1\n  - @graphql-codegen/typescript-operations@3.0.1\n  - @graphql-codegen/visitor-plugin-common@3.0.1\n\n## 2.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n\n  - Updated dependency [`@babel/helper-plugin-utils@^7.20.2` ↗︎](https://www.npmjs.com/package/@babel/helper-plugin-utils/v/7.20.2) (from `^7.14.5`, in `dependencies`)\n  - Updated dependency [`@babel/template@^7.20.7` ↗︎](https://www.npmjs.com/package/@babel/template/v/7.20.7) (from `^7.15.4`, in `dependencies`)\n\n- [#8871](https://github.com/dotansimha/graphql-code-generator/pull/8871) [`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5) Thanks [@B2o5T](https://github.com/B2o5T)! - eslint fixes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.0\n  - @graphql-codegen/plugin-helpers@4.0.0\n  - @graphql-codegen/add@4.0.0\n  - @graphql-codegen/gql-tag-operations@2.0.0\n  - @graphql-codegen/typescript-operations@3.0.0\n  - @graphql-codegen/typed-document-node@3.0.0\n  - @graphql-codegen/typescript@3.0.0\n\n## 1.3.0\n\n### Minor Changes\n\n- [#8757](https://github.com/dotansimha/graphql-code-generator/pull/8757) [`4f290aa72`](https://github.com/dotansimha/graphql-code-generator/commit/4f290aa7279a05ffa40920c1c9e5e5b37c164335) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Add support for persisted documents.\n\n  You can now generate and embed a persisted documents hash for the executable documents.\n\n  ```ts\n  /** codegen.ts */\n  import { CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'https://graphql.org/graphql/',\n    documents: ['src/**/*.tsx'],\n    ignoreNoDocuments: true, // for better experience with the watcher\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        plugins: [],\n        presetConfig: {\n          persistedDocuments: true\n        }\n      }\n    }\n  }\n\n  export default config\n  ```\n\n  This will generate `./src/gql/persisted-documents.json` (dictionary of hashes with their operation string).\n\n  In addition to that each generated document node will have a `__meta__.hash` property.\n\n  ```ts\n  import { gql } from './gql.js'\n\n  const allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n    query allFilmsWithVariablesQuery($first: Int!) {\n      allFilms(first: $first) {\n        edges {\n          node {\n            ...FilmItem\n          }\n        }\n      }\n    }\n  `)\n\n  console.log((allFilmsWithVariablesQueryDocument as any)['__meta__']['hash'])\n  ```\n\n- [#8757](https://github.com/dotansimha/graphql-code-generator/pull/8757) [`4f290aa72`](https://github.com/dotansimha/graphql-code-generator/commit/4f290aa7279a05ffa40920c1c9e5e5b37c164335) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Add support for embedding metadata in the document AST.\n\n  It is now possible to embed metadata (e.g. for your GraphQL client within the emitted code).\n\n  ```ts\n  /** codegen.ts */\n  import { CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'https://graphql.org/graphql/',\n    documents: ['src/**/*.tsx'],\n    ignoreNoDocuments: true, // for better experience with the watcher\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        plugins: [],\n        presetConfig: {\n          onExecutableDocumentNode(documentNode) {\n            return {\n              operation: documentNode.definitions[0].operation,\n              name: documentNode.definitions[0].name.value\n            }\n          }\n        }\n      }\n    }\n  }\n\n  export default config\n  ```\n\n  You can then access the metadata via the `__meta__` property on the document node.\n\n  ```ts\n  import { gql } from './gql.js'\n\n  const allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n    query allFilmsWithVariablesQuery($first: Int!) {\n      allFilms(first: $first) {\n        edges {\n          node {\n            ...FilmItem\n          }\n        }\n      }\n    }\n  `)\n\n  console.log((allFilmsWithVariablesQueryDocument as any)['__meta__'])\n  ```\n\n### Patch Changes\n\n- [#8757](https://github.com/dotansimha/graphql-code-generator/pull/8757) [`4f290aa72`](https://github.com/dotansimha/graphql-code-generator/commit/4f290aa7279a05ffa40920c1c9e5e5b37c164335) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n  - Added dependency [`@graphql-tools/documents@^0.1.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/documents/v/0.1.0) (to `dependencies`)\n- Updated dependencies [[`a98198524`](https://github.com/dotansimha/graphql-code-generator/commit/a9819852443884b43de7c15040ccffc205f9177a)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.8\n  - @graphql-codegen/gql-tag-operations@1.6.2\n  - @graphql-codegen/typescript-operations@2.5.13\n  - @graphql-codegen/typed-document-node@2.3.13\n  - @graphql-codegen/typescript@2.8.8\n\n## 1.2.6\n\n### Patch Changes\n\n- [#8796](https://github.com/dotansimha/graphql-code-generator/pull/8796) [`902451601`](https://github.com/dotansimha/graphql-code-generator/commit/902451601b5edf9cb7768e57f332fe6ade79c20a) Thanks [@shmax](https://github.com/shmax)! - remove extra asterisk and add missing semicolon in generated output\n\n- Updated dependencies [[`902451601`](https://github.com/dotansimha/graphql-code-generator/commit/902451601b5edf9cb7768e57f332fe6ade79c20a)]:\n  - @graphql-codegen/gql-tag-operations@1.6.1\n\n## 1.2.5\n\n### Patch Changes\n\n- Updated dependencies [[`eb454d06c`](https://github.com/dotansimha/graphql-code-generator/commit/eb454d06c977f11f7d4a7b0b07eb80f8fd590560), [`2a33fc774`](https://github.com/dotansimha/graphql-code-generator/commit/2a33fc7741f7a9532bef68606666d4e3db7785a3)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.7\n  - @graphql-codegen/gql-tag-operations@1.6.0\n  - @graphql-codegen/typescript-operations@2.5.12\n  - @graphql-codegen/typed-document-node@2.3.12\n  - @graphql-codegen/typescript@2.8.7\n\n## 1.2.4\n\n### Patch Changes\n\n- [#8771](https://github.com/dotansimha/graphql-code-generator/pull/8771) [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`@graphql-tools/utils@^9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/9.0.0) (from `^8.8.0`, in `dependencies`)\n\n- [#8752](https://github.com/dotansimha/graphql-code-generator/pull/8752) [`cbca5a7ea`](https://github.com/dotansimha/graphql-code-generator/commit/cbca5a7ea3591f7ccf42399842cddb3581b40cf7) Thanks [@pbrink231](https://github.com/pbrink231)! - add typescript `avoidOptionals` to forwarded config\n\n- Updated dependencies [[`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`6c6b6f2df`](https://github.com/dotansimha/graphql-code-generator/commit/6c6b6f2df88a3a37b437a25320dab5590f033316)]:\n  - @graphql-codegen/gql-tag-operations@1.5.12\n  - @graphql-codegen/plugin-helpers@3.1.2\n  - @graphql-codegen/visitor-plugin-common@2.13.6\n  - @graphql-codegen/typescript-operations@2.5.11\n  - @graphql-codegen/typed-document-node@2.3.11\n  - @graphql-codegen/typescript@2.8.6\n\n## 1.2.3\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81), [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n  - @graphql-codegen/add@3.2.3\n  - @graphql-codegen/visitor-plugin-common@2.13.5\n  - @graphql-codegen/gql-tag-operations@1.5.11\n  - @graphql-codegen/typescript-operations@2.5.10\n  - @graphql-codegen/typed-document-node@2.3.10\n  - @graphql-codegen/typescript@2.8.5\n\n## 1.2.2\n\n### Patch Changes\n\n- [#8702](https://github.com/dotansimha/graphql-code-generator/pull/8702) [`0eb0dde8a`](https://github.com/dotansimha/graphql-code-generator/commit/0eb0dde8a0eb89805711287798561a0b14b6dd59) Thanks [@ithinkdancan](https://github.com/ithinkdancan)! - add config for nonOptionalTypename\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n  - @graphql-codegen/typed-document-node@2.3.9\n  - @graphql-codegen/visitor-plugin-common@2.13.4\n  - @graphql-codegen/add@3.2.2\n  - @graphql-codegen/gql-tag-operations@1.5.10\n  - @graphql-codegen/typescript-operations@2.5.9\n  - @graphql-codegen/typescript@2.8.4\n\n## 1.2.1\n\n### Patch Changes\n\n- Updated dependencies [[`62f655452`](https://github.com/dotansimha/graphql-code-generator/commit/62f6554520955dd675e11c920f35ef9bf0aaeffe)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.3\n  - @graphql-codegen/typescript-operations@2.5.8\n  - @graphql-codegen/gql-tag-operations@1.5.9\n  - @graphql-codegen/typed-document-node@2.3.8\n  - @graphql-codegen/typescript@2.8.3\n\n## 1.2.0\n\n### Minor Changes\n\n- [#8657](https://github.com/dotansimha/graphql-code-generator/pull/8657) [`4b96035a8`](https://github.com/dotansimha/graphql-code-generator/commit/4b96035a8e0abca6715db586e8915ae968c403c6) Thanks [@charlypoly](https://github.com/charlypoly)! - Export a testing helper: `makeFragmentData(data, fragment)`\n\n## 1.1.5\n\n### Patch Changes\n\n- Updated dependencies [[`00ddc9368`](https://github.com/dotansimha/graphql-code-generator/commit/00ddc9368211a4511b9f80d543d57c85fff840cb)]:\n  - @graphql-codegen/gql-tag-operations@1.5.8\n\n## 1.1.4\n\n### Patch Changes\n\n- Updated dependencies [[`ef4c2c9c2`](https://github.com/dotansimha/graphql-code-generator/commit/ef4c2c9c233c68830f10eb4c167c7cceead27122)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.2\n  - @graphql-codegen/typescript@2.8.2\n  - @graphql-codegen/gql-tag-operations@1.5.7\n  - @graphql-codegen/typescript-operations@2.5.7\n  - @graphql-codegen/typed-document-node@2.3.7\n\n## 1.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.1\n  - @graphql-codegen/plugin-helpers@2.7.2\n  - @graphql-codegen/gql-tag-operations@1.5.6\n  - @graphql-codegen/typescript-operations@2.5.6\n  - @graphql-codegen/typed-document-node@2.3.6\n  - @graphql-codegen/typescript@2.8.1\n\n## 1.1.2\n\n### Patch Changes\n\n- [#8545](https://github.com/dotansimha/graphql-code-generator/pull/8545) [`3e7792486`](https://github.com/dotansimha/graphql-code-generator/commit/3e7792486e088a0dc10a0e3e4f5e0dff2ca031de) Thanks [@tojump](https://github.com/tojump)! - Forward dedupeFragments config option\n\n## 1.1.1\n\n### Patch Changes\n\n- [#8523](https://github.com/dotansimha/graphql-code-generator/pull/8523) [`3a3202fbb`](https://github.com/dotansimha/graphql-code-generator/commit/3a3202fbb671617d34075040e7aa8129650bbcb1) Thanks [@charlypoly](https://github.com/charlypoly)! - allow non-typescript plugins\n\n## 1.1.0\n\n### Minor Changes\n\n- [#8498](https://github.com/dotansimha/graphql-code-generator/pull/8498) [`a46b8d99c`](https://github.com/dotansimha/graphql-code-generator/commit/a46b8d99c797283d773ec14163c62be9c84d4c2b) Thanks [@charlypoly](https://github.com/charlypoly)! - Fragment masking ` $fragmentName` and ` $fragmentRefs` are optionals\n\n### Patch Changes\n\n- [#8500](https://github.com/dotansimha/graphql-code-generator/pull/8500) [`71aae7a92`](https://github.com/dotansimha/graphql-code-generator/commit/71aae7a92f77ec5ce29631b292d84e066219ea35) Thanks [@charlypoly](https://github.com/charlypoly)! - Add warning and errors to prevent unwanted configuration\n\n- Updated dependencies [[`a46b8d99c`](https://github.com/dotansimha/graphql-code-generator/commit/a46b8d99c797283d773ec14163c62be9c84d4c2b)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.0\n  - @graphql-codegen/gql-tag-operations@1.5.5\n  - @graphql-codegen/typescript-operations@2.5.5\n  - @graphql-codegen/typed-document-node@2.3.5\n  - @graphql-codegen/typescript@2.7.5\n\n## 1.0.7\n\n### Patch Changes\n\n- [#8472](https://github.com/dotansimha/graphql-code-generator/pull/8472) [`a08fb6502`](https://github.com/dotansimha/graphql-code-generator/commit/a08fb6502f5dec6babcb78dbecd621f05a3e300c) Thanks [@panusoi](https://github.com/panusoi)! - The client preset now allows the use of the `enumsAsTypes` config option\n\n## 1.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`1bd7f771c`](https://github.com/dotansimha/graphql-code-generator/commit/1bd7f771ccb949a5a37395c7c57cb41c19340714)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.2\n  - @graphql-codegen/gql-tag-operations@1.5.4\n  - @graphql-codegen/typescript-operations@2.5.4\n  - @graphql-codegen/typed-document-node@2.3.4\n  - @graphql-codegen/typescript@2.7.4\n\n## 1.0.5\n\n### Patch Changes\n\n- [#8457](https://github.com/dotansimha/graphql-code-generator/pull/8457) [`126194017`](https://github.com/dotansimha/graphql-code-generator/commit/1261940173b8266d17fa03c1775104aff6086d3c) Thanks [@charlypoly](https://github.com/charlypoly)! - typo in config mapping\n\n## 1.0.4\n\n### Patch Changes\n\n- [#8455](https://github.com/dotansimha/graphql-code-generator/pull/8455) [`d19573d88`](https://github.com/dotansimha/graphql-code-generator/commit/d19573d889513abab77a99d5f75f25612a891446) Thanks [@charlypoly](https://github.com/charlypoly)! - The client preset now allows the use of the following `config`:\n  - `scalars`\n  - `defaultScalarType`\n  - `strictScalars`\n  - `namingConvention`\n  - `useTypeImports`\n  - `skipTypename`\n  - `arrayInputCoercion`\n\n## 1.0.3\n\n### Patch Changes\n\n- [#8443](https://github.com/dotansimha/graphql-code-generator/pull/8443) [`e2d115146`](https://github.com/dotansimha/graphql-code-generator/commit/e2d11514695ca56674983e8b3b7549cd3b440a5d) Thanks [@charlypoly](https://github.com/charlypoly)! - fix(gql-tag-operations): issues with \"no documents\" scenario\n\n- Updated dependencies [[`e2d115146`](https://github.com/dotansimha/graphql-code-generator/commit/e2d11514695ca56674983e8b3b7549cd3b440a5d)]:\n  - @graphql-codegen/gql-tag-operations@1.5.3\n\n## 1.0.2\n\n### Patch Changes\n\n- [#8402](https://github.com/dotansimha/graphql-code-generator/pull/8402) [`a76c606e3`](https://github.com/dotansimha/graphql-code-generator/commit/a76c606e3b631ef903d4066e2643bc7f95457e30) Thanks [@charlypoly](https://github.com/charlypoly)! - dependencies updates:\n\n  - Updated dependency [`@graphql-codegen/gql-tag-operations@1.5.1` ↗︎](https://www.npmjs.com/package/@graphql-codegen/gql-tag-operations/v/1.5.1) (from `^1.5.0`, in `dependencies`)\n\n- [#8402](https://github.com/dotansimha/graphql-code-generator/pull/8402) [`a76c606e3`](https://github.com/dotansimha/graphql-code-generator/commit/a76c606e3b631ef903d4066e2643bc7f95457e30) Thanks [@charlypoly](https://github.com/charlypoly)! - update `@graphql-codegen/gql-tag-operations`\n\n- Updated dependencies [[`a76c606e3`](https://github.com/dotansimha/graphql-code-generator/commit/a76c606e3b631ef903d4066e2643bc7f95457e30)]:\n  - @graphql-codegen/gql-tag-operations@1.5.2\n\n## 1.0.1\n\n### Patch Changes\n\n- [#8302](https://github.com/dotansimha/graphql-code-generator/pull/8302) [`876844e76`](https://github.com/dotansimha/graphql-code-generator/commit/876844e7644a917172f09b3c4eb54a2f4c90e4c6) Thanks [@charlypoly](https://github.com/charlypoly)! - **`@graphql-codegen/gql-tag-operations` and `@graphql-codegen/gql-tag-operations-preset`**\n\n  Introduce a `gqlTagName` configuration option\n\n  ***\n\n  **`@graphql-codegen/client-preset`**\n\n  New preset for GraphQL Code Generator v3, more information on the RFC: https://github.com/dotansimha/graphql-code-generator/issues/8296\n\n  ***\n\n  **`@graphql-codegen/cli`**\n\n  Update init wizard with 3.0 recommendations (`codegen.ts`, `client` preset)\n\n- Updated dependencies [[`876844e76`](https://github.com/dotansimha/graphql-code-generator/commit/876844e7644a917172f09b3c4eb54a2f4c90e4c6)]:\n  - @graphql-codegen/gql-tag-operations@1.5.0\n"
  },
  {
    "path": "packages/presets/client/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/client-preset\",\n  \"version\": \"5.2.4\",\n  \"description\": \"GraphQL Code Generator preset for client.\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/presets/client\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"devDependencies\": {\n    \"@types/babel__helper-plugin-utils\": \"7.10.3\",\n    \"@types/babel__template\": \"7.4.4\",\n    \"graphql-sock\": \"1.0.0\"\n  },\n  \"dependencies\": {\n    \"@babel/helper-plugin-utils\": \"^7.20.2\",\n    \"@babel/template\": \"^7.20.7\",\n    \"@graphql-codegen/add\": \"^6.0.0\",\n    \"@graphql-codegen/typed-document-node\": \"^6.1.7\",\n    \"@graphql-codegen/typescript\": \"^5.0.9\",\n    \"@graphql-codegen/typescript-operations\": \"^5.0.9\",\n    \"@graphql-codegen/gql-tag-operations\": \"5.1.4\",\n    \"@graphql-codegen/plugin-helpers\": \"^6.1.1\",\n    \"@graphql-codegen/visitor-plugin-common\": \"^6.2.4\",\n    \"@graphql-typed-document-node/core\": \"3.2.0\",\n    \"@graphql-tools/documents\": \"^1.0.0\",\n    \"@graphql-tools/utils\": \"^11.0.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\",\n    \"graphql-sock\": \"^1.0.0\"\n  },\n  \"peerDependenciesMeta\": {\n    \"graphql-sock\": {\n      \"optional\": true\n    }\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/presets/client/src/add-typename-selection-document-transform.ts",
    "content": "import { ASTNode, OperationDefinitionNode, Kind, visit } from 'graphql';\nimport { Types } from '@graphql-codegen/plugin-helpers';\n\n/**\n * Automatically adds `__typename` selections to every object type in your GraphQL document except the root node in subscriptions since a single root field is expected (https://spec.graphql.org/draft/#sec-Single-root-field).\n * This is useful for GraphQL Clients such as Apollo Client or urql that need typename information for their cache to function.\n */\nexport const addTypenameSelectionDocumentTransform: Types.DocumentTransformObject = {\n  transform({ documents }) {\n    return documents.map(document => ({\n      ...document,\n      document: document.document\n        ? visit(document.document, {\n            SelectionSet(node, _, parent) {\n              const isSubscriptionRoot =\n                typeof (parent as ASTNode)?.kind === 'string' &&\n                (parent as ASTNode).kind === 'OperationDefinition' &&\n                (parent as OperationDefinitionNode).operation === 'subscription';\n              if (\n                !isSubscriptionRoot &&\n                !node.selections.find(selection => selection.kind === 'Field' && selection.name.value === '__typename')\n              ) {\n                return {\n                  ...node,\n                  selections: [\n                    {\n                      kind: Kind.FIELD,\n                      name: {\n                        kind: Kind.NAME,\n                        value: '__typename',\n                      },\n                    },\n                    ...node.selections,\n                  ],\n                };\n              }\n              return undefined;\n            },\n          })\n        : undefined,\n    }));\n  },\n};\n"
  },
  {
    "path": "packages/presets/client/src/babel.ts",
    "content": "import * as path from 'path';\nimport type { PluginObj, PluginPass } from '@babel/core';\nimport { declare } from '@babel/helper-plugin-utils';\nimport template from '@babel/template';\nimport type { NodePath } from '@babel/traverse';\nimport type { Program } from '@babel/types';\nimport { ClientSideBaseVisitor } from '@graphql-codegen/visitor-plugin-common';\nimport { buildSchema, parse } from 'graphql';\n\nconst noopSchema = buildSchema(`type Query { _: Int }`);\n\ntype ClientBabelPresetOptions = {\n  artifactDirectory?: string;\n  gqlTagName?: string;\n};\nexport default declare<ClientBabelPresetOptions>((api, opts): PluginObj => {\n  const visitor = new ClientSideBaseVisitor(noopSchema, [], {}, {});\n\n  const artifactDirectory = opts['artifactDirectory'] ?? '';\n  const gqlTagName = opts['gqlTagName'] || 'gql';\n\n  let program: NodePath<Program>;\n  return {\n    name: 'client-preset',\n    visitor: {\n      Program(path) {\n        program = path;\n      },\n      CallExpression(path, state) {\n        if (path.node.callee.type !== 'Identifier' || path.node.callee.name !== gqlTagName) {\n          return;\n        }\n        const [argument] = path.node.arguments;\n        if (argument == null) {\n          return;\n        }\n        if (argument.type !== 'TemplateLiteral') {\n          return;\n        }\n\n        const [content] = argument.quasis;\n        const ast = parse(content.value.raw);\n\n        const [firstDefinition] = ast.definitions;\n\n        if (firstDefinition.kind !== 'FragmentDefinition' && firstDefinition.kind !== 'OperationDefinition') {\n          return;\n        }\n\n        if (firstDefinition.name == null) {\n          return;\n        }\n\n        const operationOrFragmentName =\n          firstDefinition.kind === 'OperationDefinition'\n            ? visitor.getOperationVariableName(firstDefinition)\n            : visitor.getFragmentVariableName(firstDefinition);\n\n        const importPath = getRelativeImportPath(state, artifactDirectory);\n\n        const importDeclaration = template.smart(`\n          import { %%importName%% } from %%importPath%%\n        `);\n        program.unshiftContainer(\n          'body',\n          importDeclaration({\n            importName: api.types.identifier(operationOrFragmentName),\n            importPath: api.types.stringLiteral(importPath),\n          })\n        );\n        path.replaceWith(api.types.identifier(operationOrFragmentName));\n      },\n    },\n  };\n});\n\nfunction getRelativeImportPath(state: PluginPass, artifactDirectory: string, fileToRequire = 'graphql'): string {\n  if (state.file == null) {\n    throw new Error('Babel state is missing expected file name');\n  }\n\n  const { filename } = state.file.opts;\n\n  const relative = path.relative(path.dirname(filename), path.resolve(artifactDirectory));\n\n  const relativeReference = relative.length === 0 || !relative.startsWith('.') ? './' : '';\n\n  const platformSpecificPath = relativeReference + path.join(relative, fileToRequire);\n  // ensure windows paths are written as unix paths\n  return platformSpecificPath.split(path.sep).join(path.posix.sep);\n}\n"
  },
  {
    "path": "packages/presets/client/src/fragment-masking-plugin.ts",
    "content": "import { normalizeImportExtension, type PluginFunction } from '@graphql-codegen/plugin-helpers';\n\nconst fragmentTypeHelper = `\nexport type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> = TDocumentType extends DocumentTypeDecoration<\n  infer TType,\n  any\n>\n  ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n    ? TKey extends string\n      ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n      : never\n    : never\n  : never;`;\n\nconst makeFragmentDataHelper = `\nexport function makeFragmentData<\n  F extends DocumentTypeDecoration<any, any>,\n  FT extends ResultOf<F>\n>(data: FT, _fragment: F): FragmentType<F> {\n  return data as FragmentType<F>;\n}`;\n\nconst defaultUnmaskFunctionName = 'useFragment';\n\nconst createUnmaskFunctionTypeDefinitions = (unmaskFunctionName = defaultUnmaskFunctionName) => [\n  `// return non-nullable if \\`fragmentType\\` is non-nullable\nexport function ${unmaskFunctionName}<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n): TType;`,\n\n  `// return nullable if \\`fragmentType\\` is undefined\nexport function ${unmaskFunctionName}<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n): TType | undefined;`,\n\n  `// return nullable if \\`fragmentType\\` is nullable\nexport function ${unmaskFunctionName}<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n): TType | null;`,\n\n  `// return nullable if \\`fragmentType\\` is nullable or undefined\nexport function ${unmaskFunctionName}<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n): TType | null | undefined;`,\n\n  `// return array of non-nullable if \\`fragmentType\\` is array of non-nullable\nexport function ${unmaskFunctionName}<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n): Array<TType>;`,\n\n  `// return array of nullable if \\`fragmentType\\` is array of nullable\nexport function ${unmaskFunctionName}<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): Array<TType> | null | undefined;`,\n\n  `// return readonly array of non-nullable if \\`fragmentType\\` is array of non-nullable\nexport function ${unmaskFunctionName}<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n): ReadonlyArray<TType>;`,\n\n  `// return readonly array of nullable if \\`fragmentType\\` is array of nullable\nexport function ${unmaskFunctionName}<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): ReadonlyArray<TType> | null | undefined;`,\n];\n\nconst createUnmaskFunction = (unmaskFunctionName = defaultUnmaskFunctionName) => `\n${createUnmaskFunctionTypeDefinitions(unmaskFunctionName).join('\\n')}\nexport function ${unmaskFunctionName}<TType>(\n  _documentNode: DocumentTypeDecoration<TType, any>,\n  fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | Array<FragmentType<DocumentTypeDecoration<TType, any>>> | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n  return fragmentType as any;\n}\n`;\n\nconst isFragmentReadyFunction = (isStringDocumentMode: boolean) => {\n  if (isStringDocumentMode) {\n    return `\\\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: TypedDocumentString<TQuery, any>,\n  fragmentNode: TypedDocumentString<TFrag, any>,\n  data: FragmentType<TypedDocumentString<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = queryNode.__meta__?.deferredFields as Record<string, (keyof TFrag)[]>;\n  const fragName = fragmentNode.__meta__?.fragmentName as string | undefined;\n\n  if (!deferredFields || !fragName) return true;\n\n  const fields = deferredFields[fragName] ?? [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n`;\n  }\n  return `\\\nexport function isFragmentReady<TQuery, TFrag>(\n  queryNode: DocumentTypeDecoration<TQuery, any>,\n  fragmentNode: TypedDocumentNode<TFrag>,\n  data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n): data is FragmentType<typeof fragmentNode> {\n  const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n    ?.deferredFields;\n\n  if (!deferredFields) return true;\n\n  const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n  const fragName = fragDef?.name?.value;\n\n  const fields = (fragName && deferredFields[fragName]) || [];\n  return fields.length > 0 && fields.every(field => data && field in data);\n}\n`;\n};\n\n/**\n * Plugin for generating fragment masking helper functions.\n */\nexport const plugin: PluginFunction<{\n  useTypeImports?: boolean;\n  augmentedModuleName?: string;\n  unmaskFunctionName?: string;\n  emitLegacyCommonJSImports?: boolean;\n  importExtension?: '' | `.${string}`;\n  isStringDocumentMode?: boolean;\n}> = (\n  _,\n  __,\n  {\n    useTypeImports,\n    augmentedModuleName,\n    unmaskFunctionName,\n    emitLegacyCommonJSImports,\n    importExtension,\n    isStringDocumentMode,\n  },\n  _info\n) => {\n  const appendedImportExtension = normalizeImportExtension({\n    emitLegacyCommonJSImports,\n    importExtension,\n  });\n  const documentNodeImport = `${useTypeImports ? 'import type' : 'import'} { ResultOf, DocumentTypeDecoration${\n    isStringDocumentMode ? '' : ', TypedDocumentNode'\n  } } from '@graphql-typed-document-node/core';\\n`;\n\n  const deferFragmentHelperImports = `${useTypeImports ? 'import type' : 'import'} { Incremental${\n    isStringDocumentMode ? ', TypedDocumentString' : ''\n  } } from './graphql${appendedImportExtension}';\\n`;\n\n  const fragmentDefinitionNodeImport = isStringDocumentMode\n    ? ''\n    : `${useTypeImports ? 'import type' : 'import'} { FragmentDefinitionNode } from 'graphql';\\n`;\n\n  if (augmentedModuleName == null) {\n    return [\n      documentNodeImport,\n      fragmentDefinitionNodeImport,\n      deferFragmentHelperImports,\n      `\\n`,\n      fragmentTypeHelper,\n      `\\n`,\n      createUnmaskFunction(unmaskFunctionName),\n      `\\n`,\n      makeFragmentDataHelper,\n      `\\n`,\n      isFragmentReadyFunction(isStringDocumentMode),\n    ].join(``);\n  }\n\n  return [\n    documentNodeImport,\n    `declare module \"${augmentedModuleName}\" {`,\n    [\n      ...fragmentTypeHelper.split(`\\n`),\n      `\\n`,\n      ...createUnmaskFunctionTypeDefinitions(unmaskFunctionName).join('\\n').split('\\n'),\n      `\\n`,\n      makeFragmentDataHelper,\n    ]\n      .map(line => (line === `\\n` || line === '' ? line : `  ${line}`))\n      .join(`\\n`),\n    `}`,\n  ].join(`\\n`);\n};\n"
  },
  {
    "path": "packages/presets/client/src/index.ts",
    "content": "import * as addPlugin from '@graphql-codegen/add';\nimport * as gqlTagPlugin from '@graphql-codegen/gql-tag-operations';\nimport { normalizeImportExtension, type PluginFunction, type Types } from '@graphql-codegen/plugin-helpers';\nimport * as typedDocumentNodePlugin from '@graphql-codegen/typed-document-node';\nimport * as typescriptPlugin from '@graphql-codegen/typescript';\nimport * as typescriptOperationPlugin from '@graphql-codegen/typescript-operations';\nimport { ClientSideBaseVisitor, DocumentMode } from '@graphql-codegen/visitor-plugin-common';\nimport { parse, printSchema, type DocumentNode, type GraphQLSchema } from 'graphql';\nimport * as fragmentMaskingPlugin from './fragment-masking-plugin.js';\nimport { generateDocumentHash, normalizeAndPrintDocumentNode } from './persisted-documents.js';\nimport { processSources } from './process-sources.js';\n\nexport { default as babelOptimizerPlugin } from './babel.js';\n\nexport type FragmentMaskingConfig = {\n  /** @description Name of the function that should be used for unmasking a masked fragment property.\n   * @default `'useFragment'`\n   */\n  unmaskFunctionName?: string;\n};\n\nexport type ClientPresetConfig = {\n  /**\n   * @description Fragment masking hides data from components and only allows accessing the data by using a unmasking function.\n   * @exampleMarkdown\n   * ```tsx\n   * const config = {\n   *    schema: 'https://graphql.org/graphql/',\n   *    documents: ['src/**\\/*.tsx', '!src\\/gql/**\\/*'],\n   *    generates: {\n   *       './src/gql/': {\n   *          preset: 'client',\n   *          presetConfig: {\n   *            fragmentMasking: false,\n   *          }\n   *        },\n   *    },\n   * };\n   * export default config;\n   * ```\n   */\n  fragmentMasking?: FragmentMaskingConfig | boolean;\n  /**\n   * @description Specify the name of the \"graphql tag\" function to use\n   * @default \"graphql\"\n   *\n   * E.g. `graphql` or `gql`.\n   *\n   * @exampleMarkdown\n   * ```tsx\n   * const config = {\n   *    schema: 'https://graphql.org/graphql/',\n   *    documents: ['src/**\\/*.tsx', '!src\\/gql/**\\/*'],\n   *    generates: {\n   *       './src/gql/': {\n   *          preset: 'client',\n   *          presetConfig: {\n   *            gqlTagName: 'gql',\n   *          }\n   *        },\n   *    },\n   * };\n   * export default config;\n   * ```\n   */\n  gqlTagName?: string;\n  /**\n   * Generate metadata for a executable document node and embed it in the emitted code.\n   */\n  onExecutableDocumentNode?: (documentNode: DocumentNode) => void | Record<string, unknown>;\n  /** Persisted operations configuration. */\n  persistedDocuments?:\n    | boolean\n    | {\n        /**\n         * @description Behavior for the output file.\n         * @default 'embedHashInDocument'\n         * \"embedHashInDocument\" will add a property within the `DocumentNode` with the hash of the operation.\n         * \"replaceDocumentWithHash\" will fully drop the document definition.\n         */\n        mode?: 'embedHashInDocument' | 'replaceDocumentWithHash';\n        /**\n         * @description Name of the property that will be added to the `DocumentNode` with the hash of the operation.\n         */\n        hashPropertyName?: string;\n        /**\n         * @description Algorithm or function used to generate the hash, could be useful if your server expects something specific (e.g., Apollo Server expects `sha256`).\n         *\n         * A custom hash function can be provided to generate the hash if the preset algorithms don't fit your use case. The function receives the operation and should return the hash string.\n         *\n         * The algorithm parameter is typed with known algorithms and as a string rather than a union because it solely depends on Crypto's algorithms supported\n         * by the version of OpenSSL on the platform.\n         *\n         * @default `sha1`\n         */\n        hashAlgorithm?: 'sha1' | 'sha256' | (string & {}) | ((operation: string) => string);\n      };\n};\n\nconst isOutputFolderLike = (baseOutputDir: string) => baseOutputDir.endsWith('/');\n\nexport const preset: Types.OutputPreset<ClientPresetConfig> = {\n  prepareDocuments: (outputFilePath, outputSpecificDocuments) => [...outputSpecificDocuments, `!${outputFilePath}`],\n  buildGeneratesSection: async options => {\n    if (!isOutputFolderLike(options.baseOutputDir)) {\n      throw new Error(\n        '[client-preset] target output should be a directory, ex: \"src/gql/\". Make sure you add \"/\" at the end of the directory path'\n      );\n    }\n\n    if (options.plugins.length > 0 && Object.keys(options.plugins).some(p => p.startsWith('typescript'))) {\n      throw new Error(\n        '[client-preset] providing typescript-based `plugins` with `preset: \"client\" leads to duplicated generated types'\n      );\n    }\n    const isPersistedOperations = !!options.presetConfig?.persistedDocuments;\n    if (options.config.nullability?.errorHandlingClient) {\n      options.schemaAst = await semanticToStrict(options.schemaAst!);\n      options.schema = parse(printSchema(options.schemaAst));\n    }\n\n    const reexports: Array<string> = [];\n\n    // the `client` preset is restricting the config options inherited from `typescript`, `typescript-operations` and others.\n    const forwardedConfig = {\n      scalars: options.config.scalars,\n      defaultScalarType: options.config.defaultScalarType,\n      strictScalars: options.config.strictScalars,\n      namingConvention: options.config.namingConvention,\n      useTypeImports: options.config.useTypeImports,\n      skipTypename: options.config.skipTypename,\n      arrayInputCoercion: options.config.arrayInputCoercion,\n      enumsAsTypes: options.config.enumsAsTypes,\n      enumsAsConst: options.config.enumsAsConst,\n      enumValues: options.config.enumValues,\n      futureProofEnums: options.config.futureProofEnums,\n      nonOptionalTypename: options.config.nonOptionalTypename,\n      avoidOptionals: options.config.avoidOptionals,\n      documentMode: options.config.documentMode,\n      skipTypeNameForRoot: options.config.skipTypeNameForRoot,\n      onlyOperationTypes: options.config.onlyOperationTypes,\n      onlyEnums: options.config.onlyEnums,\n      customDirectives: options.config.customDirectives,\n      immutableTypes: options.config.immutableTypes,\n    };\n\n    const visitor = new ClientSideBaseVisitor(options.schemaAst, [], options.config, options.config);\n    let fragmentMaskingConfig: FragmentMaskingConfig | null = null;\n\n    if (typeof options?.presetConfig?.fragmentMasking === 'object') {\n      fragmentMaskingConfig = options.presetConfig.fragmentMasking;\n    } else if (options?.presetConfig?.fragmentMasking !== false) {\n      // `true` by default\n      fragmentMaskingConfig = {};\n    }\n\n    const onExecutableDocumentNodeHook = options.presetConfig.onExecutableDocumentNode ?? null;\n    const isMaskingFragments = fragmentMaskingConfig != null;\n\n    const persistedDocuments = options.presetConfig.persistedDocuments\n      ? {\n          hashPropertyName:\n            (typeof options.presetConfig.persistedDocuments === 'object' &&\n              options.presetConfig.persistedDocuments.hashPropertyName) ||\n            'hash',\n          omitDefinitions:\n            (typeof options.presetConfig.persistedDocuments === 'object' &&\n              options.presetConfig.persistedDocuments.mode) === 'replaceDocumentWithHash' || false,\n          hashAlgorithm:\n            (typeof options.presetConfig.persistedDocuments === 'object' &&\n              options.presetConfig.persistedDocuments.hashAlgorithm) ||\n            'sha1',\n        }\n      : null;\n\n    const sourcesWithOperations = processSources(options.documents, node => {\n      if (node.kind === 'FragmentDefinition') {\n        return visitor.getFragmentVariableName(node);\n      }\n      return visitor.getOperationVariableName(node);\n    });\n    const sources = sourcesWithOperations.map(({ source }) => source);\n\n    const tdnFinished = createDeferred();\n    const persistedDocumentsMap = new Map<string, string>();\n\n    const pluginMap = {\n      ...options.pluginMap,\n      [`add`]: addPlugin,\n      [`typescript`]: typescriptPlugin,\n      [`typescript-operations`]: typescriptOperationPlugin,\n      [`typed-document-node`]: {\n        ...typedDocumentNodePlugin,\n        plugin: async (...args: Parameters<PluginFunction>) => {\n          try {\n            return await typedDocumentNodePlugin.plugin(...args);\n          } finally {\n            tdnFinished.resolve();\n          }\n        },\n      },\n      [`gen-dts`]: gqlTagPlugin,\n    };\n\n    function onExecutableDocumentNode(documentNode: DocumentNode) {\n      const meta = onExecutableDocumentNodeHook?.(documentNode);\n\n      if (persistedDocuments) {\n        const documentString = normalizeAndPrintDocumentNode(documentNode);\n        const hash = generateDocumentHash(documentString, persistedDocuments.hashAlgorithm);\n        persistedDocumentsMap.set(hash, documentString);\n        return { ...meta, [persistedDocuments.hashPropertyName]: hash };\n      }\n\n      if (meta) {\n        return meta;\n      }\n\n      return undefined;\n    }\n\n    const plugins: Array<Types.ConfiguredPlugin> = [\n      { [`add`]: { content: `/* eslint-disable */` } },\n      {\n        [`typescript`]: {\n          inputMaybeValue: 'T | null | undefined',\n        },\n      },\n      { [`typescript-operations`]: {} },\n      {\n        [`typed-document-node`]: {\n          unstable_onExecutableDocumentNode: onExecutableDocumentNode,\n          unstable_omitDefinitions: persistedDocuments?.omitDefinitions ?? false,\n        },\n      },\n      ...options.plugins,\n    ];\n\n    const genDtsPlugins: Array<Types.ConfiguredPlugin> = [\n      { [`add`]: { content: `/* eslint-disable */` } },\n      { [`gen-dts`]: { sourcesWithOperations } },\n    ];\n\n    const gqlArtifactFileExtension = '.ts';\n    reexports.push('gql');\n\n    const config = {\n      ...options.config,\n      inlineFragmentTypes: isMaskingFragments ? 'mask' : options.config['inlineFragmentTypes'],\n    };\n\n    let fragmentMaskingFileGenerateConfig: Types.GenerateOptions | null = null;\n\n    const importExtension = normalizeImportExtension({\n      emitLegacyCommonJSImports: options.config.emitLegacyCommonJSImports,\n      importExtension: options.config.importExtension,\n    });\n\n    if (isMaskingFragments === true) {\n      const fragmentMaskingArtifactFileExtension = '.ts';\n\n      reexports.push('fragment-masking');\n\n      fragmentMaskingFileGenerateConfig = {\n        filename: `${options.baseOutputDir}fragment-masking${fragmentMaskingArtifactFileExtension}`,\n        pluginMap: {\n          [`add`]: addPlugin,\n          [`fragment-masking`]: fragmentMaskingPlugin,\n        },\n        plugins: [\n          { [`add`]: { content: `/* eslint-disable */` } },\n          {\n            [`fragment-masking`]: {},\n          },\n        ],\n        schema: options.schema,\n        config: {\n          useTypeImports: options.config.useTypeImports,\n          unmaskFunctionName: fragmentMaskingConfig.unmaskFunctionName,\n          emitLegacyCommonJSImports: options.config.emitLegacyCommonJSImports,\n          importExtension,\n          isStringDocumentMode: options.config.documentMode === DocumentMode.string,\n        },\n        documents: [],\n        documentTransforms: options.documentTransforms,\n      };\n    }\n\n    let indexFileGenerateConfig: Types.GenerateOptions | null = null;\n\n    if (reexports.length) {\n      indexFileGenerateConfig = {\n        filename: `${options.baseOutputDir}index.ts`,\n        pluginMap: {\n          [`add`]: addPlugin,\n        },\n        plugins: [\n          {\n            [`add`]: {\n              content: reexports\n                .sort()\n                .map(moduleName => `export * from \"./${moduleName}${importExtension}\";`)\n                .join('\\n'),\n            },\n          },\n        ],\n        schema: options.schema,\n        config: {},\n        documents: [],\n        documentTransforms: options.documentTransforms,\n      };\n    }\n\n    return [\n      {\n        filename: `${options.baseOutputDir}graphql.ts`,\n        plugins,\n        pluginMap,\n        schema: options.schema,\n        config: {\n          inlineFragmentTypes: isMaskingFragments ? 'mask' : options.config['inlineFragmentTypes'],\n          ...forwardedConfig,\n        },\n        documents: sources,\n        documentTransforms: options.documentTransforms,\n      },\n      {\n        filename: `${options.baseOutputDir}gql${gqlArtifactFileExtension}`,\n        plugins: genDtsPlugins,\n        pluginMap,\n        schema: options.schema,\n        config: {\n          ...config,\n          gqlTagName: options.presetConfig.gqlTagName || 'graphql',\n        },\n        documents: sources,\n        documentTransforms: options.documentTransforms,\n      },\n      ...(isPersistedOperations\n        ? [\n            {\n              filename: `${options.baseOutputDir}persisted-documents.json`,\n              plugins: [\n                {\n                  [`persisted-operations`]: {},\n                },\n              ],\n              pluginMap: {\n                [`persisted-operations`]: {\n                  plugin: async () => {\n                    await tdnFinished.promise;\n                    return {\n                      content: JSON.stringify(Object.fromEntries(persistedDocumentsMap.entries()), null, 2),\n                    };\n                  },\n                },\n              },\n              schema: options.schema,\n              config: {},\n              documents: sources,\n              documentTransforms: options.documentTransforms,\n            },\n          ]\n        : []),\n      ...(fragmentMaskingFileGenerateConfig ? [fragmentMaskingFileGenerateConfig] : []),\n      ...(indexFileGenerateConfig ? [indexFileGenerateConfig] : []),\n    ];\n  },\n};\n\ntype Deferred<T = void> = {\n  resolve: (value: T) => void;\n  reject: (value: unknown) => void;\n  promise: Promise<T>;\n};\n\nfunction createDeferred<T = void>(): Deferred<T> {\n  const d = {} as Deferred<T>;\n  d.promise = new Promise<T>((resolve, reject) => {\n    d.resolve = resolve;\n    d.reject = reject;\n  });\n  return d;\n}\n\nconst semanticToStrict = async (schema: GraphQLSchema): Promise<GraphQLSchema> => {\n  try {\n    const sock = await import('graphql-sock');\n    return sock.semanticToStrict(schema);\n  } catch {\n    throw new Error(\n      \"To use the `nullability.errorHandlingClient` option, you must install the 'graphql-sock' package.\"\n    );\n  }\n};\n\nexport { addTypenameSelectionDocumentTransform } from './add-typename-selection-document-transform.js';\n"
  },
  {
    "path": "packages/presets/client/src/persisted-documents.spec.ts",
    "content": "import { parse } from 'graphql';\nimport { normalizeAndPrintDocumentNode } from './persisted-documents';\n\ndescribe('normalizeAndPrintDocumentNode', () => {\n  it('should remove client specific directives/fields from the document', () => {\n    const document = parse(/* GraphQL */ `\n      query myQuery {\n        regularField\n        clientSideOnlyField @client\n      }\n    `);\n    const result = normalizeAndPrintDocumentNode(document);\n    expect(result).toMatchInlineSnapshot(`\"query myQuery { regularField }\"`);\n  });\n\n  it('should remove @client when it is specified on an fragment spread', () => {\n    const document = parse(/* GraphQL */ `\n      query myQuery {\n        regularField\n        clientSideOnlyField @client\n        ...myFrag @client\n        ...myOtherFrag\n      }\n\n      fragment myFrag on Query {\n        someField\n      }\n    `);\n    const result = normalizeAndPrintDocumentNode(document);\n    expect(result).toMatchInlineSnapshot(\n      `\"fragment myFrag on Query { someField } query myQuery { regularField ...myOtherFrag }\"`\n    );\n  });\n\n  it('should remove @client when it is specified on an inline fragment', () => {\n    const document = parse(/* GraphQL */ `\n      query myQuery {\n        regularField\n        clientSideOnlyField @client\n        ...myFrag @client\n        ... on Query @client {\n          someField\n        }\n        ... on Query {\n          regularField\n        }\n      }\n\n      fragment myFrag on Query {\n        someField\n      }\n    `);\n    const result = normalizeAndPrintDocumentNode(document);\n    expect(result).toMatchInlineSnapshot(\n      `\"fragment myFrag on Query { someField } query myQuery { regularField ... on Query { regularField } }\"`\n    );\n  });\n});\n"
  },
  {
    "path": "packages/presets/client/src/persisted-documents.ts",
    "content": "import { printExecutableGraphQLDocument } from '@graphql-tools/documents';\nimport * as crypto from 'crypto';\nimport { Kind, visit, type DocumentNode } from 'graphql';\n\nconst CLIENT_DIRECTIVE_NAME = 'client';\nconst CONNECTION_DIRECTIVE_NAME = 'connection';\n\n/**\n * This function generates a hash from a document node.\n */\nexport function generateDocumentHash(\n  operation: string,\n  algorithm: 'sha1' | 'sha256' | (string & {}) | ((operation: string) => string)\n): string {\n  if (typeof algorithm === 'function') {\n    return algorithm(operation);\n  }\n  const shasum = crypto.createHash(algorithm);\n  shasum.update(operation);\n  return shasum.digest('hex');\n}\n\n/**\n * Normalizes and prints a document node.\n */\nexport function normalizeAndPrintDocumentNode(documentNode: DocumentNode): string {\n  /**\n   * This removes all client specific directives/fields from the document\n   * that the server does not know about.\n   * In a future version this should be more configurable.\n   * If you look at this and want to customize it.\n   * Send a PR :)\n   */\n  const sanitizedDocument = visit(documentNode, {\n    [Kind.FIELD](field) {\n      if (field.directives?.some(directive => directive.name.value === CLIENT_DIRECTIVE_NAME)) {\n        return null;\n      }\n    },\n    [Kind.FRAGMENT_SPREAD](spread) {\n      if (spread.directives?.some(directive => directive.name.value === CLIENT_DIRECTIVE_NAME)) {\n        return null;\n      }\n    },\n    [Kind.INLINE_FRAGMENT](fragment) {\n      if (fragment.directives?.some(directive => directive.name.value === CLIENT_DIRECTIVE_NAME)) {\n        return null;\n      }\n    },\n    [Kind.DIRECTIVE](directive) {\n      if (directive.name.value === CONNECTION_DIRECTIVE_NAME) {\n        return null;\n      }\n    },\n  });\n\n  return printExecutableGraphQLDocument(sanitizedDocument);\n}\n"
  },
  {
    "path": "packages/presets/client/src/process-sources.ts",
    "content": "import { OperationOrFragment, SourceWithOperations } from '@graphql-codegen/gql-tag-operations';\nimport { Source } from '@graphql-tools/utils';\nimport { FragmentDefinitionNode, OperationDefinitionNode } from 'graphql';\n\nexport type BuildNameFunction = (type: OperationDefinitionNode | FragmentDefinitionNode) => string;\n\nexport function processSources(sources: Array<Source>, buildName: BuildNameFunction) {\n  const sourcesWithOperations: Array<SourceWithOperations> = [];\n\n  for (const originalSource of sources) {\n    const source = fixLinebreaks(originalSource);\n    const { document } = source;\n    const operations: Array<OperationOrFragment> = [];\n\n    for (const definition of document?.definitions ?? []) {\n      if (definition?.kind !== `OperationDefinition` && definition?.kind !== 'FragmentDefinition') continue;\n\n      if (definition.name?.kind !== `Name`) {\n        if (definition?.kind === `OperationDefinition`) {\n          // eslint-disable-next-line no-console\n          console.warn(`[client-preset] the following anonymous operation is skipped: ${source.rawSDL}`);\n        }\n        continue;\n      }\n\n      operations.push({\n        initialName: buildName(definition),\n        definition,\n      });\n    }\n\n    if (operations.length === 0) continue;\n\n    sourcesWithOperations.push({\n      source,\n      operations,\n    });\n  }\n\n  return sourcesWithOperations;\n}\n\n/**\n * https://github.com/dotansimha/graphql-code-generator/issues/7362\n *\n * Source file is read by @graphql/tools using fs.promises.readFile,\n * which means that the linebreaks are read as-is and the result will be different\n * depending on the OS: it will contain LF (\\n) on Linux/MacOS and CRLF (\\r\\n) on Windows.\n *\n * In most scenarios that would be OK. However, front-end preset is using the resulting string\n * as a TypeScript type. Which means that the string will be compared against a template literal,\n * for example:\n *\n * <pre><code>\n * `\n * query a {\n *    a\n *  }\n * ` === '\\n query a {\\n    a\\n  }\\n '\n * </code></pre>\n *\n * According to clause 12.8.6.2 of ECMAScript Language Specification\n * (https://tc39.es/ecma262/#sec-static-semantics-trv),\n * when comparing strings, JavaScript doesn't care which linebreaks does the source file contain,\n * any linebreak (CR, LF or CRLF) is LF from JavaScript standpoint\n * (otherwise the result of the above comparison would be OS-dependent, which doesn't make sense).\n *\n * Therefore gql-tag-operation would break on Windows as it would generate\n *\n * '\\r\\n query a {\\r\\n    a\\r\\n  }\\r\\n '\n *\n * which is NOT equal to\n *\n * <pre><code>\n * `\n * query a {\n *    a\n *  }\n * `\n * </code></pre>\n *\n * Therefore we need to replace \\r\\n with \\n in the string.\n *\n * @param source\n */\nfunction fixLinebreaks(source: Source) {\n  const fixedSource = { ...source };\n\n  fixedSource.rawSDL = source.rawSDL.replace(/\\r\\n/g, '\\n');\n\n  return fixedSource;\n}\n"
  },
  {
    "path": "packages/presets/client/tests/babel.spec.ts",
    "content": "import * as path from 'path';\nimport { transformFileSync } from '@babel/core';\nimport babelPlugin from '../src/babel.js';\n\ndescribe('client-preset > babelPlugin', () => {\n  test('can imports files in the same directory', () => {\n    const result = transformFileSync(path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'), {\n      plugins: [[babelPlugin, { artifactDirectory: path.join(__dirname, 'fixtures') }]],\n      babelrc: false,\n      configFile: false,\n    }).code;\n\n    expect(result).toMatchInlineSnapshot(`\n      \"import { CFragmentDoc } from \"./graphql\";\n      import { BDocument } from \"./graphql\";\n      import { ADocument } from \"./graphql\";\n      /* eslint-disable @typescript-eslint/ban-ts-comment */\n      //@ts-ignore\n      import gql from 'gql-tag';\n\n      //@ts-ignore\n      const A = ADocument;\n\n      //@ts-ignore\n      const B = BDocument;\n\n      //@ts-ignore\n      const C = CFragmentDoc;\"\n    `);\n  });\n  test('can import files in another directory', () => {\n    const result = transformFileSync(path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'), {\n      plugins: [[babelPlugin, { artifactDirectory: __dirname }]],\n      babelrc: false,\n      configFile: false,\n    }).code;\n    expect(result).toMatchInlineSnapshot(`\n      \"import { CFragmentDoc } from \"../graphql\";\n      import { BDocument } from \"../graphql\";\n      import { ADocument } from \"../graphql\";\n      /* eslint-disable @typescript-eslint/ban-ts-comment */\n      //@ts-ignore\n      import gql from 'gql-tag';\n\n      //@ts-ignore\n      const A = ADocument;\n\n      //@ts-ignore\n      const B = BDocument;\n\n      //@ts-ignore\n      const C = CFragmentDoc;\"\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/presets/client/tests/client-preset.nullability.spec.ts",
    "content": "import '@graphql-codegen/testing';\nimport { executeCodegen } from '@graphql-codegen/cli';\nimport * as prettier from 'prettier';\nimport { preset } from '../src/index.js';\n\nconst schema = /* GraphQL */ `\n  directive @semanticNonNull(levels: [Int] = [0]) on FIELD_DEFINITION\n\n  type Query {\n    me: User\n  }\n\n  type User {\n    field: String @semanticNonNull\n    fieldLevel0: String @semanticNonNull(levels: [0])\n    fieldLevel1: String @semanticNonNull(levels: [1])\n    fieldBothLevels: String @semanticNonNull(levels: [0, 1])\n    list: [String] @semanticNonNull\n    listLevel0: [String] @semanticNonNull(levels: [0])\n    listLevel1: [String] @semanticNonNull(levels: [1])\n    listBothLevels: [String] @semanticNonNull(levels: [0, 1])\n    nonNullableList: [String]! @semanticNonNull\n    nonNullableListLevel0: [String]! @semanticNonNull(levels: [0])\n    nonNullableListLevel1: [String]! @semanticNonNull(levels: [1])\n    nonNullableListBothLevels: [String]! @semanticNonNull(levels: [0, 1])\n    listWithNonNullableItem: [String!] @semanticNonNull\n    listWithNonNullableItemLevel0: [String!] @semanticNonNull(levels: [0])\n    listWithNonNullableItemLevel1: [String!] @semanticNonNull(levels: [1])\n    listWithNonNullableItemBothLevels: [String!] @semanticNonNull(levels: [0, 1])\n    nonNullableListWithNonNullableItem: [String!]! @semanticNonNull\n    nonNullableListWithNonNullableItemLevel0: [String!]! @semanticNonNull(levels: [0])\n    nonNullableListWithNonNullableItemLevel1: [String!]! @semanticNonNull(levels: [1])\n    nonNullableListWithNonNullableItemBothLevels: [String!]! @semanticNonNull(levels: [0, 1])\n  }\n`;\n\nconst document = /* GraphQL */ `\n  query Test {\n    me {\n      field\n      fieldLevel0\n      fieldLevel1\n      fieldBothLevels\n      list\n      listLevel0\n      listLevel1\n      listBothLevels\n      nonNullableList\n      nonNullableListLevel0\n      nonNullableListLevel1\n      nonNullableListBothLevels\n      listWithNonNullableItem\n      listWithNonNullableItemLevel0\n      listWithNonNullableItemLevel1\n      listWithNonNullableItemBothLevels\n      nonNullableListWithNonNullableItem\n      nonNullableListWithNonNullableItemLevel0\n      nonNullableListWithNonNullableItemLevel1\n      nonNullableListWithNonNullableItemBothLevels\n    }\n  }\n`;\n\ndescribe('client-preset - nullability', () => {\n  it('converts semanticNonNull to non-null when nullability.errorHandlingClient=true', async () => {\n    const { result } = await executeCodegen({\n      schema,\n      documents: [document],\n      generates: {\n        'out1/': {\n          preset,\n          config: {\n            nullability: {\n              errorHandlingClient: true,\n            },\n          },\n        },\n      },\n    });\n\n    const graphqlFile = result.find(f => f.filename === 'out1/graphql.ts');\n    const formattedContent = prettier.format(graphqlFile.content, { parser: 'typescript' });\n\n    expect(formattedContent).toBeSimilarStringTo(`\n      export type TestQuery = {\n        __typename?: \"Query\";\n        me?: {\n          __typename?: \"User\";\n          field: string;\n          fieldLevel0: string;\n          fieldLevel1?: string | null;\n          fieldBothLevels: string;\n          list: Array<string | null>;\n          listLevel0: Array<string | null>;\n          listLevel1?: Array<string> | null;\n          listBothLevels: Array<string>;\n          nonNullableList: Array<string | null>;\n          nonNullableListLevel0: Array<string | null>;\n          nonNullableListLevel1: Array<string>;\n          nonNullableListBothLevels: Array<string>;\n          listWithNonNullableItem: Array<string>;\n          listWithNonNullableItemLevel0: Array<string>;\n          listWithNonNullableItemLevel1?: Array<string> | null;\n          listWithNonNullableItemBothLevels: Array<string>;\n          nonNullableListWithNonNullableItem: Array<string>;\n          nonNullableListWithNonNullableItemLevel0: Array<string>;\n          nonNullableListWithNonNullableItemLevel1: Array<string>;\n          nonNullableListWithNonNullableItemBothLevels: Array<string>;\n        } | null;\n      };\n    `);\n  });\n\n  it('leave semanticNonNull as null when nullability.errorHandlingClient=false', async () => {\n    const { result } = await executeCodegen({\n      schema,\n      documents: [document],\n      generates: {\n        'out1/': {\n          preset,\n          config: {\n            nullability: {\n              errorHandlingClient: false,\n            },\n          },\n        },\n      },\n    });\n\n    const graphqlFile = result.find(f => f.filename === 'out1/graphql.ts');\n    const formattedContent = prettier.format(graphqlFile.content, { parser: 'typescript' });\n\n    expect(formattedContent).toBeSimilarStringTo(`\n      export type TestQuery = {\n        __typename?: \"Query\";\n        me?: {\n          __typename?: \"User\";\n          field?: string | null;\n          fieldLevel0?: string | null;\n          fieldLevel1?: string | null;\n          fieldBothLevels?: string | null;\n          list?: Array<string | null> | null;\n          listLevel0?: Array<string | null> | null;\n          listLevel1?: Array<string | null> | null;\n          listBothLevels?: Array<string | null> | null;\n          nonNullableList: Array<string | null>;\n          nonNullableListLevel0: Array<string | null>;\n          nonNullableListLevel1: Array<string | null>;\n          nonNullableListBothLevels: Array<string | null>;\n          listWithNonNullableItem?: Array<string> | null;\n          listWithNonNullableItemLevel0?: Array<string> | null;\n          listWithNonNullableItemLevel1?: Array<string> | null;\n          listWithNonNullableItemBothLevels?: Array<string> | null;\n          nonNullableListWithNonNullableItem: Array<string>;\n          nonNullableListWithNonNullableItemLevel0: Array<string>;\n          nonNullableListWithNonNullableItemLevel1: Array<string>;\n          nonNullableListWithNonNullableItemBothLevels: Array<string>;\n        } | null;\n      };\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/presets/client/tests/client-preset.spec.ts",
    "content": "import { executeCodegen } from '@graphql-codegen/cli';\nimport { mergeOutputs } from '@graphql-codegen/plugin-helpers';\nimport { validateTs } from '@graphql-codegen/testing';\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport { print } from 'graphql';\nimport path from 'path';\nimport { addTypenameSelectionDocumentTransform, preset } from '../src/index.js';\n\ndescribe('client-preset', () => {\n  it('can generate simple examples uppercase names', async () => {\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          type Query {\n            a: String\n            b: String\n            c: String\n          }\n        `,\n      ],\n      documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n      generates: {\n        'out1/': {\n          preset,\n        },\n      },\n    });\n\n    expect(result).toHaveLength(4);\n    // index.ts (re-exports)\n    const indexFile = result.find(file => file.filename === 'out1/index.ts');\n    expect(indexFile.content).toEqual(`export * from \"./fragment-masking\";\nexport * from \"./gql\";`);\n\n    // gql.ts\n    const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n    expect(gqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import * as types from './graphql';\n      import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n      /**\n       * Map of all GraphQL operations in the project.\n       *\n       * This map has several performance disadvantages:\n       * 1. It is not tree-shakeable, so it will include all operations in the project.\n       * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n       * 3. It does not support dead code elimination, so it will add unused operations.\n       *\n       * Therefore it is highly recommended to use the babel or swc plugin for production.\n       * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n       */\n      type Documents = {\n          \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\": typeof types.ADocument,\n          \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\": typeof types.BDocument,\n          \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": typeof types.CFragmentDoc,\n      };\n      const documents: Documents = {\n          \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\": types.ADocument,\n          \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\": types.BDocument,\n          \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": types.CFragmentDoc,\n      };\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       *\n       *\n       * @example\n       * \\`\\`\\`ts\n       * const query = graphql(\\`query GetUser($id: ID!) { user(id: $id) { name } }\\`);\n       * \\`\\`\\`\n       *\n       * The query argument is unknown!\n       * Please regenerate the types.\n       */\n      export function graphql(source: string): unknown;\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\"];\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\"];\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"];\n\n      export function graphql(source: string) {\n        return (documents as any)[source] ?? {};\n      }\n\n      export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<  infer TType,  any>  ? TType  : never;\"\n    `);\n\n    // graphql.ts\n    const graphqlFile = result.find(file => file.filename === 'out1/gql.ts');\n    expect(graphqlFile).toBeDefined();\n  });\n\n  it('can generate simple examples lowercase names', async () => {\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          type Query {\n            a: String\n            b: String\n            c: String\n          }\n        `,\n      ],\n      documents: path.join(__dirname, 'fixtures/simple-lowercase-operation-name.ts'),\n      generates: {\n        'out1/': {\n          preset,\n        },\n      },\n    });\n\n    expect(result).toHaveLength(4);\n    // index.ts (re-exports)\n    const indexFile = result.find(file => file.filename === 'out1/index.ts');\n    expect(indexFile.content).toEqual(`export * from \"./fragment-masking\";\nexport * from \"./gql\";`);\n\n    // gql.ts\n    const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n    expect(gqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import * as types from './graphql';\n      import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n      /**\n       * Map of all GraphQL operations in the project.\n       *\n       * This map has several performance disadvantages:\n       * 1. It is not tree-shakeable, so it will include all operations in the project.\n       * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n       * 3. It does not support dead code elimination, so it will add unused operations.\n       *\n       * Therefore it is highly recommended to use the babel or swc plugin for production.\n       * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n       */\n      type Documents = {\n          \"\\\\n  query a {\\\\n    a\\\\n  }\\\\n\": typeof types.ADocument,\n          \"\\\\n  query b {\\\\n    b\\\\n  }\\\\n\": typeof types.BDocument,\n          \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": typeof types.CFragmentDoc,\n      };\n      const documents: Documents = {\n          \"\\\\n  query a {\\\\n    a\\\\n  }\\\\n\": types.ADocument,\n          \"\\\\n  query b {\\\\n    b\\\\n  }\\\\n\": types.BDocument,\n          \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": types.CFragmentDoc,\n      };\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       *\n       *\n       * @example\n       * \\`\\`\\`ts\n       * const query = graphql(\\`query GetUser($id: ID!) { user(id: $id) { name } }\\`);\n       * \\`\\`\\`\n       *\n       * The query argument is unknown!\n       * Please regenerate the types.\n       */\n      export function graphql(source: string): unknown;\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query a {\\\\n    a\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query a {\\\\n    a\\\\n  }\\\\n\"];\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query b {\\\\n    b\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query b {\\\\n    b\\\\n  }\\\\n\"];\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"];\n\n      export function graphql(source: string) {\n        return (documents as any)[source] ?? {};\n      }\n\n      export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<  infer TType,  any>  ? TType  : never;\"\n    `);\n\n    // graphql.ts\n    const graphqlFile = result.find(file => file.filename === 'out1/gql.ts');\n    expect(graphqlFile).toBeDefined();\n  });\n\n  it('generates \\\\n regardless of whether the source contains LF or CRLF', async () => {\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          type Query {\n            a: String\n            b: String\n            c: String\n          }\n        `,\n      ],\n      documents: path.join(__dirname, 'fixtures/crlf-operation.ts'),\n      generates: {\n        'out1/': {\n          preset,\n        },\n      },\n    });\n    const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n    expect(gqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import * as types from './graphql';\n      import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n      /**\n       * Map of all GraphQL operations in the project.\n       *\n       * This map has several performance disadvantages:\n       * 1. It is not tree-shakeable, so it will include all operations in the project.\n       * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n       * 3. It does not support dead code elimination, so it will add unused operations.\n       *\n       * Therefore it is highly recommended to use the babel or swc plugin for production.\n       * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n       */\n      type Documents = {\n          \"\\\\n  query a {\\\\n    a\\\\n  }\\\\n\": typeof types.ADocument,\n          \"\\\\n  query b {\\\\n    b\\\\n  }\\\\n\": typeof types.BDocument,\n          \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": typeof types.CFragmentDoc,\n      };\n      const documents: Documents = {\n          \"\\\\n  query a {\\\\n    a\\\\n  }\\\\n\": types.ADocument,\n          \"\\\\n  query b {\\\\n    b\\\\n  }\\\\n\": types.BDocument,\n          \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": types.CFragmentDoc,\n      };\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       *\n       *\n       * @example\n       * \\`\\`\\`ts\n       * const query = graphql(\\`query GetUser($id: ID!) { user(id: $id) { name } }\\`);\n       * \\`\\`\\`\n       *\n       * The query argument is unknown!\n       * Please regenerate the types.\n       */\n      export function graphql(source: string): unknown;\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query a {\\\\n    a\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query a {\\\\n    a\\\\n  }\\\\n\"];\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query b {\\\\n    b\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query b {\\\\n    b\\\\n  }\\\\n\"];\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"];\n\n      export function graphql(source: string) {\n        return (documents as any)[source] ?? {};\n      }\n\n      export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<  infer TType,  any>  ? TType  : never;\"\n    `);\n  });\n\n  it(\"follows 'useTypeImports': true\", async () => {\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          type Query {\n            a: String\n            b: String\n            c: String\n          }\n        `,\n      ],\n      documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n      generates: {\n        'out1/': {\n          preset,\n        },\n      },\n      config: {\n        useTypeImports: true,\n      },\n    });\n\n    expect(result.length).toBe(4);\n    const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n    expect(gqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import * as types from './graphql';\n      import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n      /**\n       * Map of all GraphQL operations in the project.\n       *\n       * This map has several performance disadvantages:\n       * 1. It is not tree-shakeable, so it will include all operations in the project.\n       * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n       * 3. It does not support dead code elimination, so it will add unused operations.\n       *\n       * Therefore it is highly recommended to use the babel or swc plugin for production.\n       * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n       */\n      type Documents = {\n          \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\": typeof types.ADocument,\n          \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\": typeof types.BDocument,\n          \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": typeof types.CFragmentDoc,\n      };\n      const documents: Documents = {\n          \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\": types.ADocument,\n          \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\": types.BDocument,\n          \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": types.CFragmentDoc,\n      };\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       *\n       *\n       * @example\n       * \\`\\`\\`ts\n       * const query = graphql(\\`query GetUser($id: ID!) { user(id: $id) { name } }\\`);\n       * \\`\\`\\`\n       *\n       * The query argument is unknown!\n       * Please regenerate the types.\n       */\n      export function graphql(source: string): unknown;\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\"];\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\"];\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"];\n\n      export function graphql(source: string) {\n        return (documents as any)[source] ?? {};\n      }\n\n      export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<  infer TType,  any>  ? TType  : never;\"\n    `);\n    const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n    expect(graphqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n      export type Maybe<T> = T | null;\n      export type InputMaybe<T> = T | null | undefined;\n      export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n      export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n      export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n      export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n      export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n      /** All built-in and custom scalars, mapped to their actual values */\n      export type Scalars = {\n        ID: { input: string; output: string; }\n        String: { input: string; output: string; }\n        Boolean: { input: boolean; output: boolean; }\n        Int: { input: number; output: number; }\n        Float: { input: number; output: number; }\n      };\n\n      export type Query = {\n        __typename?: 'Query';\n        a?: Maybe<Scalars['String']['output']>;\n        b?: Maybe<Scalars['String']['output']>;\n        c?: Maybe<Scalars['String']['output']>;\n      };\n\n      export type AQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type AQuery = { __typename?: 'Query', a?: string | null };\n\n      export type BQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type BQuery = { __typename?: 'Query', b?: string | null };\n\n      export type CFragment = { __typename?: 'Query', c?: string | null } & { ' $fragmentName'?: 'CFragment' };\n\n      export const CFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"C\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Query\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"c\"}}]}}]} as unknown as DocumentNode<CFragment, unknown>;\n      export const ADocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"}}]}}]} as unknown as DocumentNode<AQuery, AQueryVariables>;\n      export const BDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"B\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<BQuery, BQueryVariables>;\"\n    `);\n\n    expect(graphqlFile.content).toContain(\n      \"import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'\"\n    );\n    expect(gqlFile.content).toContain(\n      \"import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'\"\n    );\n  });\n\n  it(\"follows 'nonOptionalTypename': true\", async () => {\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          type Query {\n            a: String\n            b: String\n            c: String\n          }\n        `,\n      ],\n      documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n      generates: {\n        'out1/': {\n          preset,\n        },\n      },\n      config: {\n        nonOptionalTypename: true,\n      },\n    });\n\n    expect(result.length).toBe(4);\n    const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n    expect(gqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import * as types from './graphql';\n      import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n      /**\n       * Map of all GraphQL operations in the project.\n       *\n       * This map has several performance disadvantages:\n       * 1. It is not tree-shakeable, so it will include all operations in the project.\n       * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n       * 3. It does not support dead code elimination, so it will add unused operations.\n       *\n       * Therefore it is highly recommended to use the babel or swc plugin for production.\n       * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n       */\n      type Documents = {\n          \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\": typeof types.ADocument,\n          \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\": typeof types.BDocument,\n          \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": typeof types.CFragmentDoc,\n      };\n      const documents: Documents = {\n          \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\": types.ADocument,\n          \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\": types.BDocument,\n          \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": types.CFragmentDoc,\n      };\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       *\n       *\n       * @example\n       * \\`\\`\\`ts\n       * const query = graphql(\\`query GetUser($id: ID!) { user(id: $id) { name } }\\`);\n       * \\`\\`\\`\n       *\n       * The query argument is unknown!\n       * Please regenerate the types.\n       */\n      export function graphql(source: string): unknown;\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\"];\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\"];\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"];\n\n      export function graphql(source: string) {\n        return (documents as any)[source] ?? {};\n      }\n\n      export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<  infer TType,  any>  ? TType  : never;\"\n    `);\n    const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n    expect(graphqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n      export type Maybe<T> = T | null;\n      export type InputMaybe<T> = T | null | undefined;\n      export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n      export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n      export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n      export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n      export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n      /** All built-in and custom scalars, mapped to their actual values */\n      export type Scalars = {\n        ID: { input: string; output: string; }\n        String: { input: string; output: string; }\n        Boolean: { input: boolean; output: boolean; }\n        Int: { input: number; output: number; }\n        Float: { input: number; output: number; }\n      };\n\n      export type Query = {\n        __typename: 'Query';\n        a?: Maybe<Scalars['String']['output']>;\n        b?: Maybe<Scalars['String']['output']>;\n        c?: Maybe<Scalars['String']['output']>;\n      };\n\n      export type AQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type AQuery = { __typename: 'Query', a?: string | null };\n\n      export type BQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type BQuery = { __typename: 'Query', b?: string | null };\n\n      export type CFragment = { __typename: 'Query', c?: string | null } & { ' $fragmentName'?: 'CFragment' };\n\n      export const CFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"C\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Query\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"c\"}}]}}]} as unknown as DocumentNode<CFragment, unknown>;\n      export const ADocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"}}]}}]} as unknown as DocumentNode<AQuery, AQueryVariables>;\n      export const BDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"B\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<BQuery, BQueryVariables>;\"\n    `);\n\n    expect(graphqlFile.content).toContain(\"__typename: 'Query';\");\n  });\n\n  it('supports Apollo fragment masking', async () => {\n    const { result } = await executeCodegen({\n      schema: /* GraphQL */ `\n        type Query {\n          me: User\n        }\n\n        type User {\n          id: ID!\n          name: String!\n          age: Int!\n        }\n      `,\n      documents: /* GraphQL */ `\n        query Me {\n          unmasked: me {\n            id\n            ...User_Me @unmask\n          }\n          masked: me {\n            id\n            ...User_Me\n          }\n        }\n\n        fragment User_Me on User {\n          name\n          age\n        }\n      `,\n      generates: {\n        'out1/': {\n          preset,\n          presetConfig: { fragmentMasking: false },\n          config: {\n            inlineFragmentTypes: 'mask',\n            customDirectives: { apolloUnmask: true },\n          },\n        },\n      },\n    });\n\n    const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n    expect(graphqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n      export type Maybe<T> = T | null;\n      export type InputMaybe<T> = T | null | undefined;\n      export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n      export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n      export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n      export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n      export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n      /** All built-in and custom scalars, mapped to their actual values */\n      export type Scalars = {\n        ID: { input: string; output: string; }\n        String: { input: string; output: string; }\n        Boolean: { input: boolean; output: boolean; }\n        Int: { input: number; output: number; }\n        Float: { input: number; output: number; }\n      };\n\n      export type Query = {\n        __typename?: 'Query';\n        me?: Maybe<User>;\n      };\n\n      export type User = {\n        __typename?: 'User';\n        age: Scalars['Int']['output'];\n        id: Scalars['ID']['output'];\n        name: Scalars['String']['output'];\n      };\n\n      export type MeQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type MeQuery = { __typename?: 'Query', unmasked?: { __typename?: 'User', id: string, name: string, age: number } | null, masked?: (\n          { __typename?: 'User', id: string }\n          & { ' $fragmentRefs'?: { 'User_MeFragment': User_MeFragment } }\n        ) | null };\n\n      export type User_MeFragment = { __typename?: 'User', name: string, age: number } & { ' $fragmentName'?: 'User_MeFragment' };\n\n      export const User_MeFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"User_Me\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"User\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}}]}}]} as unknown as DocumentNode<User_MeFragment, unknown>;\n      export const MeDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Me\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"unmasked\"},\"name\":{\"kind\":\"Name\",\"value\":\"me\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"User_Me\"},\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"unmask\"}}]}]}},{\"kind\":\"Field\",\"alias\":{\"kind\":\"Name\",\"value\":\"masked\"},\"name\":{\"kind\":\"Name\",\"value\":\"me\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"User_Me\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"User_Me\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"User\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"age\"}}]}}]} as unknown as DocumentNode<MeQuery, MeQueryVariables>;\"\n    `);\n  });\n\n  it('prevent duplicate operations', async () => {\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          type Query {\n            a: String\n          }\n        `,\n      ],\n      documents: path.join(__dirname, 'fixtures/duplicate-operation.ts'),\n      generates: {\n        'out1/': {\n          preset,\n        },\n      },\n      config: {\n        useTypeImports: true,\n      },\n    });\n\n    expect(result.length).toBe(4);\n    const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n    expect(gqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import * as types from './graphql';\n      import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n      /**\n       * Map of all GraphQL operations in the project.\n       *\n       * This map has several performance disadvantages:\n       * 1. It is not tree-shakeable, so it will include all operations in the project.\n       * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n       * 3. It does not support dead code elimination, so it will add unused operations.\n       *\n       * Therefore it is highly recommended to use the babel or swc plugin for production.\n       * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n       */\n      type Documents = {\n          \"\\\\n  query a {\\\\n    a\\\\n  }\\\\n\": typeof types.ADocument,\n      };\n      const documents: Documents = {\n          \"\\\\n  query a {\\\\n    a\\\\n  }\\\\n\": types.ADocument,\n      };\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       *\n       *\n       * @example\n       * \\`\\`\\`ts\n       * const query = graphql(\\`query GetUser($id: ID!) { user(id: $id) { name } }\\`);\n       * \\`\\`\\`\n       *\n       * The query argument is unknown!\n       * Please regenerate the types.\n       */\n      export function graphql(source: string): unknown;\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query a {\\\\n    a\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query a {\\\\n    a\\\\n  }\\\\n\"];\n\n      export function graphql(source: string) {\n        return (documents as any)[source] ?? {};\n      }\n\n      export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<  infer TType,  any>  ? TType  : never;\"\n    `);\n    const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n    expect(graphqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n      export type Maybe<T> = T | null;\n      export type InputMaybe<T> = T | null | undefined;\n      export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n      export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n      export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n      export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n      export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n      /** All built-in and custom scalars, mapped to their actual values */\n      export type Scalars = {\n        ID: { input: string; output: string; }\n        String: { input: string; output: string; }\n        Boolean: { input: boolean; output: boolean; }\n        Int: { input: number; output: number; }\n        Float: { input: number; output: number; }\n      };\n\n      export type Query = {\n        __typename?: 'Query';\n        a?: Maybe<Scalars['String']['output']>;\n      };\n\n      export type AQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type AQuery = { __typename?: 'Query', a?: string | null };\n\n\n      export const ADocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"}}]}}]} as unknown as DocumentNode<AQuery, AQueryVariables>;\"\n    `);\n\n    expect(gqlFile.content.match(/query a {/g).length).toBe(4);\n  });\n\n  describe('fragment masking', () => {\n    it('fragmentMasking: false', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              fragmentMasking: false,\n            },\n          },\n        },\n      });\n\n      expect(result).toHaveLength(3);\n      const fileNames = result.map(res => res.filename);\n      expect(fileNames).toContain('out1/index.ts');\n      expect(fileNames).toContain('out1/gql.ts');\n      expect(fileNames).toContain('out1/graphql.ts');\n\n      const indexFile = result.find(file => file.filename === 'out1/index.ts');\n      expect(indexFile.content).toMatchInlineSnapshot(`\"export * from \"./gql\";\"`);\n      const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n      expect(gqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import * as types from './graphql';\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n        /**\n         * Map of all GraphQL operations in the project.\n         *\n         * This map has several performance disadvantages:\n         * 1. It is not tree-shakeable, so it will include all operations in the project.\n         * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n         * 3. It does not support dead code elimination, so it will add unused operations.\n         *\n         * Therefore it is highly recommended to use the babel or swc plugin for production.\n         * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n         */\n        type Documents = {\n            \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\": typeof types.ADocument,\n            \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\": typeof types.BDocument,\n            \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": typeof types.CFragmentDoc,\n        };\n        const documents: Documents = {\n            \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\": types.ADocument,\n            \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\": types.BDocument,\n            \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": types.CFragmentDoc,\n        };\n\n        /**\n         * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n         *\n         *\n         * @example\n         * \\`\\`\\`ts\n         * const query = graphql(\\`query GetUser($id: ID!) { user(id: $id) { name } }\\`);\n         * \\`\\`\\`\n         *\n         * The query argument is unknown!\n         * Please regenerate the types.\n         */\n        export function graphql(source: string): unknown;\n\n        /**\n         * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n         */\n        export function graphql(source: \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\"];\n        /**\n         * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n         */\n        export function graphql(source: \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\"];\n        /**\n         * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n         */\n        export function graphql(source: \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"];\n\n        export function graphql(source: string) {\n          return (documents as any)[source] ?? {};\n        }\n\n        export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<  infer TType,  any>  ? TType  : never;\"\n      `);\n    });\n\n    it('fragmentMasking: {}', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              fragmentMasking: {},\n            },\n          },\n        },\n      });\n\n      expect(result).toHaveLength(4);\n    });\n\n    it('fragmentMasking.unmaskFunctionName', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              fragmentMasking: {\n                unmaskFunctionName: 'iLikeTurtles',\n              },\n            },\n          },\n        },\n      });\n\n      expect(result).toHaveLength(4);\n      const gqlFile = result.find(file => file.filename === 'out1/fragment-masking.ts');\n      expect(gqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core';\n        import { FragmentDefinitionNode } from 'graphql';\n        import { Incremental } from './graphql';\n\n\n        export type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> = TDocumentType extends DocumentTypeDecoration<\n          infer TType,\n          any\n        >\n          ? [TType] extends [{ ' $fragmentName'?: infer TKey }]\n            ? TKey extends string\n              ? { ' $fragmentRefs'?: { [key in TKey]: TType } }\n              : never\n            : never\n          : never;\n\n        // return non-nullable if \\`fragmentType\\` is non-nullable\n        export function iLikeTurtles<TType>(\n          _documentNode: DocumentTypeDecoration<TType, any>,\n          fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>\n        ): TType;\n        // return nullable if \\`fragmentType\\` is undefined\n        export function iLikeTurtles<TType>(\n          _documentNode: DocumentTypeDecoration<TType, any>,\n          fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined\n        ): TType | undefined;\n        // return nullable if \\`fragmentType\\` is nullable\n        export function iLikeTurtles<TType>(\n          _documentNode: DocumentTypeDecoration<TType, any>,\n          fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null\n        ): TType | null;\n        // return nullable if \\`fragmentType\\` is nullable or undefined\n        export function iLikeTurtles<TType>(\n          _documentNode: DocumentTypeDecoration<TType, any>,\n          fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined\n        ): TType | null | undefined;\n        // return array of non-nullable if \\`fragmentType\\` is array of non-nullable\n        export function iLikeTurtles<TType>(\n          _documentNode: DocumentTypeDecoration<TType, any>,\n          fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n        ): Array<TType>;\n        // return array of nullable if \\`fragmentType\\` is array of nullable\n        export function iLikeTurtles<TType>(\n          _documentNode: DocumentTypeDecoration<TType, any>,\n          fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n        ): Array<TType> | null | undefined;\n        // return readonly array of non-nullable if \\`fragmentType\\` is array of non-nullable\n        export function iLikeTurtles<TType>(\n          _documentNode: DocumentTypeDecoration<TType, any>,\n          fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n        ): ReadonlyArray<TType>;\n        // return readonly array of nullable if \\`fragmentType\\` is array of nullable\n        export function iLikeTurtles<TType>(\n          _documentNode: DocumentTypeDecoration<TType, any>,\n          fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n        ): ReadonlyArray<TType> | null | undefined;\n        export function iLikeTurtles<TType>(\n          _documentNode: DocumentTypeDecoration<TType, any>,\n          fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | Array<FragmentType<DocumentTypeDecoration<TType, any>>> | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined\n        ): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n          return fragmentType as any;\n        }\n\n\n        export function makeFragmentData<\n          F extends DocumentTypeDecoration<any, any>,\n          FT extends ResultOf<F>\n        >(data: FT, _fragment: F): FragmentType<F> {\n          return data as FragmentType<F>;\n        }\n        export function isFragmentReady<TQuery, TFrag>(\n          queryNode: DocumentTypeDecoration<TQuery, any>,\n          fragmentNode: TypedDocumentNode<TFrag>,\n          data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined\n        ): data is FragmentType<typeof fragmentNode> {\n          const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__\n            ?.deferredFields;\n\n          if (!deferredFields) return true;\n\n          const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined;\n          const fragName = fragDef?.name?.value;\n\n          const fields = (fragName && deferredFields[fragName]) || [];\n          return fields.length > 0 && fields.every(field => data && field in data);\n        }\n        \"\n      `);\n    });\n\n    it('can accept null in useFragment', async () => {\n      const docPath = path.join(__dirname, 'fixtures/with-fragment.ts');\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              foo: Foo\n              foos: [Foo]\n            }\n\n            type Foo {\n              value: String\n            }\n          `,\n        ],\n        documents: docPath,\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              fragmentMasking: true,\n            },\n          },\n        },\n      });\n\n      const content = mergeOutputs([\n        ...result,\n        fs.readFileSync(docPath, 'utf8'),\n        `\n        function App(props: { data: FooQuery }) {\n          const fragment: FooFragment | null | undefined = useFragment(Fragment, props.data.foo);\n          return fragment == null ? \"no data\" : fragment.value;\n        }\n        `,\n      ]);\n      validateTs(content, undefined, false, true, [`Duplicate identifier 'DocumentNode'.`], true);\n    });\n\n    it('can accept list in useFragment', async () => {\n      const docPath = path.join(__dirname, 'fixtures/with-fragment.ts');\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              foo: Foo\n              foos: [Foo!]\n            }\n\n            type Foo {\n              value: String\n            }\n          `,\n        ],\n        documents: docPath,\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              fragmentMasking: true,\n            },\n          },\n        },\n      });\n\n      const content = mergeOutputs([\n        ...result,\n        fs.readFileSync(docPath, 'utf8'),\n        `\n        function App(props: { foos: Array<FragmentType<typeof Fragment>> }) {\n          const fragments: Array<FooFragment> = useFragment(Fragment, props.foos);\n          return fragments.map(f => f.value);\n        }\n        `,\n      ]);\n\n      validateTs(content, undefined, false, true, [`Duplicate identifier 'DocumentNode'.`], true);\n    });\n\n    it('useFragment preserves ReadonlyArray<T> type', async () => {\n      const docPath = path.join(__dirname, 'fixtures/with-fragment.ts');\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              foo: Foo\n              foos: [Foo!]\n            }\n\n            type Foo {\n              value: String\n            }\n          `,\n        ],\n        documents: docPath,\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              fragmentMasking: true,\n            },\n          },\n        },\n      });\n\n      const content = mergeOutputs([\n        ...result,\n        fs.readFileSync(docPath, 'utf8'),\n        `\n        function App(props: { data: FoosQuery }) {\n          const fragments: ReadonlyArray<FooFragment> | null | undefined = useFragment(Fragment, props.data.foos);\n          return fragments == null ? \"no data\" : fragments.map(f => f.value);\n        }\n        `,\n      ]);\n\n      validateTs(content, undefined, false, true, [`Duplicate identifier 'DocumentNode'.`], true);\n    });\n  });\n\n  it('generates correct named imports for ESM', async () => {\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          type Query {\n            a: String\n            b: String\n            c: String\n          }\n        `,\n      ],\n      documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n      generates: {\n        'out1/': {\n          preset,\n        },\n      },\n      importExtension: '.js',\n    });\n\n    expect(result).toHaveLength(4);\n    // index.ts (re-exports)\n    const indexFile = result.find(file => file.filename === 'out1/index.ts');\n    expect(indexFile.content).toEqual(`export * from \"./fragment-masking.js\";\nexport * from \"./gql.js\";`);\n\n    // gql.ts\n    const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n    expect(gqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import * as types from './graphql.js';\n      import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n      /**\n       * Map of all GraphQL operations in the project.\n       *\n       * This map has several performance disadvantages:\n       * 1. It is not tree-shakeable, so it will include all operations in the project.\n       * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n       * 3. It does not support dead code elimination, so it will add unused operations.\n       *\n       * Therefore it is highly recommended to use the babel or swc plugin for production.\n       * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n       */\n      type Documents = {\n          \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\": typeof types.ADocument,\n          \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\": typeof types.BDocument,\n          \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": typeof types.CFragmentDoc,\n      };\n      const documents: Documents = {\n          \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\": types.ADocument,\n          \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\": types.BDocument,\n          \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\": types.CFragmentDoc,\n      };\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       *\n       *\n       * @example\n       * \\`\\`\\`ts\n       * const query = graphql(\\`query GetUser($id: ID!) { user(id: $id) { name } }\\`);\n       * \\`\\`\\`\n       *\n       * The query argument is unknown!\n       * Please regenerate the types.\n       */\n      export function graphql(source: string): unknown;\n\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query A {\\\\n    a\\\\n  }\\\\n\"];\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  query B {\\\\n    b\\\\n  }\\\\n\"];\n      /**\n       * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n       */\n      export function graphql(source: \"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"): (typeof documents)[\"\\\\n  fragment C on Query {\\\\n    c\\\\n  }\\\\n\"];\n\n      export function graphql(source: string) {\n        return (documents as any)[source] ?? {};\n      }\n\n      export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<  infer TType,  any>  ? TType  : never;\"\n    `);\n\n    // graphql.ts\n    const graphqlFile = result.find(file => file.filename === 'out1/gql.ts');\n    expect(graphqlFile).toBeDefined();\n  });\n\n  it('should dedupe fragments - #8670', async () => {\n    const dir = path.join(__dirname, 'tmp/duplicate-fragments');\n    const cleanUp = async () => {\n      await fs.promises.rm(dir, { recursive: true, force: true });\n    };\n\n    const docPath = path.join(__dirname, 'fixtures/reused-fragment.ts');\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          type Query {\n            user(id: ID!): User!\n            event(id: ID!): Event!\n          }\n\n          type User {\n            id: ID!\n            username: String!\n            email: String!\n          }\n\n          type Event {\n            id: ID!\n            owner: User!\n            attendees: [User!]!\n          }\n        `,\n      ],\n      documents: [docPath],\n      generates: {\n        'out1/': {\n          preset,\n          plugins: [],\n        },\n      },\n    });\n\n    // TODO: Consider using in-memory file system for tests like this.\n    try {\n      await cleanUp();\n    } catch {}\n    await fs.promises.mkdir(path.join(dir, 'out1'), { recursive: true });\n    for (const file of result) {\n      if (file.filename === 'out1/graphql.ts') {\n        await fs.promises.writeFile(path.join(dir, file.filename), file.content, 'utf-8');\n      }\n    }\n\n    const { default: jiti } = await import('jiti');\n    const loader = jiti('', {});\n\n    const { EventQueryDocument } = loader(path.join(dir, 'out1/graphql.ts'));\n\n    const printed = print(EventQueryDocument);\n\n    expect(printed.match(/fragment SharedComponentFragment on User/g)?.length).toBe(1);\n\n    await cleanUp();\n  });\n\n  it('should dedupe fragments in a \"string\" document mode', async () => {\n    const dir = path.join(__dirname, 'tmp/duplicate-fragments-string');\n    const cleanUp = async () => {\n      await fs.promises.rm(dir, { recursive: true, force: true });\n    };\n\n    const docPath = path.join(__dirname, 'fixtures/reused-fragment.ts');\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          type Query {\n            user(id: ID!): User!\n            event(id: ID!): Event!\n          }\n\n          type User {\n            id: ID!\n            username: String!\n            email: String!\n          }\n\n          type Event {\n            id: ID!\n            owner: User!\n            attendees: [User!]!\n          }\n        `,\n      ],\n      documents: [docPath],\n      generates: {\n        'out1/': {\n          preset,\n          plugins: [],\n          config: {\n            documentMode: 'string',\n          },\n        },\n      },\n    });\n\n    // TODO: Consider using in-memory file system for tests like this.\n    try {\n      await cleanUp();\n    } catch {}\n    await fs.promises.mkdir(path.join(dir, 'out1'), { recursive: true });\n    for (const file of result) {\n      if (file.filename === 'out1/graphql.ts') {\n        await fs.promises.writeFile(path.join(dir, file.filename), file.content, 'utf-8');\n      }\n    }\n\n    const { default: jiti } = await import('jiti');\n    const loader = jiti('', {});\n\n    const { EventQueryDocument } = loader(path.join(dir, 'out1/graphql.ts'));\n\n    expect(EventQueryDocument.match(/fragment SharedComponentFragment on User/g)?.length).toBe(1);\n\n    await cleanUp();\n  });\n\n  describe('when no operations are found', () => {\n    it('still generates the helper `graphql()` (or under another `presetConfig.gqlTagName` name) function', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        generates: {\n          'out1/': {\n            preset,\n          },\n        },\n        emitLegacyCommonJSImports: false,\n      });\n\n      expect(result).toHaveLength(4);\n      // index.ts (re-exports)\n      const indexFile = result.find(file => file.filename === 'out1/index.ts');\n      expect(indexFile.content).toEqual(`export * from \"./fragment-masking.js\";\nexport * from \"./gql.js\";`);\n\n      // gql.ts\n      const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n      expect(gqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import * as types from './graphql.js';\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n\n        const documents = {};\n        /**\n         * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n         *\n         *\n         * @example\n         * \\`\\`\\`ts\n         * const query = graphql(\\`query GetUser($id: ID!) { user(id: $id) { name } }\\`);\n         * \\`\\`\\`\n         *\n         * The query argument is unknown!\n         * Please regenerate the types.\n         */\n        export function graphql(source: string): unknown;\n\n        export function graphql(source: string) {\n          return (documents as any)[source] ?? {};\n        }\n\n        export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<  infer TType,  any>  ? TType  : never;\"\n      `);\n      // graphql.ts\n      const graphqlFile = result.find(file => file.filename === 'out1/gql.ts');\n      expect(graphqlFile).toBeDefined();\n    });\n  });\n\n  describe('importExtension configuration', () => {\n    it('generates imports with .mjs extension when importExtension is set to .mjs', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n          },\n        },\n        importExtension: '.mjs',\n      });\n\n      expect(result).toHaveLength(4);\n      const indexFile = result.find(file => file.filename === 'out1/index.ts');\n      expect(indexFile.content).toEqual(`export * from \"./fragment-masking.mjs\";\nexport * from \"./gql.mjs\";`);\n\n      const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n      expect(gqlFile.content).toContain(`import * as types from './graphql.mjs';`);\n    });\n\n    it('generates imports with no extension when importExtension is empty string', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n          },\n        },\n        importExtension: '',\n      });\n\n      expect(result).toHaveLength(4);\n      const indexFile = result.find(file => file.filename === 'out1/index.ts');\n      expect(indexFile.content).toEqual(`export * from \"./fragment-masking\";\nexport * from \"./gql\";`);\n\n      const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n      expect(gqlFile.content).toContain(`import * as types from './graphql';`);\n    });\n\n    it('uses importExtension over emitLegacyCommonJSImports when both are set', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n          },\n        },\n        importExtension: '.mjs',\n        emitLegacyCommonJSImports: false,\n      });\n\n      expect(result).toHaveLength(4);\n      const indexFile = result.find(file => file.filename === 'out1/index.ts');\n      // Should use .mjs from importExtension, not .js from emitLegacyCommonJSImports: false\n      expect(indexFile.content).toEqual(`export * from \"./fragment-masking.mjs\";\nexport * from \"./gql.mjs\";`);\n\n      const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n      expect(gqlFile.content).toContain(`import * as types from './graphql.mjs';`);\n    });\n\n    it('uses importExtension set to empty string even when emitLegacyCommonJSImports is false', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n          },\n        },\n        importExtension: '',\n        emitLegacyCommonJSImports: false,\n      });\n\n      expect(result).toHaveLength(4);\n      const indexFile = result.find(file => file.filename === 'out1/index.ts');\n      // Should use empty string from importExtension, not .js from emitLegacyCommonJSImports: false\n      expect(indexFile.content).toEqual(`export * from \"./fragment-masking\";\nexport * from \"./gql\";`);\n\n      const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n      expect(gqlFile.content).toContain(`import * as types from './graphql';`);\n    });\n\n    it('generates imports with custom .cjs extension when importExtension is set to .cjs', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n          },\n        },\n        importExtension: '.cjs',\n      });\n\n      expect(result).toHaveLength(4);\n      const indexFile = result.find(file => file.filename === 'out1/index.ts');\n      expect(indexFile.content).toEqual(`export * from \"./fragment-masking.cjs\";\nexport * from \"./gql.cjs\";`);\n\n      const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n      expect(gqlFile.content).toContain(`import * as types from './graphql.cjs';`);\n    });\n  });\n\n  it('embed metadata in executable document node', async () => {\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          type Query {\n            a: String\n            b: String\n            c: String\n          }\n        `,\n      ],\n      documents: [\n        /* GraphQL */ `\n          query aaa {\n            a\n          }\n        `,\n        /* GraphQL */ `\n          query bbb {\n            b\n          }\n        `,\n      ],\n      generates: {\n        'out1/': {\n          preset,\n          presetConfig: {\n            onExecutableDocumentNode(node) {\n              return {\n                cacheKeys: [node.definitions[0].name.value],\n              };\n            },\n          },\n        },\n      },\n      emitLegacyCommonJSImports: false,\n    });\n    const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n    expect(graphqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n      export type Maybe<T> = T | null;\n      export type InputMaybe<T> = T | null | undefined;\n      export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n      export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n      export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n      export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n      export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n      /** All built-in and custom scalars, mapped to their actual values */\n      export type Scalars = {\n        ID: { input: string; output: string; }\n        String: { input: string; output: string; }\n        Boolean: { input: boolean; output: boolean; }\n        Int: { input: number; output: number; }\n        Float: { input: number; output: number; }\n      };\n\n      export type Query = {\n        __typename?: 'Query';\n        a?: Maybe<Scalars['String']['output']>;\n        b?: Maybe<Scalars['String']['output']>;\n        c?: Maybe<Scalars['String']['output']>;\n      };\n\n      export type BbbQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type BbbQuery = { __typename?: 'Query', b?: string | null };\n\n      export type AaaQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type AaaQuery = { __typename?: 'Query', a?: string | null };\n\n\n      export const BbbDocument = {\"__meta__\":{\"cacheKeys\":[\"bbb\"]},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"bbb\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<BbbQuery, BbbQueryVariables>;\n      export const AaaDocument = {\"__meta__\":{\"cacheKeys\":[\"aaa\"]},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"aaa\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"}}]}}]} as unknown as DocumentNode<AaaQuery, AaaQueryVariables>;\"\n    `);\n  });\n\n  describe('persisted operations', () => {\n    it('apply default settings', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              persistedDocuments: true,\n            },\n          },\n        },\n        emitLegacyCommonJSImports: false,\n      });\n\n      expect(result).toHaveLength(5);\n\n      const persistedDocuments = result.find(file => file.filename === 'out1/persisted-documents.json');\n\n      expect(persistedDocuments.content).toMatchInlineSnapshot(`\n        \"{\n          \"b61b879c1eb0040bce65d70c8adfb1ae9360f52f\": \"query A { a }\",\n          \"c3ea9f3f937d47d72c70055ea55c7cf88a35e608\": \"query B { b }\"\n        }\"\n      `);\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          a?: Maybe<Scalars['String']['output']>;\n          b?: Maybe<Scalars['String']['output']>;\n          c?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type AQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type AQuery = { __typename?: 'Query', a?: string | null };\n\n        export type BQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type BQuery = { __typename?: 'Query', b?: string | null };\n\n        export type CFragment = { __typename?: 'Query', c?: string | null } & { ' $fragmentName'?: 'CFragment' };\n\n        export const CFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"C\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Query\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"c\"}}]}}]} as unknown as DocumentNode<CFragment, unknown>;\n        export const ADocument = {\"__meta__\":{\"hash\":\"b61b879c1eb0040bce65d70c8adfb1ae9360f52f\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"}}]}}]} as unknown as DocumentNode<AQuery, AQueryVariables>;\n        export const BDocument = {\"__meta__\":{\"hash\":\"c3ea9f3f937d47d72c70055ea55c7cf88a35e608\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"B\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<BQuery, BQueryVariables>;\"\n      `);\n    });\n\n    it('mode=\"replaceDocumentWithHash\"', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              persistedDocuments: {\n                mode: 'replaceDocumentWithHash',\n              },\n            },\n          },\n        },\n        emitLegacyCommonJSImports: false,\n      });\n\n      expect(result).toHaveLength(5);\n\n      const persistedDocuments = result.find(file => file.filename === 'out1/persisted-documents.json');\n\n      expect(persistedDocuments.content).toMatchInlineSnapshot(`\n        \"{\n          \"b61b879c1eb0040bce65d70c8adfb1ae9360f52f\": \"query A { a }\",\n          \"c3ea9f3f937d47d72c70055ea55c7cf88a35e608\": \"query B { b }\"\n        }\"\n      `);\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          a?: Maybe<Scalars['String']['output']>;\n          b?: Maybe<Scalars['String']['output']>;\n          c?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type AQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type AQuery = { __typename?: 'Query', a?: string | null };\n\n        export type BQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type BQuery = { __typename?: 'Query', b?: string | null };\n\n        export type CFragment = { __typename?: 'Query', c?: string | null } & { ' $fragmentName'?: 'CFragment' };\n\n        export const CFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"C\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Query\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"c\"}}]}}]} as unknown as DocumentNode<CFragment, unknown>;\n        export const ADocument = {\"__meta__\":{\"hash\":\"b61b879c1eb0040bce65d70c8adfb1ae9360f52f\"}} as unknown as DocumentNode<AQuery, AQueryVariables>;\n        export const BDocument = {\"__meta__\":{\"hash\":\"c3ea9f3f937d47d72c70055ea55c7cf88a35e608\"}} as unknown as DocumentNode<BQuery, BQueryVariables>;\"\n      `);\n    });\n\n    it('hashPropertyName=\"custom_property_name\"', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              persistedDocuments: {\n                hashPropertyName: 'custom_property_name',\n              },\n            },\n          },\n        },\n        emitLegacyCommonJSImports: false,\n      });\n\n      expect(result).toHaveLength(5);\n\n      const persistedDocuments = result.find(file => file.filename === 'out1/persisted-documents.json');\n\n      expect(persistedDocuments.content).toMatchInlineSnapshot(`\n        \"{\n          \"b61b879c1eb0040bce65d70c8adfb1ae9360f52f\": \"query A { a }\",\n          \"c3ea9f3f937d47d72c70055ea55c7cf88a35e608\": \"query B { b }\"\n        }\"\n      `);\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          a?: Maybe<Scalars['String']['output']>;\n          b?: Maybe<Scalars['String']['output']>;\n          c?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type AQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type AQuery = { __typename?: 'Query', a?: string | null };\n\n        export type BQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type BQuery = { __typename?: 'Query', b?: string | null };\n\n        export type CFragment = { __typename?: 'Query', c?: string | null } & { ' $fragmentName'?: 'CFragment' };\n\n        export const CFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"C\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Query\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"c\"}}]}}]} as unknown as DocumentNode<CFragment, unknown>;\n        export const ADocument = {\"__meta__\":{\"custom_property_name\":\"b61b879c1eb0040bce65d70c8adfb1ae9360f52f\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"}}]}}]} as unknown as DocumentNode<AQuery, AQueryVariables>;\n        export const BDocument = {\"__meta__\":{\"custom_property_name\":\"c3ea9f3f937d47d72c70055ea55c7cf88a35e608\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"B\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<BQuery, BQueryVariables>;\"\n      `);\n    });\n\n    it('embed metadata in executable document node', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: [\n          /* GraphQL */ `\n            query aaa {\n              a\n            }\n          `,\n          /* GraphQL */ `\n            query bbb {\n              b\n            }\n          `,\n        ],\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              persistedDocuments: true,\n              onExecutableDocumentNode(node) {\n                return {\n                  cacheKeys: [node.definitions[0].name.value],\n                };\n              },\n            },\n          },\n        },\n        emitLegacyCommonJSImports: false,\n      });\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          a?: Maybe<Scalars['String']['output']>;\n          b?: Maybe<Scalars['String']['output']>;\n          c?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type AaaQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type AaaQuery = { __typename?: 'Query', a?: string | null };\n\n        export type BbbQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type BbbQuery = { __typename?: 'Query', b?: string | null };\n\n\n        export const AaaDocument = {\"__meta__\":{\"cacheKeys\":[\"aaa\"],\"hash\":\"682f60dea844320c05fcb4fb6c4118015902c9a8\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"aaa\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"}}]}}]} as unknown as DocumentNode<AaaQuery, AaaQueryVariables>;\n        export const BbbDocument = {\"__meta__\":{\"cacheKeys\":[\"bbb\"],\"hash\":\"2a8e0849914b13ebc13b112ba5a502678d757511\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"bbb\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<BbbQuery, BbbQueryVariables>;\"\n      `);\n    });\n\n    it('hashAlgorithm=\"sha256\"', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              persistedDocuments: {\n                hashAlgorithm: 'sha256',\n              },\n            },\n          },\n        },\n        emitLegacyCommonJSImports: false,\n      });\n\n      expect(result).toHaveLength(5);\n\n      const persistedDocuments = result.find(file => file.filename === 'out1/persisted-documents.json');\n\n      expect(persistedDocuments.content).toMatchInlineSnapshot(`\n        \"{\n          \"7d0eedabb966107835cf307a0ebaf93b5d2cb8c30228611ffe3d27a53c211a0c\": \"query A { a }\",\n          \"a62a11aa72041e38d8c12ef77e1e7c208d9605db60bb5abb1717e8af98e4b410\": \"query B { b }\"\n        }\"\n      `);\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          a?: Maybe<Scalars['String']['output']>;\n          b?: Maybe<Scalars['String']['output']>;\n          c?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type AQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type AQuery = { __typename?: 'Query', a?: string | null };\n\n        export type BQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type BQuery = { __typename?: 'Query', b?: string | null };\n\n        export type CFragment = { __typename?: 'Query', c?: string | null } & { ' $fragmentName'?: 'CFragment' };\n\n        export const CFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"C\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Query\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"c\"}}]}}]} as unknown as DocumentNode<CFragment, unknown>;\n        export const ADocument = {\"__meta__\":{\"hash\":\"7d0eedabb966107835cf307a0ebaf93b5d2cb8c30228611ffe3d27a53c211a0c\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"}}]}}]} as unknown as DocumentNode<AQuery, AQueryVariables>;\n        export const BDocument = {\"__meta__\":{\"hash\":\"a62a11aa72041e38d8c12ef77e1e7c208d9605db60bb5abb1717e8af98e4b410\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"B\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<BQuery, BQueryVariables>;\"\n      `);\n    });\n\n    // This test serves to demonstrate that the custom hash function can perform arbitrary logic\n    // Removing whitespace has no real-world application but clearly shows the custom hash function is being used\n    it('custom hash remove whitespace', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              persistedDocuments: {\n                hashAlgorithm: (operation: string) => {\n                  return operation.replace(/\\s/g, '');\n                },\n              },\n            },\n          },\n        },\n        emitLegacyCommonJSImports: false,\n      });\n\n      expect(result).toHaveLength(5);\n\n      const persistedDocuments = result.find(file => file.filename === 'out1/persisted-documents.json');\n\n      expect(persistedDocuments.content).toMatchInlineSnapshot(`\n        \"{\n          \"queryA{a}\": \"query A { a }\",\n          \"queryB{b}\": \"query B { b }\"\n        }\"\n      `);\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          a?: Maybe<Scalars['String']['output']>;\n          b?: Maybe<Scalars['String']['output']>;\n          c?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type AQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type AQuery = { __typename?: 'Query', a?: string | null };\n\n        export type BQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type BQuery = { __typename?: 'Query', b?: string | null };\n\n        export type CFragment = { __typename?: 'Query', c?: string | null } & { ' $fragmentName'?: 'CFragment' };\n\n        export const CFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"C\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Query\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"c\"}}]}}]} as unknown as DocumentNode<CFragment, unknown>;\n        export const ADocument = {\"__meta__\":{\"hash\":\"queryA{a}\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"}}]}}]} as unknown as DocumentNode<AQuery, AQueryVariables>;\n        export const BDocument = {\"__meta__\":{\"hash\":\"queryB{b}\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"B\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<BQuery, BQueryVariables>;\"\n      `);\n    });\n\n    // Tests that the custom hash function can replicate the logic and behavior by re-implementing the existing hash function (for sha256)\n    it('custom hash sha256', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              persistedDocuments: {\n                hashAlgorithm: (operation: string) => {\n                  const shasum = crypto.createHash('sha256');\n                  shasum.update(operation);\n                  return shasum.digest('hex');\n                },\n              },\n            },\n          },\n        },\n        emitLegacyCommonJSImports: false,\n      });\n\n      expect(result).toHaveLength(5);\n\n      const persistedDocuments = result.find(file => file.filename === 'out1/persisted-documents.json');\n\n      expect(persistedDocuments.content).toMatchInlineSnapshot(`\n        \"{\n          \"7d0eedabb966107835cf307a0ebaf93b5d2cb8c30228611ffe3d27a53c211a0c\": \"query A { a }\",\n          \"a62a11aa72041e38d8c12ef77e1e7c208d9605db60bb5abb1717e8af98e4b410\": \"query B { b }\"\n        }\"\n      `);\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          a?: Maybe<Scalars['String']['output']>;\n          b?: Maybe<Scalars['String']['output']>;\n          c?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type AQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type AQuery = { __typename?: 'Query', a?: string | null };\n\n        export type BQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type BQuery = { __typename?: 'Query', b?: string | null };\n\n        export type CFragment = { __typename?: 'Query', c?: string | null } & { ' $fragmentName'?: 'CFragment' };\n\n        export const CFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"C\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Query\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"c\"}}]}}]} as unknown as DocumentNode<CFragment, unknown>;\n        export const ADocument = {\"__meta__\":{\"hash\":\"7d0eedabb966107835cf307a0ebaf93b5d2cb8c30228611ffe3d27a53c211a0c\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"}}]}}]} as unknown as DocumentNode<AQuery, AQueryVariables>;\n        export const BDocument = {\"__meta__\":{\"hash\":\"a62a11aa72041e38d8c12ef77e1e7c208d9605db60bb5abb1717e8af98e4b410\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"B\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<BQuery, BQueryVariables>;\"\n      `);\n    });\n\n    // Custom hash example used in `preset-client.mdx` docs\n    it('custom hash docs sha512', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              a: String\n              b: String\n              c: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/simple-uppercase-operation-name.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              persistedDocuments: {\n                hashAlgorithm: (operation: string) => {\n                  const shasum = crypto.createHash('sha512');\n                  shasum.update(operation);\n                  return shasum.digest('hex');\n                },\n              },\n            },\n          },\n        },\n        emitLegacyCommonJSImports: false,\n      });\n\n      expect(result).toHaveLength(5);\n\n      const persistedDocuments = result.find(file => file.filename === 'out1/persisted-documents.json');\n\n      expect(persistedDocuments.content).toMatchInlineSnapshot(`\n        \"{\n          \"a82d8b22f2bf805563146dc8ad80b2eb054845441539e3a5a69d1f534bb5bc0bd4f9470053b9f61b6aa1966cfc2f67406258102e5ee3a356a5d171506f3ede50\": \"query A { a }\",\n          \"bdc3d5b1e0dc35d9d21f8baadf515c472850baf279c8dd266fb21e8b8b29758d2386329f19a93dc101f3a6dd1214f5214835451e7eaf4410408d5c89f2e20a09\": \"query B { b }\"\n        }\"\n      `);\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          a?: Maybe<Scalars['String']['output']>;\n          b?: Maybe<Scalars['String']['output']>;\n          c?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type AQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type AQuery = { __typename?: 'Query', a?: string | null };\n\n        export type BQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type BQuery = { __typename?: 'Query', b?: string | null };\n\n        export type CFragment = { __typename?: 'Query', c?: string | null } & { ' $fragmentName'?: 'CFragment' };\n\n        export const CFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"C\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Query\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"c\"}}]}}]} as unknown as DocumentNode<CFragment, unknown>;\n        export const ADocument = {\"__meta__\":{\"hash\":\"a82d8b22f2bf805563146dc8ad80b2eb054845441539e3a5a69d1f534bb5bc0bd4f9470053b9f61b6aa1966cfc2f67406258102e5ee3a356a5d171506f3ede50\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"}}]}}]} as unknown as DocumentNode<AQuery, AQueryVariables>;\n        export const BDocument = {\"__meta__\":{\"hash\":\"bdc3d5b1e0dc35d9d21f8baadf515c472850baf279c8dd266fb21e8b8b29758d2386329f19a93dc101f3a6dd1214f5214835451e7eaf4410408d5c89f2e20a09\"},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"B\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<BQuery, BQueryVariables>;\"\n      `);\n    });\n  });\n\n  it('correctly handle fragment references', async () => {\n    const { result } = await executeCodegen({\n      schema: /* GraphQL */ `\n        type Query {\n          a: A!\n        }\n\n        type A {\n          b: String!\n          a: A!\n        }\n      `,\n      documents: [\n        /* GraphQL */ `\n          fragment AC on A {\n            b\n          }\n        `,\n        /* GraphQL */ `\n          fragment AA on A {\n            b\n          }\n        `,\n        /* GraphQL */ `\n          fragment AB on A {\n            b\n            ...AC\n            ...AA\n          }\n        `,\n        /* GraphQL */ `\n          query OI {\n            a {\n              ...AB\n              ...AC\n            }\n          }\n        `,\n      ],\n      generates: {\n        'out1/': {\n          preset,\n          plugins: [],\n        },\n      },\n    });\n    const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n    expect(graphqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n      export type Maybe<T> = T | null;\n      export type InputMaybe<T> = T | null | undefined;\n      export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n      export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n      export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n      export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n      export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n      /** All built-in and custom scalars, mapped to their actual values */\n      export type Scalars = {\n        ID: { input: string; output: string; }\n        String: { input: string; output: string; }\n        Boolean: { input: boolean; output: boolean; }\n        Int: { input: number; output: number; }\n        Float: { input: number; output: number; }\n      };\n\n      export type A = {\n        __typename?: 'A';\n        a: A;\n        b: Scalars['String']['output'];\n      };\n\n      export type Query = {\n        __typename?: 'Query';\n        a: A;\n      };\n\n      export type AbFragment = (\n        { __typename?: 'A', b: string }\n        & { ' $fragmentRefs'?: { 'AcFragment': AcFragment;'AaFragment': AaFragment } }\n      ) & { ' $fragmentName'?: 'AbFragment' };\n\n      export type AaFragment = { __typename?: 'A', b: string } & { ' $fragmentName'?: 'AaFragment' };\n\n      export type OiQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type OiQuery = { __typename?: 'Query', a: (\n          { __typename?: 'A' }\n          & { ' $fragmentRefs'?: { 'AbFragment': AbFragment;'AcFragment': AcFragment } }\n        ) };\n\n      export type AcFragment = { __typename?: 'A', b: string } & { ' $fragmentName'?: 'AcFragment' };\n\n      export const AcFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"AC\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<AcFragment, unknown>;\n      export const AaFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"AA\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<AaFragment, unknown>;\n      export const AbFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"AB\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}},{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"AC\"}},{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"AA\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"AC\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"AA\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}}]} as unknown as DocumentNode<AbFragment, unknown>;\n      export const OiDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"OI\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"a\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"AB\"}},{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"AC\"}}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"AC\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"AA\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"AB\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"A\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"b\"}},{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"AC\"}},{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"AA\"}}]}}]} as unknown as DocumentNode<OiQuery, OiQueryVariables>;\"\n    `);\n  });\n\n  describe('handles @defer directive', () => {\n    it('generates correct types and metadata', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              foo: Foo\n              foos: [Foo]\n            }\n\n            type Foo {\n              id: String\n              value: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/with-deferred-fragment.ts'),\n        generates: {\n          'out1/': {\n            preset,\n          },\n        },\n      });\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Foo = {\n          __typename?: 'Foo';\n          id?: Maybe<Scalars['String']['output']>;\n          value?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          foo?: Maybe<Foo>;\n          foos?: Maybe<Array<Maybe<Foo>>>;\n        };\n\n        export type FooQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type FooQuery = { __typename?: 'Query', foo?: { __typename?: 'Foo' } & (\n            { __typename?: 'Foo' }\n            & { ' $fragmentRefs'?: { 'FooFragment': Incremental<FooFragment> } }\n          ) | null };\n\n        export type FoosQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type FoosQuery = { __typename?: 'Query', foos?: Array<{ __typename?: 'Foo' } & (\n            { __typename?: 'Foo' }\n            & { ' $fragmentRefs'?: { 'FooFragment': Incremental<FooFragment> } }\n          ) | null> | null };\n\n        export type FooFragment = { __typename?: 'Foo', value?: string | null } & { ' $fragmentName'?: 'FooFragment' };\n\n        export type FooFragment = { __typename?: 'Foo', id?: string | null } & ({ __typename?: 'Foo', value?: string | null } | { __typename?: 'Foo', value?: never }) & { ' $fragmentName'?: 'FooFragment' };\n\n        export type FooNestedFragment = { __typename?: 'Foo', id?: string | null } & (\n          { __typename?: 'Foo' }\n          & { ' $fragmentRefs'?: { 'FooFragment': Incremental<FooFragment> } }\n        ) & { ' $fragmentName'?: 'FooNestedFragment' };\n\n        export const FooFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"}}]}}]} as unknown as DocumentNode<FooFragment, unknown>;\n        export const FooFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"foo\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"defer\"}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"}}]}}]}}]} as unknown as DocumentNode<FooFragment, unknown>;\n        export const FooNestedFragmentDoc = {\"__meta__\":{\"deferredFields\":{\"foo\":[\"id\"]}},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"fooNested\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"foo\"},\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"defer\"}}]}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"foo\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"defer\"}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"}}]}}]}}]} as unknown as DocumentNode<FooNestedFragment, unknown>;\n        export const FooDocument = {\"__meta__\":{\"deferredFields\":{\"Foo\":[\"value\"]}},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"foo\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"},\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"defer\"}}]}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"}}]}}]} as unknown as DocumentNode<FooQuery, FooQueryVariables>;\n        export const FoosDocument = {\"__meta__\":{\"deferredFields\":{\"Foo\":[\"value\"]}},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Foos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"foos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"},\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"defer\"}}]}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"}}]}}]} as unknown as DocumentNode<FoosQuery, FoosQueryVariables>;\"\n      `);\n    });\n\n    it('works with persisted documents', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              foo: Foo\n              foos: [Foo]\n            }\n\n            type Foo {\n              id: String\n              value: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/with-deferred-fragment.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              persistedDocuments: true,\n            },\n          },\n        },\n      });\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Foo = {\n          __typename?: 'Foo';\n          id?: Maybe<Scalars['String']['output']>;\n          value?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          foo?: Maybe<Foo>;\n          foos?: Maybe<Array<Maybe<Foo>>>;\n        };\n\n        export type FooQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type FooQuery = { __typename?: 'Query', foo?: { __typename?: 'Foo' } & (\n            { __typename?: 'Foo' }\n            & { ' $fragmentRefs'?: { 'FooFragment': Incremental<FooFragment> } }\n          ) | null };\n\n        export type FoosQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type FoosQuery = { __typename?: 'Query', foos?: Array<{ __typename?: 'Foo' } & (\n            { __typename?: 'Foo' }\n            & { ' $fragmentRefs'?: { 'FooFragment': Incremental<FooFragment> } }\n          ) | null> | null };\n\n        export type FooFragment = { __typename?: 'Foo', value?: string | null } & { ' $fragmentName'?: 'FooFragment' };\n\n        export type FooFragment = { __typename?: 'Foo', id?: string | null } & ({ __typename?: 'Foo', value?: string | null } | { __typename?: 'Foo', value?: never }) & { ' $fragmentName'?: 'FooFragment' };\n\n        export type FooNestedFragment = { __typename?: 'Foo', id?: string | null } & (\n          { __typename?: 'Foo' }\n          & { ' $fragmentRefs'?: { 'FooFragment': Incremental<FooFragment> } }\n        ) & { ' $fragmentName'?: 'FooNestedFragment' };\n\n        export const FooFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"}}]}}]} as unknown as DocumentNode<FooFragment, unknown>;\n        export const FooFragmentDoc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"foo\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"defer\"}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"}}]}}]}}]} as unknown as DocumentNode<FooFragment, unknown>;\n        export const FooNestedFragmentDoc = {\"__meta__\":{\"deferredFields\":{\"foo\":[\"id\"]}},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"fooNested\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"foo\"},\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"defer\"}}]}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"foo\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"InlineFragment\",\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"defer\"}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"}}]}}]}}]} as unknown as DocumentNode<FooNestedFragment, unknown>;\n        export const FooDocument = {\"__meta__\":{\"hash\":\"39c47d2da0fb0e6867abbe2ec942d9858f2d76c7\",\"deferredFields\":{\"Foo\":[\"value\"]}},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"foo\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"},\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"defer\"}}]}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"}}]}}]} as unknown as DocumentNode<FooQuery, FooQueryVariables>;\n        export const FoosDocument = {\"__meta__\":{\"hash\":\"8aba765173b2302b9857334e9959d97a2168dbc8\",\"deferredFields\":{\"Foo\":[\"value\"]}},\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Foos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"foos\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"FragmentSpread\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"},\"directives\":[{\"kind\":\"Directive\",\"name\":{\"kind\":\"Name\",\"value\":\"defer\"}}]}]}}]}},{\"kind\":\"FragmentDefinition\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"},\"typeCondition\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Foo\"}},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"value\"}}]}}]} as unknown as DocumentNode<FoosQuery, FoosQueryVariables>;\"\n      `);\n    });\n\n    it('works with documentMode: string', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              foo: Foo\n              foos: [Foo]\n            }\n\n            type Foo {\n              id: String\n              value: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/with-deferred-fragment.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            config: {\n              documentMode: 'string',\n            },\n          },\n        },\n      });\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { DocumentTypeDecoration } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Foo = {\n          __typename?: 'Foo';\n          id?: Maybe<Scalars['String']['output']>;\n          value?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          foo?: Maybe<Foo>;\n          foos?: Maybe<Array<Maybe<Foo>>>;\n        };\n\n        export type FooQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type FooQuery = { __typename?: 'Query', foo?: { __typename?: 'Foo' } & (\n            { __typename?: 'Foo' }\n            & { ' $fragmentRefs'?: { 'FooFragment': Incremental<FooFragment> } }\n          ) | null };\n\n        export type FoosQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type FoosQuery = { __typename?: 'Query', foos?: Array<{ __typename?: 'Foo' } & (\n            { __typename?: 'Foo' }\n            & { ' $fragmentRefs'?: { 'FooFragment': Incremental<FooFragment> } }\n          ) | null> | null };\n\n        export type FooFragment = { __typename?: 'Foo', value?: string | null } & { ' $fragmentName'?: 'FooFragment' };\n\n        export type FooFragment = { __typename?: 'Foo', id?: string | null } & ({ __typename?: 'Foo', value?: string | null } | { __typename?: 'Foo', value?: never }) & { ' $fragmentName'?: 'FooFragment' };\n\n        export type FooNestedFragment = { __typename?: 'Foo', id?: string | null } & (\n          { __typename?: 'Foo' }\n          & { ' $fragmentRefs'?: { 'FooFragment': Incremental<FooFragment> } }\n        ) & { ' $fragmentName'?: 'FooNestedFragment' };\n\n        export class TypedDocumentString<TResult, TVariables>\n          extends String\n          implements DocumentTypeDecoration<TResult, TVariables>\n        {\n          __apiType?: NonNullable<DocumentTypeDecoration<TResult, TVariables>['__apiType']>;\n          private value: string;\n          public __meta__?: Record<string, any> | undefined;\n\n          constructor(value: string, __meta__?: Record<string, any> | undefined) {\n            super(value);\n            this.value = value;\n            this.__meta__ = __meta__;\n          }\n\n          override toString(): string & DocumentTypeDecoration<TResult, TVariables> {\n            return this.value;\n          }\n        }\n        export const FooFragmentDoc = new TypedDocumentString(\\`\n            fragment Foo on Foo {\n          value\n        }\n            \\`, {\"fragmentName\":\"Foo\"}) as unknown as TypedDocumentString<FooFragment, unknown>;\n        export const FooFragmentDoc = new TypedDocumentString(\\`\n            fragment foo on Foo {\n          id\n          ... on Foo @defer {\n            value\n          }\n        }\n            \\`, {\"fragmentName\":\"foo\"}) as unknown as TypedDocumentString<FooFragment, unknown>;\n        export const FooNestedFragmentDoc = new TypedDocumentString(\\`\n            fragment fooNested on Foo {\n          id\n          ...foo @defer\n        }\n            fragment Foo on Foo {\n          value\n        }\n        fragment foo on Foo {\n          id\n          ... on Foo @defer {\n            value\n          }\n        }\\`, {\"fragmentName\":\"fooNested\",\"deferredFields\":{\"foo\":[\"id\"]}}) as unknown as TypedDocumentString<FooNestedFragment, unknown>;\n        export const FooDocument = new TypedDocumentString(\\`\n            query Foo {\n          foo {\n            ...Foo @defer\n          }\n        }\n            fragment Foo on Foo {\n          value\n        }\n        fragment foo on Foo {\n          id\n          ... on Foo @defer {\n            value\n          }\n        }\\`, {\"deferredFields\":{\"Foo\":[\"value\"]}}) as unknown as TypedDocumentString<FooQuery, FooQueryVariables>;\n        export const FoosDocument = new TypedDocumentString(\\`\n            query Foos {\n          foos {\n            ...Foo @defer\n          }\n        }\n            fragment Foo on Foo {\n          value\n        }\n        fragment foo on Foo {\n          id\n          ... on Foo @defer {\n            value\n          }\n        }\\`, {\"deferredFields\":{\"Foo\":[\"value\"]}}) as unknown as TypedDocumentString<FoosQuery, FoosQueryVariables>;\"\n      `);\n    });\n\n    it('works with documentMode: string and persisted documents', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              foo: Foo\n              foos: [Foo]\n            }\n\n            type Foo {\n              id: String\n              value: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/with-deferred-fragment.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            presetConfig: {\n              persistedDocuments: true,\n            },\n            config: {\n              documentMode: 'string',\n            },\n          },\n        },\n      });\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { DocumentTypeDecoration } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Foo = {\n          __typename?: 'Foo';\n          id?: Maybe<Scalars['String']['output']>;\n          value?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          foo?: Maybe<Foo>;\n          foos?: Maybe<Array<Maybe<Foo>>>;\n        };\n\n        export type FooQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type FooQuery = { __typename?: 'Query', foo?: { __typename?: 'Foo' } & (\n            { __typename?: 'Foo' }\n            & { ' $fragmentRefs'?: { 'FooFragment': Incremental<FooFragment> } }\n          ) | null };\n\n        export type FoosQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type FoosQuery = { __typename?: 'Query', foos?: Array<{ __typename?: 'Foo' } & (\n            { __typename?: 'Foo' }\n            & { ' $fragmentRefs'?: { 'FooFragment': Incremental<FooFragment> } }\n          ) | null> | null };\n\n        export type FooFragment = { __typename?: 'Foo', value?: string | null } & { ' $fragmentName'?: 'FooFragment' };\n\n        export type FooFragment = { __typename?: 'Foo', id?: string | null } & ({ __typename?: 'Foo', value?: string | null } | { __typename?: 'Foo', value?: never }) & { ' $fragmentName'?: 'FooFragment' };\n\n        export type FooNestedFragment = { __typename?: 'Foo', id?: string | null } & (\n          { __typename?: 'Foo' }\n          & { ' $fragmentRefs'?: { 'FooFragment': Incremental<FooFragment> } }\n        ) & { ' $fragmentName'?: 'FooNestedFragment' };\n\n        export class TypedDocumentString<TResult, TVariables>\n          extends String\n          implements DocumentTypeDecoration<TResult, TVariables>\n        {\n          __apiType?: NonNullable<DocumentTypeDecoration<TResult, TVariables>['__apiType']>;\n          private value: string;\n          public __meta__?: Record<string, any> | undefined;\n\n          constructor(value: string, __meta__?: Record<string, any> | undefined) {\n            super(value);\n            this.value = value;\n            this.__meta__ = __meta__;\n          }\n\n          override toString(): string & DocumentTypeDecoration<TResult, TVariables> {\n            return this.value;\n          }\n        }\n        export const FooFragmentDoc = new TypedDocumentString(\\`\n            fragment Foo on Foo {\n          value\n        }\n            \\`, {\"fragmentName\":\"Foo\"}) as unknown as TypedDocumentString<FooFragment, unknown>;\n        export const FooFragmentDoc = new TypedDocumentString(\\`\n            fragment foo on Foo {\n          id\n          ... on Foo @defer {\n            value\n          }\n        }\n            \\`, {\"fragmentName\":\"foo\"}) as unknown as TypedDocumentString<FooFragment, unknown>;\n        export const FooNestedFragmentDoc = new TypedDocumentString(\\`\n            fragment fooNested on Foo {\n          id\n          ...foo @defer\n        }\n            fragment Foo on Foo {\n          value\n        }\n        fragment foo on Foo {\n          id\n          ... on Foo @defer {\n            value\n          }\n        }\\`, {\"fragmentName\":\"fooNested\",\"deferredFields\":{\"foo\":[\"id\"]}}) as unknown as TypedDocumentString<FooNestedFragment, unknown>;\n        export const FooDocument = new TypedDocumentString(\\`\n            query Foo {\n          foo {\n            ...Foo @defer\n          }\n        }\n            fragment Foo on Foo {\n          value\n        }\n        fragment foo on Foo {\n          id\n          ... on Foo @defer {\n            value\n          }\n        }\\`, {\"hash\":\"2687841b00fe0b3b4fd0dfa2e943f80936594f58\",\"deferredFields\":{\"Foo\":[\"value\"]}}) as unknown as TypedDocumentString<FooQuery, FooQueryVariables>;\n        export const FoosDocument = new TypedDocumentString(\\`\n            query Foos {\n          foos {\n            ...Foo @defer\n          }\n        }\n            fragment Foo on Foo {\n          value\n        }\n        fragment foo on Foo {\n          id\n          ... on Foo @defer {\n            value\n          }\n        }\\`, {\"hash\":\"8db613cc1f12f64dbde9cd6fef167fd12246330d\",\"deferredFields\":{\"Foo\":[\"value\"]}}) as unknown as TypedDocumentString<FoosQuery, FoosQueryVariables>;\"\n      `);\n    });\n  });\n\n  describe('documentMode: \"string\"', () => {\n    it('generates correct types', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              foo: Foo\n              foos: [Foo]\n            }\n\n            type Foo {\n              value: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/with-fragment.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            config: {\n              documentMode: 'string',\n            },\n          },\n        },\n      });\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import { DocumentTypeDecoration } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Foo = {\n          __typename?: 'Foo';\n          value?: Maybe<Scalars['String']['output']>;\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          foo?: Maybe<Foo>;\n          foos?: Maybe<Array<Maybe<Foo>>>;\n        };\n\n        export type FooQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type FooQuery = { __typename?: 'Query', foo?: (\n            { __typename?: 'Foo' }\n            & { ' $fragmentRefs'?: { 'FooFragment': FooFragment } }\n          ) | null };\n\n        export type FoosQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type FoosQuery = { __typename?: 'Query', foos?: Array<(\n            { __typename?: 'Foo' }\n            & { ' $fragmentRefs'?: { 'FooFragment': FooFragment } }\n          ) | null> | null };\n\n        export type FooFragment = { __typename?: 'Foo', value?: string | null } & { ' $fragmentName'?: 'FooFragment' };\n\n        export class TypedDocumentString<TResult, TVariables>\n          extends String\n          implements DocumentTypeDecoration<TResult, TVariables>\n        {\n          __apiType?: NonNullable<DocumentTypeDecoration<TResult, TVariables>['__apiType']>;\n          private value: string;\n          public __meta__?: Record<string, any> | undefined;\n\n          constructor(value: string, __meta__?: Record<string, any> | undefined) {\n            super(value);\n            this.value = value;\n            this.__meta__ = __meta__;\n          }\n\n          override toString(): string & DocumentTypeDecoration<TResult, TVariables> {\n            return this.value;\n          }\n        }\n        export const FooFragmentDoc = new TypedDocumentString(\\`\n            fragment Foo on Foo {\n          value\n        }\n            \\`, {\"fragmentName\":\"Foo\"}) as unknown as TypedDocumentString<FooFragment, unknown>;\n        export const FooDocument = new TypedDocumentString(\\`\n            query Foo {\n          foo {\n            ...Foo\n          }\n        }\n            fragment Foo on Foo {\n          value\n        }\\`) as unknown as TypedDocumentString<FooQuery, FooQueryVariables>;\n        export const FoosDocument = new TypedDocumentString(\\`\n            query Foos {\n          foos {\n            ...Foo\n          }\n        }\n            fragment Foo on Foo {\n          value\n        }\\`) as unknown as TypedDocumentString<FoosQuery, FoosQueryVariables>;\"\n      `);\n    });\n\n    it('graphql overloads have a nice result type', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            type Query {\n              foo: Foo\n              foos: [Foo]\n            }\n\n            type Foo {\n              value: String\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/with-fragment.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            config: {\n              documentMode: 'string',\n            },\n          },\n        },\n      });\n\n      const gqlFile = result.find(file => file.filename === 'out1/gql.ts');\n      expect(gqlFile.content).toMatchInlineSnapshot(`\n        \"/* eslint-disable */\n        import * as types from './graphql';\n\n\n\n        /**\n         * Map of all GraphQL operations in the project.\n         *\n         * This map has several performance disadvantages:\n         * 1. It is not tree-shakeable, so it will include all operations in the project.\n         * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.\n         * 3. It does not support dead code elimination, so it will add unused operations.\n         *\n         * Therefore it is highly recommended to use the babel or swc plugin for production.\n         * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size\n         */\n        type Documents = {\n            \"\\\\n  query Foo {\\\\n    foo {\\\\n      ...Foo\\\\n    }\\\\n  }\\\\n\": typeof types.FooDocument,\n            \"\\\\n  query Foos {\\\\n    foos {\\\\n      ...Foo\\\\n    }\\\\n  }\\\\n\": typeof types.FoosDocument,\n            \"\\\\n  fragment Foo on Foo {\\\\n    value\\\\n  }\\\\n\": typeof types.FooFragmentDoc,\n        };\n        const documents: Documents = {\n            \"\\\\n  query Foo {\\\\n    foo {\\\\n      ...Foo\\\\n    }\\\\n  }\\\\n\": types.FooDocument,\n            \"\\\\n  query Foos {\\\\n    foos {\\\\n      ...Foo\\\\n    }\\\\n  }\\\\n\": types.FoosDocument,\n            \"\\\\n  fragment Foo on Foo {\\\\n    value\\\\n  }\\\\n\": types.FooFragmentDoc,\n        };\n\n        /**\n         * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n         */\n        export function graphql(source: \"\\\\n  query Foo {\\\\n    foo {\\\\n      ...Foo\\\\n    }\\\\n  }\\\\n\"): typeof import('./graphql').FooDocument;\n        /**\n         * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n         */\n        export function graphql(source: \"\\\\n  query Foos {\\\\n    foos {\\\\n      ...Foo\\\\n    }\\\\n  }\\\\n\"): typeof import('./graphql').FoosDocument;\n        /**\n         * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.\n         */\n        export function graphql(source: \"\\\\n  fragment Foo on Foo {\\\\n    value\\\\n  }\\\\n\"): typeof import('./graphql').FooFragmentDoc;\n\n\n        export function graphql(source: string) {\n          return (documents as any)[source] ?? {};\n        }\n        \"\n      `);\n    });\n\n    it('correctly resolves nested fragments', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            scalar Date\n\n            type Query {\n              video(id: ID!): Video!\n            }\n\n            interface Video {\n              id: ID!\n              title: String!\n            }\n\n            type Movie implements Video {\n              id: ID!\n              title: String!\n              releaseDate: Date!\n              collection: Collection\n            }\n\n            type Collection {\n              id: ID!\n              title: String!\n            }\n\n            type Episode implements Video {\n              id: ID!\n              title: String!\n              show: Show!\n              releaseDate: Date!\n            }\n\n            type Show {\n              id: ID!\n              title: String!\n              releaseDate: Date!\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/with-nested-fragment.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            config: {\n              documentMode: 'string',\n            },\n          },\n        },\n      });\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toBeSimilarStringTo(`\n        export const VideoDocument = new TypedDocumentString(\\`\n          query Video($id: ID!) {\n            video(id: $id) {\n              ...DetailsFragment\n              __typename\n            }\n          }\n          fragment EpisodeFragment on Episode {\n            id\n            title\n            show {\n              id\n              title\n            }\n            releaseDate\n            __typename\n          }\n          fragment MovieFragment on Movie {\n            id\n            title\n            collection {\n              id\n            }\n            releaseDate\n            __typename\n          }\n          fragment DetailsFragment on Video {\n            title\n            __typename\n            ...MovieFragment\n            ...EpisodeFragment\n          }\\`) as unknown as TypedDocumentString<VideoQuery, VideoQueryVariables>;\n      `);\n    });\n\n    it('correctly skips the typename addition for the root node for subscriptions', async () => {\n      const { result } = await executeCodegen({\n        schema: [\n          /* GraphQL */ `\n            schema {\n              query: Query\n              mutation: Mutation\n              subscription: Subscription\n            }\n\n            type Region {\n              regionId: Int!\n              regionDescription: String!\n            }\n\n            type Subscription {\n              onRegionCreated: Region!\n            }\n\n            type Query {\n              regions: [Region]\n            }\n\n            type Mutation {\n              createRegion(regionDescription: String!): Region\n            }\n          `,\n        ],\n        documents: path.join(__dirname, 'fixtures/subscription-root-node.ts'),\n        generates: {\n          'out1/': {\n            preset,\n            config: {\n              documentMode: 'string',\n            },\n            documentTransforms: [addTypenameSelectionDocumentTransform],\n          },\n        },\n      });\n\n      const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n      expect(graphqlFile.content).toBeSimilarStringTo(`\n        /* eslint-disable */\n        import { DocumentTypeDecoration } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export type Mutation = {\n          __typename?: 'Mutation';\n          createRegion?: Maybe<Region>;\n        };\n\n\n        export type MutationCreateRegionArgs = {\n          regionDescription: Scalars['String']['input'];\n        };\n\n        export type Query = {\n          __typename?: 'Query';\n          regions?: Maybe<Array<Maybe<Region>>>;\n        };\n\n        export type Region = {\n          __typename?: 'Region';\n          regionDescription: Scalars['String']['output'];\n          regionId: Scalars['Int']['output'];\n        };\n\n        export type Subscription = {\n          __typename?: 'Subscription';\n          onRegionCreated: Region;\n        };\n\n        export type OnRegionCreatedSubscriptionVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type OnRegionCreatedSubscription = { __typename?: 'Subscription', onRegionCreated: { __typename: 'Region', regionId: number, regionDescription: string } };\n\n        export class TypedDocumentString<TResult, TVariables>\n          extends String\n          implements DocumentTypeDecoration<TResult, TVariables>\n        {\n          __apiType?: NonNullable<DocumentTypeDecoration<TResult, TVariables>['__apiType']>;\n          private value: string;\n          public __meta__?: Record<string, any> | undefined;\n\n          constructor(value: string, __meta__?: Record<string, any> | undefined) {\n            super(value);\n            this.value = value;\n            this.__meta__ = __meta__;\n          }\n\n          override toString(): string & DocumentTypeDecoration<TResult, TVariables> {\n            return this.value;\n          }\n        }\n\n        export const OnRegionCreatedDocument = new TypedDocumentString(\\`\n            subscription onRegionCreated {\n          onRegionCreated {\n            __typename\n            regionId\n            regionDescription\n          }\n        }\n            \\`) as unknown as TypedDocumentString<OnRegionCreatedSubscription, OnRegionCreatedSubscriptionVariables>;\n      `);\n    });\n  });\n\n  it('support enumsAsConst option', async () => {\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          type Query {\n            thing: Thing\n          }\n          type Thing {\n            color: Color!\n          }\n          enum Color {\n            RED\n            BLUE\n          }\n        `,\n      ],\n      documents: path.join(__dirname, 'fixtures/enum.ts'),\n      generates: {\n        'out1/': {\n          preset,\n          config: {\n            enumsAsConst: true,\n          },\n        },\n      },\n    });\n    const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n    expect(graphqlFile.content).toBeSimilarStringTo(`\n        /* eslint-disable */\n        import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n        export type Maybe<T> = T | null;\n        export type InputMaybe<T> = T | null | undefined;\n        export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n        export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n        export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n        export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n        export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n        /** All built-in and custom scalars, mapped to their actual values */\n        export type Scalars = {\n          ID: { input: string; output: string; }\n          String: { input: string; output: string; }\n          Boolean: { input: boolean; output: boolean; }\n          Int: { input: number; output: number; }\n          Float: { input: number; output: number; }\n        };\n\n        export const Color = {\n          Blue: 'BLUE',\n          Red: 'RED'\n        } as const;\n\n        export type Color = typeof Color[keyof typeof Color];\n        export type Query = {\n          __typename?: 'Query';\n          thing?: Maybe<Thing>;\n        };\n\n        export type Thing = {\n          __typename?: 'Thing';\n          color: Color;\n        };\n\n        export type FavoriteColorQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n        export type FavoriteColorQuery = { __typename?: 'Query', thing?: { __typename?: 'Thing', color: Color } | null };\n\n\n        export const FavoriteColorDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"FavoriteColor\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"thing\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"color\"}}]}}]}}]} as unknown as DocumentNode<FavoriteColorQuery, FavoriteColorQueryVariables>;\n    `);\n  });\n\n  it('support enumValues option', async () => {\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          enum Color {\n            RED\n            BLUE\n          }\n        `,\n      ],\n      generates: {\n        'out1/': {\n          preset,\n          config: {\n            enumValues: {\n              Color: './fixtures/with-enum-values#MyColor',\n            },\n          },\n        },\n      },\n    });\n\n    const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n    expect(graphqlFile.content).toBeSimilarStringTo(`/* eslint-disable */\n      import { MyColor as Color } from './fixtures/with-enum-values';\n      export type Maybe<T> = T | null;\n      export type InputMaybe<T> = T | null | undefined;\n      export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n      export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n      export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n      export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n      export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n      /** All built-in and custom scalars, mapped to their actual values */\n      export type Scalars = {\n        ID: { input: string; output: string; }\n        String: { input: string; output: string; }\n        Boolean: { input: boolean; output: boolean; }\n        Int: { input: number; output: number; }\n        Float: { input: number; output: number; }\n      };\n\n      export { Color };`);\n  });\n\n  it('supports immutableTypes', async () => {\n    const { result } = await executeCodegen({\n      schema: [\n        /* GraphQL */ `\n          type Query {\n            user(id: ID!): User\n          }\n          type User {\n            id: ID!\n            name: String!\n            friends: [User!]!\n          }\n        `,\n      ],\n      documents: [\n        /* GraphQL */ `\n          query Test_User {\n            user(id: \"user-001\") {\n              id\n              name\n            }\n          }\n        `,\n      ],\n      generates: {\n        'out1/': {\n          preset,\n          config: {\n            immutableTypes: true,\n          },\n        },\n      },\n    });\n\n    const graphqlFile = result.find(file => file.filename === 'out1/graphql.ts');\n    expect(graphqlFile.content).toMatchInlineSnapshot(`\n      \"/* eslint-disable */\n      import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';\n      export type Maybe<T> = T | null;\n      export type InputMaybe<T> = T | null | undefined;\n      export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };\n      export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };\n      export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };\n      export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never };\n      export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never };\n      /** All built-in and custom scalars, mapped to their actual values */\n      export type Scalars = {\n        ID: { input: string; output: string; }\n        String: { input: string; output: string; }\n        Boolean: { input: boolean; output: boolean; }\n        Int: { input: number; output: number; }\n        Float: { input: number; output: number; }\n      };\n\n      export type Query = {\n        readonly __typename?: 'Query';\n        readonly user?: Maybe<User>;\n      };\n\n\n      export type QueryUserArgs = {\n        id: Scalars['ID']['input'];\n      };\n\n      export type User = {\n        readonly __typename?: 'User';\n        readonly friends: ReadonlyArray<User>;\n        readonly id: Scalars['ID']['output'];\n        readonly name: Scalars['String']['output'];\n      };\n\n      export type Test_UserQueryVariables = Exact<{ [key: string]: never; }>;\n\n\n      export type Test_UserQuery = { readonly __typename?: 'Query', readonly user?: { readonly __typename?: 'User', readonly id: string, readonly name: string } | null };\n\n\n      export const Test_UserDocument = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"Test_User\"},\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"value\":{\"kind\":\"StringValue\",\"value\":\"user-001\",\"block\":false}}],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"}}]}}]}}]} as unknown as DocumentNode<Test_UserQuery, Test_UserQueryVariables>;\"\n    `);\n  });\n});\n"
  },
  {
    "path": "packages/presets/client/tests/fixtures/crlf-operation.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n//@ts-ignore\nimport gql from 'gql-tag';\n\n//@ts-ignore\nconst A = gql(/* GraphQL */ `\n  query a {\n    a\n  }\n`);\n\n//@ts-ignore\nconst B = gql(/* GraphQL */ `\n  query b {\n    b\n  }\n`);\n\n//@ts-ignore\nconst C = gql(/* GraphQL */ `\n  fragment C on Query {\n    c\n  }\n`);\n"
  },
  {
    "path": "packages/presets/client/tests/fixtures/duplicate-operation.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n//@ts-ignore\nimport gql from 'gql';\n\n//@ts-ignore\nconst A1 = gql`\n  query a {\n    a\n  }\n`;\n\n//@ts-ignore\nconst A2 = gql`\n  query a {\n    a\n  }\n`;\n"
  },
  {
    "path": "packages/presets/client/tests/fixtures/enum.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n//@ts-ignore\nimport gql from 'gql-tag';\n\n//@ts-ignore\nconst A = gql(/* GraphQL */ `\n  query FavoriteColor {\n    thing {\n      color\n    }\n  }\n`);\n"
  },
  {
    "path": "packages/presets/client/tests/fixtures/reused-fragment.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n// @ts-nocheck\n\nconst SharedComponentFragment = graphql(`\n  fragment SharedComponentFragment on User {\n    id\n    username\n  }\n`);\n\nconst EventHeaderComponentFragment = graphql(`\n  fragment EventHeaderComponentFragment on Event {\n    owner {\n      ...SharedComponentFragment\n    }\n  }\n`);\n\nconst EventQueryDocument = graphql(`\n  query EventQuery($eventId: ID!) {\n    event(id: $eventId) {\n      ...EventHeaderComponentFragment\n      attendees {\n        ...SharedComponentFragment\n      }\n    }\n  }\n`);\n"
  },
  {
    "path": "packages/presets/client/tests/fixtures/simple-lowercase-operation-name.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n//@ts-ignore\nimport gql from 'gql-tag';\n\n//@ts-ignore\nconst A = gql(/* GraphQL */ `\n  query a {\n    a\n  }\n`);\n\n//@ts-ignore\nconst B = gql(/* GraphQL */ `\n  query b {\n    b\n  }\n`);\n\n//@ts-ignore\nconst C = gql(/* GraphQL */ `\n  fragment C on Query {\n    c\n  }\n`);\n"
  },
  {
    "path": "packages/presets/client/tests/fixtures/simple-uppercase-operation-name.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n//@ts-ignore\nimport gql from 'gql-tag';\n\n//@ts-ignore\nconst A = gql(/* GraphQL */ `\n  query A {\n    a\n  }\n`);\n\n//@ts-ignore\nconst B = gql(/* GraphQL */ `\n  query B {\n    b\n  }\n`);\n\n//@ts-ignore\nconst C = gql(/* GraphQL */ `\n  fragment C on Query {\n    c\n  }\n`);\n"
  },
  {
    "path": "packages/presets/client/tests/fixtures/subscription-root-node.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n//@ts-ignore\nimport gql from 'gql-tag';\n\ngql(`\n  subscription onRegionCreated {\n    onRegionCreated{\n      regionId\n      regionDescription\n    }\n  }\n`);\n"
  },
  {
    "path": "packages/presets/client/tests/fixtures/union-fragment.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n\n//@ts-ignore\nconst Query = gql(/* GraphQL */ `\n  query Foo {\n    foo {\n      ...Foo\n    }\n  }\n`);\n\n//@ts-ignore\nconst Fragment = gql(/* GraphQL */ `\n  fragment Foo on Foo {\n    __typename\n    ... on Bar {\n      stringValue\n    }\n    ... on Baz {\n      intValue\n    }\n  }\n`);\n"
  },
  {
    "path": "packages/presets/client/tests/fixtures/with-deferred-fragment.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n\n//@ts-ignore\nconst Query = gql(/* GraphQL */ `\n  query Foo {\n    foo {\n      ...Foo @defer\n    }\n  }\n`);\n\n//@ts-ignore\nconst ListQuery = gql(/* GraphQL */ `\n  query Foos {\n    foos {\n      ...Foo @defer\n    }\n  }\n`);\n\n//@ts-ignore\nconst Fragment = gql(/* GraphQL */ `\n  fragment Foo on Foo {\n    value\n  }\n`);\n\n//@ts-ignore\nconst NestedFragment = gql(/* GraphQL */ `\n  fragment foo on Foo {\n    id\n    ... on Foo @defer {\n      value\n    }\n  }\n`);\n\n//@ts-ignore\nconst NestedFragmentWithFragment = gql(/* GraphQL */ `\n  fragment fooNested on Foo {\n    id\n    ...foo @defer\n  }\n`);\n"
  },
  {
    "path": "packages/presets/client/tests/fixtures/with-enum-values.ts",
    "content": "export enum MyColor {\n  RED,\n  BLUE,\n  GREEN,\n}\n"
  },
  {
    "path": "packages/presets/client/tests/fixtures/with-fragment.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n\n//@ts-ignore\nconst Query = gql(/* GraphQL */ `\n  query Foo {\n    foo {\n      ...Foo\n    }\n  }\n`);\n\n//@ts-ignore\nconst ListQuery = gql(/* GraphQL */ `\n  query Foos {\n    foos {\n      ...Foo\n    }\n  }\n`);\n\n//@ts-ignore\nconst Fragment = gql(/* GraphQL */ `\n  fragment Foo on Foo {\n    value\n  }\n`);\n"
  },
  {
    "path": "packages/presets/client/tests/fixtures/with-nested-fragment.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n\n//@ts-ignore\nconst episodeFragment = gql(/* GraphQL */ `\n  fragment EpisodeFragment on Episode {\n    id\n    title\n    show {\n      id\n      title\n    }\n    releaseDate\n    __typename\n  }\n`);\n\n//@ts-ignore\nconst movieFragment = gql(/* GraphQL */ `\n  fragment MovieFragment on Movie {\n    id\n    title\n    collection {\n      id\n    }\n    releaseDate\n    __typename\n  }\n`);\n\n//@ts-ignore\nconst videoDetailsFragment = gql(/* GraphQL */ `\n  fragment DetailsFragment on Video {\n    title\n    __typename\n    ...MovieFragment\n    ...EpisodeFragment\n  }\n`);\n\n//@ts-ignore\nconst videoQueryDocument = gql(/* GraphQL */ `\n  query Video($id: ID!) {\n    video(id: $id) {\n      ...DetailsFragment\n      __typename\n    }\n  }\n`);\n"
  },
  {
    "path": "packages/presets/client/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'client-preset',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/presets/graphql-modules/CHANGELOG.md",
    "content": "# @graphql-codegen/graphql-modules-preset\n\n## 5.1.4\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-codegen/visitor-plugin-common@^6.2.3` ↗︎](https://www.npmjs.com/package/@graphql-codegen/visitor-plugin-common/v/6.2.3) (from `6.2.3`, in `dependencies`)\n  - Updated dependency [`@graphql-tools/utils@^11.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/11.0.0) (from `^10.0.0`, in `dependencies`)\n- Updated dependencies [[`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072), [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072)]:\n  - @graphql-codegen/plugin-helpers@6.1.1\n  - @graphql-codegen/visitor-plugin-common@6.2.4\n\n## 5.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`6038634`](https://github.com/dotansimha/graphql-code-generator/commit/60386344081917f2884db933309821603a2be2bf)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.3\n\n## 5.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`f588d91`](https://github.com/dotansimha/graphql-code-generator/commit/f588d91ac43ea0aa5931915ce980d2e6876bb59c)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.2\n\n## 5.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`b995ed1`](https://github.com/dotansimha/graphql-code-generator/commit/b995ed13a49379ea05e0e313fac68b557527523a)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.1\n\n## 5.1.0\n\n### Minor Changes\n\n- [#10510](https://github.com/dotansimha/graphql-code-generator/pull/10510) [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670) Thanks [@nickmessing](https://github.com/nickmessing)! - add importExtension configuration option\n\n### Patch Changes\n\n- Updated dependencies [[`f821e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f821e8ab9351f23a9f7e5d5e6fc69c8e8868cad8), [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670)]:\n  - @graphql-codegen/visitor-plugin-common@6.2.0\n  - @graphql-codegen/plugin-helpers@6.1.0\n\n## 5.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`51a1a72`](https://github.com/dotansimha/graphql-code-generator/commit/51a1a7280578d43681391df11d320a8416c0b41d)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.2\n\n## 5.0.4\n\n### Patch Changes\n\n- Updated dependencies [[`6715330`](https://github.com/dotansimha/graphql-code-generator/commit/67153304646694d75aee24afd70c3fce12e9f1f2)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.1\n\n## 5.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`8258f1f`](https://github.com/dotansimha/graphql-code-generator/commit/8258f1f6012c106d02ef28bca9ec424f70c4aa26)]:\n  - @graphql-codegen/visitor-plugin-common@6.1.0\n\n## 5.0.2\n\n### Patch Changes\n\n- Updated dependencies [[`accdab6`](https://github.com/dotansimha/graphql-code-generator/commit/accdab69106605241933e9d66d64dc7077656f30)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.1\n\n## 5.0.1\n\n### Patch Changes\n\n- [#10447](https://github.com/dotansimha/graphql-code-generator/pull/10447) [`5dad86e`](https://github.com/dotansimha/graphql-code-generator/commit/5dad86e4753369e288fba5821722507d88afb3dc) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix \\_\\_isTypeOf wrongly picked on objects that are not implementing types or union members\n\n## 5.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/visitor-plugin-common@6.0.0\n  - @graphql-codegen/plugin-helpers@6.0.0\n\n## 4.0.17\n\n### Patch Changes\n\n- [#10314](https://github.com/dotansimha/graphql-code-generator/pull/10314) [`d94ae3d`](https://github.com/dotansimha/graphql-code-generator/commit/d94ae3dc71f84ab2b1ce8733cf42342bb27fa951) Thanks [@acharkov](https://github.com/acharkov)! - Fix generated imports for graphql-modules-preset: .js extension is used.\n\n## 4.0.16\n\n### Patch Changes\n\n- Updated dependencies [[`f6909d1`](https://github.com/dotansimha/graphql-code-generator/commit/f6909d1797c15b79a0afb7ec089471763a485bfc)]:\n  - @graphql-codegen/visitor-plugin-common@5.8.0\n\n## 4.0.15\n\n### Patch Changes\n\n- Updated dependencies [[`d8566c0`](https://github.com/dotansimha/graphql-code-generator/commit/d8566c015943ea4dbcaeaf57d3d8406553ae230a)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.1\n\n## 4.0.14\n\n### Patch Changes\n\n- Updated dependencies [[`6d7c1d7`](https://github.com/dotansimha/graphql-code-generator/commit/6d7c1d7c0a4662acdc0efafd4234229ad0a8dd3c)]:\n  - @graphql-codegen/visitor-plugin-common@5.7.0\n\n## 4.0.13\n\n### Patch Changes\n\n- Updated dependencies [[`60dd72f`](https://github.com/dotansimha/graphql-code-generator/commit/60dd72fb103fd7fd70b4e1def98da29588865517)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.1\n\n## 4.0.12\n\n### Patch Changes\n\n- Updated dependencies [[`1617e3c`](https://github.com/dotansimha/graphql-code-generator/commit/1617e3cf38f3059cc5ea88b540033f521f03725a), [`fa64fbf`](https://github.com/dotansimha/graphql-code-generator/commit/fa64fbf8a44e1cee7ae17806dcd178dc7350c4ba)]:\n  - @graphql-codegen/visitor-plugin-common@5.6.0\n\n## 4.0.11\n\n### Patch Changes\n\n- Updated dependencies [[`55a1e9e`](https://github.com/dotansimha/graphql-code-generator/commit/55a1e9e63830df17ed40602ea7e322bbf48b17bc), [`a235051`](https://github.com/dotansimha/graphql-code-generator/commit/a23505180ac2f275a55ece27162ec9bfcdc52e03)]:\n  - @graphql-codegen/visitor-plugin-common@5.5.0\n  - @graphql-codegen/plugin-helpers@5.1.0\n\n## 4.0.10\n\n### Patch Changes\n\n- Updated dependencies [[`3f4f546`](https://github.com/dotansimha/graphql-code-generator/commit/3f4f5466ff168ad822b9a00d83d3779078e6d8c4)]:\n  - @graphql-codegen/visitor-plugin-common@5.4.0\n\n## 4.0.9\n\n### Patch Changes\n\n- Updated dependencies [[`79fee3c`](https://github.com/dotansimha/graphql-code-generator/commit/79fee3cada20d683d250aad5aa5fef9d6ed9f4d2)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.1\n\n## 4.0.8\n\n### Patch Changes\n\n- Updated dependencies [[`808ada5`](https://github.com/dotansimha/graphql-code-generator/commit/808ada595d83d39cad045da5824cac6378e9eca3), [`14ce39e`](https://github.com/dotansimha/graphql-code-generator/commit/14ce39e41dfee38c652be736664177fa2b1df421)]:\n  - @graphql-codegen/visitor-plugin-common@5.3.0\n\n## 4.0.7\n\n### Patch Changes\n\n- Updated dependencies [[`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`156cc2b`](https://github.com/dotansimha/graphql-code-generator/commit/156cc2b9a2a5129beba121cfa987b04e29899431), [`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e), [`b49457b`](https://github.com/dotansimha/graphql-code-generator/commit/b49457b5f29328d2dc23c642788a2e697cb8966e)]:\n  - @graphql-codegen/plugin-helpers@5.0.4\n  - @graphql-codegen/visitor-plugin-common@5.2.0\n\n## 4.0.6\n\n### Patch Changes\n\n- Updated dependencies [[`920b443`](https://github.com/dotansimha/graphql-code-generator/commit/920b443a401b8cc4811f64ec5b25fc7b4ae32b53), [`ed9c205`](https://github.com/dotansimha/graphql-code-generator/commit/ed9c205d15d7f14ed73e54aecf40e4fad5664e9d)]:\n  - @graphql-codegen/visitor-plugin-common@5.1.0\n\n## 4.0.5\n\n### Patch Changes\n\n- Updated dependencies [[`53f270a`](https://github.com/dotansimha/graphql-code-generator/commit/53f270acfa1da992e0f9d2e50921bb588392f8a5)]:\n  - @graphql-codegen/visitor-plugin-common@5.0.0\n\n## 4.0.4\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.2\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 4.0.3\n\n### Patch Changes\n\n- Updated dependencies [[`7718a8113`](https://github.com/dotansimha/graphql-code-generator/commit/7718a8113dc6282475cb738f1e28698b8221fa2f)]:\n  - @graphql-codegen/visitor-plugin-common@4.1.1\n\n## 4.0.2\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975), [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n  - @graphql-codegen/visitor-plugin-common@4.1.0\n\n## 4.0.1\n\n### Patch Changes\n\n- Updated dependencies [[`2276708d0`](https://github.com/dotansimha/graphql-code-generator/commit/2276708d0ea2aab4942136923651226de4aabe5a)]:\n  - @graphql-codegen/visitor-plugin-common@4.0.1\n\n## 4.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Patch Changes\n\n- [#9449](https://github.com/dotansimha/graphql-code-generator/pull/9449) [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^10.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.0.0) (from `^9.0.0`, in `dependencies`)\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`3848a2b73`](https://github.com/dotansimha/graphql-code-generator/commit/3848a2b73339fe9f474b31647b71e75b9ca52a96), [`ba84a3a27`](https://github.com/dotansimha/graphql-code-generator/commit/ba84a3a2758d94dac27fcfbb1bafdf3ed7c32929), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`50471e651`](https://github.com/dotansimha/graphql-code-generator/commit/50471e6514557db827cd26157262401c6c600a8c), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c), [`ca02ad172`](https://github.com/dotansimha/graphql-code-generator/commit/ca02ad172a0e8f52570fdef4271ec286d883236d), [`e1dc75f3c`](https://github.com/dotansimha/graphql-code-generator/commit/e1dc75f3c598bf7f83138ca533619716fc73f823), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0), [`5950f5a68`](https://github.com/dotansimha/graphql-code-generator/commit/5950f5a6843cdd92b9d5b8ced3a97b68eadf9f30), [`5aa95aa96`](https://github.com/dotansimha/graphql-code-generator/commit/5aa95aa969993043ba5e9d5dabebd7127ea5e22c)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n  - @graphql-codegen/visitor-plugin-common@4.0.0\n\n## 3.1.3\n\n### Patch Changes\n\n- Updated dependencies [[`386cf9044`](https://github.com/dotansimha/graphql-code-generator/commit/386cf9044a41d87ed45069b22d26b30f4b262a85), [`402cb8ac0`](https://github.com/dotansimha/graphql-code-generator/commit/402cb8ac0f0c347b186d295c4b69c19e25a65d00)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.1\n\n## 3.1.2\n\n### Patch Changes\n\n- Updated dependencies [[`e56790104`](https://github.com/dotansimha/graphql-code-generator/commit/e56790104ae56d6c5b48ef71823345bd09d3b835), [`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29), [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087), [`acb647e4e`](https://github.com/dotansimha/graphql-code-generator/commit/acb647e4efbddecf732b6e55dc47ac40c9bdaf08), [`9f4d9c5a4`](https://github.com/dotansimha/graphql-code-generator/commit/9f4d9c5a479d34da25df8e060a8c2b3b162647dd)]:\n  - @graphql-codegen/visitor-plugin-common@3.1.0\n  - @graphql-codegen/plugin-helpers@4.2.0\n\n## 3.1.1\n\n### Patch Changes\n\n- Updated dependencies [[`ba0610bbd`](https://github.com/dotansimha/graphql-code-generator/commit/ba0610bbd4578d8a82078014766f56d8ae5fcf7a), [`4b49f6fbe`](https://github.com/dotansimha/graphql-code-generator/commit/4b49f6fbed802907b460bfb7b6e9a85f88c555bc), [`b343626c9`](https://github.com/dotansimha/graphql-code-generator/commit/b343626c978b9ee0f14e314cea6c01ae3dad057c)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.2\n\n## 3.1.0\n\n### Minor Changes\n\n- [#8723](https://github.com/dotansimha/graphql-code-generator/pull/8723) [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15) Thanks [@kazekyo](https://github.com/kazekyo)! - Introduce a new feature called DocumentTransform.\n\n  DocumentTransform is a functionality that allows you to modify `documents` before they are processed by plugins. You can use functions passed to the `documentTransforms` option to make changes to GraphQL documents.\n\n  To use this feature, you can write `documentTransforms` as follows:\n\n  ```ts\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: [\n          {\n            transform: ({ documents }) => {\n              // Make some changes to the documents\n              return documents\n            }\n          }\n        ]\n      }\n    }\n  }\n  export default config\n  ```\n\n  For instance, to remove a `@localOnlyDirective` directive from `documents`, you can write the following code:\n\n  ```js\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n  import { visit } from 'graphql'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: [\n          {\n            transform: ({ documents }) => {\n              return documents.map(documentFile => {\n                documentFile.document = visit(documentFile.document, {\n                  Directive: {\n                    leave(node) {\n                      if (node.name.value === 'localOnlyDirective') return null\n                    }\n                  }\n                })\n                return documentFile\n              })\n            }\n          }\n        ]\n      }\n    }\n  }\n  export default config\n  ```\n\n  DocumentTransform can also be specified by file name. You can create a custom file for a specific transformation and pass it to `documentTransforms`.\n\n  Let's create the document transform as a file:\n\n  ```js\n  module.exports = {\n    transform: ({ documents }) => {\n      // Make some changes to the documents\n      return documents\n    }\n  }\n  ```\n\n  Then, you can specify the file name as follows:\n\n  ```ts\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: ['./my-document-transform.js']\n      }\n    }\n  }\n  export default config\n  ```\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`6b6fe3cbc`](https://github.com/dotansimha/graphql-code-generator/commit/6b6fe3cbcc7de748754703adce0f62f3e070a098), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n  - @graphql-codegen/visitor-plugin-common@3.0.1\n\n## 3.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- [#8871](https://github.com/dotansimha/graphql-code-generator/pull/8871) [`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5) Thanks [@B2o5T](https://github.com/B2o5T)! - eslint fixes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/visitor-plugin-common@3.0.0\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 2.5.12\n\n### Patch Changes\n\n- Updated dependencies [[`a98198524`](https://github.com/dotansimha/graphql-code-generator/commit/a9819852443884b43de7c15040ccffc205f9177a)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.8\n\n## 2.5.11\n\n### Patch Changes\n\n- Updated dependencies [[`eb454d06c`](https://github.com/dotansimha/graphql-code-generator/commit/eb454d06c977f11f7d4a7b0b07eb80f8fd590560)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.7\n\n## 2.5.10\n\n### Patch Changes\n\n- [#8771](https://github.com/dotansimha/graphql-code-generator/pull/8771) [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/9.0.0) (from `^8.8.0`, in `dependencies`)\n- Updated dependencies [[`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7), [`6c6b6f2df`](https://github.com/dotansimha/graphql-code-generator/commit/6c6b6f2df88a3a37b437a25320dab5590f033316)]:\n  - @graphql-codegen/plugin-helpers@3.1.2\n  - @graphql-codegen/visitor-plugin-common@2.13.6\n\n## 2.5.9\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81), [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n  - @graphql-codegen/visitor-plugin-common@2.13.5\n\n## 2.5.8\n\n### Patch Changes\n\n- [#8686](https://github.com/dotansimha/graphql-code-generator/pull/8686) [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`change-case-all@1.0.15` ↗︎](https://www.npmjs.com/package/change-case-all/v/1.0.15) (from `1.0.14`, in `dependencies`)\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n  - @graphql-codegen/visitor-plugin-common@2.13.4\n\n## 2.5.7\n\n### Patch Changes\n\n- Updated dependencies [[`62f655452`](https://github.com/dotansimha/graphql-code-generator/commit/62f6554520955dd675e11c920f35ef9bf0aaeffe)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.3\n\n## 2.5.6\n\n### Patch Changes\n\n- Updated dependencies [[`ef4c2c9c2`](https://github.com/dotansimha/graphql-code-generator/commit/ef4c2c9c233c68830f10eb4c167c7cceead27122)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.2\n\n## 2.5.5\n\n### Patch Changes\n\n- Updated dependencies [[`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.1\n  - @graphql-codegen/plugin-helpers@2.7.2\n\n## 2.5.4\n\n### Patch Changes\n\n- Updated dependencies [[`a46b8d99c`](https://github.com/dotansimha/graphql-code-generator/commit/a46b8d99c797283d773ec14163c62be9c84d4c2b)]:\n  - @graphql-codegen/visitor-plugin-common@2.13.0\n\n## 2.5.3\n\n### Patch Changes\n\n- [#8486](https://github.com/dotansimha/graphql-code-generator/pull/8486) [`08add4e88`](https://github.com/dotansimha/graphql-code-generator/commit/08add4e88af8fd05172cbb8f7973952155c43b4a) Thanks [@jycouet](https://github.com/jycouet)! - handle global config.useTypeImports in graphql-modules\n\n## 2.5.2\n\n### Patch Changes\n\n- Updated dependencies [[`1bd7f771c`](https://github.com/dotansimha/graphql-code-generator/commit/1bd7f771ccb949a5a37395c7c57cb41c19340714)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.2\n\n## 2.5.1\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n- Updated dependencies [[`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f), [`47d0a57e2`](https://github.com/dotansimha/graphql-code-generator/commit/47d0a57e27dd0d2334670bfc6c81c45e00ff4e74)]:\n  - @graphql-codegen/visitor-plugin-common@2.12.1\n  - @graphql-codegen/plugin-helpers@2.6.2\n\n## 2.5.0\n\n### Minor Changes\n\n- [#6796](https://github.com/dotansimha/graphql-code-generator/pull/6796) [`8b6e8e664`](https://github.com/dotansimha/graphql-code-generator/commit/8b6e8e6648f2d95cc40873cfc008a545d8a9c46f) Thanks [@kamilkisiela](https://github.com/kamilkisiela)! - Introduce requireRootResolvers flag\n\n## 2.4.2\n\n### Patch Changes\n\n- Updated dependencies [2cbcbb371]\n  - @graphql-codegen/visitor-plugin-common@2.12.0\n  - @graphql-codegen/plugin-helpers@2.6.0\n\n## 2.4.1\n\n### Patch Changes\n\n- 525ad580b: Revert breaking change for Next.js applications that are incapable of resolving an import with a `.js` extension.\n- Updated dependencies [525ad580b]\n  - @graphql-codegen/visitor-plugin-common@2.11.1\n\n## 2.4.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n### Patch Changes\n\n- Updated dependencies [68bb30e19]\n- Updated dependencies [d84afec09]\n- Updated dependencies [a4fe5006b]\n- Updated dependencies [8e44df58b]\n  - @graphql-codegen/visitor-plugin-common@2.11.0\n  - @graphql-codegen/plugin-helpers@2.5.0\n\n## 2.3.14\n\n### Patch Changes\n\n- Updated dependencies [aa1e6eafd]\n- Updated dependencies [a42fcbfe4]\n- Updated dependencies [8b10f22be]\n  - @graphql-codegen/visitor-plugin-common@2.10.0\n\n## 2.3.13\n\n### Patch Changes\n\n- Updated dependencies [d16bebacb]\n  - @graphql-codegen/visitor-plugin-common@2.9.1\n\n## 2.3.12\n\n### Patch Changes\n\n- Updated dependencies [c3d7b7226]\n  - @graphql-codegen/visitor-plugin-common@2.9.0\n\n## 2.3.11\n\n### Patch Changes\n\n- Updated dependencies [f1fb77bd4]\n  - @graphql-codegen/visitor-plugin-common@2.8.0\n\n## 2.3.10\n\n### Patch Changes\n\n- Updated dependencies [9a5f31cb6]\n  - @graphql-codegen/visitor-plugin-common@2.7.6\n\n## 2.3.9\n\n### Patch Changes\n\n- Updated dependencies [2966686e9]\n  - @graphql-codegen/visitor-plugin-common@2.7.5\n\n## 2.3.8\n\n### Patch Changes\n\n- Updated dependencies [337fd4f77]\n  - @graphql-codegen/visitor-plugin-common@2.7.4\n\n## 2.3.7\n\n### Patch Changes\n\n- Updated dependencies [54718c039]\n  - @graphql-codegen/visitor-plugin-common@2.7.3\n\n## 2.3.6\n\n### Patch Changes\n\n- Updated dependencies [11d05e361]\n  - @graphql-codegen/visitor-plugin-common@2.7.2\n\n## 2.3.5\n\n### Patch Changes\n\n- Updated dependencies [fd55e2039]\n  - @graphql-codegen/visitor-plugin-common@2.7.1\n\n## 2.3.4\n\n### Patch Changes\n\n- Updated dependencies [1479233df]\n  - @graphql-codegen/visitor-plugin-common@2.7.0\n\n## 2.3.3\n\n### Patch Changes\n\n- Updated dependencies [c8ef37ae0]\n- Updated dependencies [754a33715]\n- Updated dependencies [bef4376d5]\n- Updated dependencies [be7cb3a82]\n  - @graphql-codegen/visitor-plugin-common@2.6.0\n  - @graphql-codegen/plugin-helpers@2.4.0\n\n## 2.3.2\n\n### Patch Changes\n\n- 6002feb3d: Fix exports in package.json files for react-native projects\n- Updated dependencies [6002feb3d]\n  - @graphql-codegen/visitor-plugin-common@2.5.2\n  - @graphql-codegen/plugin-helpers@2.3.2\n\n## 2.3.1\n\n### Patch Changes\n\n- Updated dependencies [a9f1f1594]\n- Updated dependencies [9ea6621ec]\n  - @graphql-codegen/visitor-plugin-common@2.5.1\n\n## 2.3.0\n\n### Minor Changes\n\n- 97ddb487a: feat: GraphQL v16 compatibility\n\n### Patch Changes\n\n- Updated dependencies [97ddb487a]\n  - @graphql-codegen/visitor-plugin-common@2.5.0\n  - @graphql-codegen/plugin-helpers@2.3.0\n\n## 2.2.0\n\n### Minor Changes\n\n- efae660d1: Added an option to allow to skip generating code related to graphql-modules library\n\n## 2.1.6\n\n### Patch Changes\n\n- Updated dependencies [ad02cb9b8]\n  - @graphql-codegen/visitor-plugin-common@2.4.0\n\n## 2.1.5\n\n### Patch Changes\n\n- Updated dependencies [b9e85adae]\n- Updated dependencies [7c60e5acc]\n- Updated dependencies [3c2c847be]\n  - @graphql-codegen/visitor-plugin-common@2.3.0\n  - @graphql-codegen/plugin-helpers@2.2.0\n\n## 2.1.4\n\n### Patch Changes\n\n- Updated dependencies [0b090e31a]\n  - @graphql-codegen/visitor-plugin-common@2.2.1\n\n## 2.1.3\n\n### Patch Changes\n\n- Updated dependencies [d6c2d4c09]\n- Updated dependencies [feeae1c66]\n- Updated dependencies [5086791ac]\n  - @graphql-codegen/visitor-plugin-common@2.2.0\n\n## 2.1.2\n\n### Patch Changes\n\n- f32521da3: Duplication of TS interfaces when GraphQL type definition and type extension are in the same module\n- Updated dependencies [6470e6cc9]\n- Updated dependencies [263570e50]\n- Updated dependencies [35199dedf]\n  - @graphql-codegen/visitor-plugin-common@2.1.2\n  - @graphql-codegen/plugin-helpers@2.1.1\n\n## 2.1.1\n\n### Patch Changes\n\n- Updated dependencies [aabeff181]\n  - @graphql-codegen/visitor-plugin-common@2.1.1\n\n## 2.1.0\n\n### Minor Changes\n\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- Updated dependencies [290170262]\n- Updated dependencies [24185985a]\n- Updated dependencies [39773f59b]\n- Updated dependencies [440172cfe]\n  - @graphql-codegen/visitor-plugin-common@2.1.0\n  - @graphql-codegen/plugin-helpers@2.1.0\n\n## 2.0.1\n\n### Patch Changes\n\n- edd029e87: fix(graphql-modules-preset): do not parse SDL and use extendedSources that have parsed document already\n\n## 2.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n### Patch Changes\n\n- Updated dependencies [d80efdec4]\n- Updated dependencies [d80efdec4]\n- Updated dependencies [b0cb13df4]\n  - @graphql-codegen/visitor-plugin-common@2.0.0\n  - @graphql-codegen/plugin-helpers@2.0.0\n\n## 1.2.10\n\n### Patch Changes\n\n- Updated dependencies [df19a4ed]\n- Updated dependencies [470336a1]\n- Updated dependencies [9005cc17]\n  - @graphql-codegen/visitor-plugin-common@1.22.0\n  - @graphql-codegen/plugin-helpers@1.18.8\n\n## 1.2.9\n\n### Patch Changes\n\n- Updated dependencies [6762aff5]\n  - @graphql-codegen/visitor-plugin-common@1.21.3\n\n## 1.2.8\n\n### Patch Changes\n\n- Updated dependencies [6aaecf1c]\n  - @graphql-codegen/visitor-plugin-common@1.21.2\n\n## 1.2.7\n\n### Patch Changes\n\n- Updated dependencies [cf1e5abc]\n  - @graphql-codegen/visitor-plugin-common@1.21.1\n\n## 1.2.6\n\n### Patch Changes\n\n- Updated dependencies [dfd25caf]\n- Updated dependencies [8da7dff6]\n  - @graphql-codegen/visitor-plugin-common@1.21.0\n  - @graphql-codegen/plugin-helpers@1.18.7\n\n## 1.2.5\n\n### Patch Changes\n\n- d9212aa0: fix(visitor-plugin-common): guard for a runtime type error\n- Updated dependencies [d9212aa0]\n- Updated dependencies [f0b5ea53]\n- Updated dependencies [097bea2f]\n  - @graphql-codegen/visitor-plugin-common@1.20.0\n  - @graphql-codegen/plugin-helpers@1.18.5\n\n## 1.2.4\n\n### Patch Changes\n\n- 23862e7e: fix(naming-convention): revert and pin change-case-all dependency for workaround #3256\n- Updated dependencies [23862e7e]\n  - @graphql-codegen/visitor-plugin-common@1.19.1\n  - @graphql-codegen/plugin-helpers@1.18.4\n\n## 1.2.3\n\n### Patch Changes\n\n- 7615c6cd: Revery enum-resolvers since it's causing issues\n\n## 1.2.2\n\n### Patch Changes\n\n- f7a94f9d: Include enum resolvers\n- 3cba8833: Fixed issue with preset breaking when pattern doesn't match\n- 29b75b1e: enhance(namingConvention): use change-case-all instead of individual packages for naming convention\n- Updated dependencies [e947f8e3]\n- Updated dependencies [29b75b1e]\n- Updated dependencies [d4942d04]\n- Updated dependencies [1f6f3db6]\n- Updated dependencies [29b75b1e]\n  - @graphql-codegen/visitor-plugin-common@1.19.0\n  - @graphql-codegen/plugin-helpers@1.18.3\n\n## 1.2.1\n\n### Patch Changes\n\n- c7cb4195: fix(graphql-modules-preset): apply naming convention to scalar config references in module typings\n- Updated dependencies [63be0f40]\n- Updated dependencies [190482a1]\n- Updated dependencies [4444348d]\n- Updated dependencies [142b32b3]\n- Updated dependencies [42213fa0]\n  - @graphql-codegen/visitor-plugin-common@1.18.1\n\n## 1.2.0\n\n### Minor Changes\n\n- f1b99b90: Added support for generating module types as `d.ts`\n\n### Patch Changes\n\n- Updated dependencies [64293437]\n- Updated dependencies [fd5843a7]\n- Updated dependencies [d75051f5]\n  - @graphql-codegen/visitor-plugin-common@1.17.22\n\n## 1.1.0\n\n### Minor Changes\n\n- 6b708b69: Added `importBaseTypesFrom` flag to allow customizations of the import for the base types\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n- Updated dependencies [1183d173]\n  - @graphql-codegen/visitor-plugin-common@1.17.20\n  - @graphql-codegen/plugin-helpers@1.18.2\n\n## 1.0.0\n\n### Major Changes\n\n- faa13973: New Plugin!\n\n### Patch Changes\n\n- Updated dependencies [faa13973]\n  - @graphql-codegen/visitor-plugin-common@1.17.18\n"
  },
  {
    "path": "packages/presets/graphql-modules/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/graphql-modules-preset\",\n  \"version\": \"5.1.4\",\n  \"description\": \"GraphQL Code Generator preset for modularized schema\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/presets/graphql-modules\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"prepack\": \"bob prepack\"\n  },\n  \"devDependencies\": {\n    \"@types/parse-filepath\": \"1.0.2\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"^6.1.1\",\n    \"@graphql-codegen/visitor-plugin-common\": \"^6.2.4\",\n    \"@graphql-tools/utils\": \"^11.0.0\",\n    \"parse-filepath\": \"^1.0.2\",\n    \"change-case-all\": \"1.0.15\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/presets/graphql-modules/src/builder.ts",
    "content": "import { BaseVisitor } from '@graphql-codegen/visitor-plugin-common';\nimport { pascalCase } from 'change-case-all';\nimport {\n  DocumentNode,\n  EnumTypeDefinitionNode,\n  EnumTypeExtensionNode,\n  GraphQLSchema,\n  InputObjectTypeDefinitionNode,\n  InputObjectTypeExtensionNode,\n  InterfaceTypeDefinitionNode,\n  InterfaceTypeExtensionNode,\n  isScalarType,\n  Kind,\n  ObjectTypeDefinitionNode,\n  ObjectTypeExtensionNode,\n  TypeDefinitionNode,\n  TypeExtensionNode,\n  visit,\n} from 'graphql';\nimport { ModulesConfig } from './config.js';\nimport {\n  buildBlock,\n  collectUsedTypes,\n  concatByKey,\n  createObject,\n  indent,\n  pushUnique,\n  unique,\n  uniqueByKey,\n  withQuotes,\n} from './utils.js';\n\ntype RegistryKeys = 'objects' | 'inputs' | 'interfaces' | 'scalars' | 'unions' | 'enums';\ntype Registry = Record<RegistryKeys, string[]>;\nconst registryKeys: RegistryKeys[] = ['objects', 'inputs', 'interfaces', 'scalars', 'unions', 'enums'];\nconst resolverKeys: Array<Extract<RegistryKeys, 'objects' | 'enums' | 'scalars'>> = ['scalars', 'objects', 'enums'];\nconst withIsTypeOfKeys: Array<'objects'> = ['objects'];\n\nexport function buildModule(\n  name: string,\n  doc: DocumentNode,\n  {\n    importNamespace,\n    importPath,\n    encapsulate,\n    requireRootResolvers,\n    shouldDeclare,\n    rootTypes,\n    schema,\n    baseVisitor,\n    useGraphQLModules,\n    useTypeImports = false,\n  }: {\n    importNamespace: string;\n    importPath: string;\n    encapsulate: ModulesConfig['encapsulateModuleTypes'];\n    requireRootResolvers: ModulesConfig['requireRootResolvers'];\n    shouldDeclare: boolean;\n    rootTypes: string[];\n    baseVisitor: BaseVisitor;\n    schema?: GraphQLSchema;\n    useGraphQLModules: boolean;\n    useTypeImports?: boolean;\n  }\n): string {\n  const picks: Record<RegistryKeys, Record<string, string[]>> = createObject(registryKeys, () => ({}));\n  const defined: Registry = createObject(registryKeys, () => []);\n  const extended: Registry = createObject(registryKeys, () => []);\n  const withIsTypeOf: { objects: string[] } = createObject(withIsTypeOfKeys, () => []);\n\n  // List of types used in objects, fields, arguments etc\n  const usedTypes = collectUsedTypes(doc);\n\n  visit(doc, {\n    ObjectTypeDefinition(node) {\n      collectTypeDefinition(node);\n    },\n    ObjectTypeExtension(node) {\n      collectTypeExtension(node);\n    },\n    InputObjectTypeDefinition(node) {\n      collectTypeDefinition(node);\n    },\n    InputObjectTypeExtension(node) {\n      collectTypeExtension(node);\n    },\n    InterfaceTypeDefinition(node) {\n      collectTypeDefinition(node);\n    },\n    InterfaceTypeExtension(node) {\n      collectTypeExtension(node);\n    },\n    ScalarTypeDefinition(node) {\n      collectTypeDefinition(node);\n    },\n    UnionTypeDefinition(node) {\n      collectTypeDefinition(node);\n    },\n    UnionTypeExtension(node) {\n      collectTypeExtension(node);\n    },\n    EnumTypeDefinition(node) {\n      collectTypeDefinition(node);\n    },\n    EnumTypeExtension(node) {\n      collectTypeExtension(node);\n    },\n  });\n\n  // Defined and Extended types\n  const visited: Registry = createObject(registryKeys, key => concatByKey(defined, extended, key));\n\n  // Types that are not defined or extended in a module, they come from other modules\n  const external: Registry = createObject(registryKeys, key => uniqueByKey(extended, defined, key));\n\n  //\n  //\n  //\n  // Prints\n  //\n  //\n  //\n\n  // An actual output\n  const imports = [`import${useTypeImports ? ' type' : ''} * as ${importNamespace} from \"${importPath}\";`];\n\n  if (useGraphQLModules) {\n    imports.push(`import${useTypeImports ? ' type' : ''} * as gm from \"graphql-modules\";`);\n  }\n\n  let content = [\n    printDefinedFields(),\n    printDefinedEnumValues(),\n    printDefinedInputFields(),\n    printSchemaTypes(usedTypes),\n    printScalars(visited),\n    printResolveSignaturesPerType(visited),\n    printResolversType(visited),\n    useGraphQLModules ? printResolveMiddlewareMap() : undefined,\n  ]\n    .filter(Boolean)\n    .join('\\n\\n');\n\n  if (encapsulate === 'namespace') {\n    content =\n      `${shouldDeclare ? 'declare' : 'export'} namespace ${baseVisitor.convertName(name, {\n        suffix: 'Module',\n        useTypesPrefix: false,\n        useTypesSuffix: false,\n      })} {\\n` +\n      (shouldDeclare ? `${indent(2)(imports.join('\\n'))}\\n` : '') +\n      indent(2)(content) +\n      '\\n}';\n  }\n\n  return [...(shouldDeclare ? [] : imports), content].filter(Boolean).join('\\n');\n\n  /**\n   * A dictionary of fields to pick from an object\n   */\n  function printDefinedFields() {\n    return buildBlock({\n      name: `interface DefinedFields`,\n      lines: [...visited.objects, ...visited.interfaces].map(\n        typeName =>\n          `${typeName}: ${printPicks(typeName, {\n            ...picks.objects,\n            ...picks.interfaces,\n          })};`\n      ),\n    });\n  }\n\n  /**\n   * A dictionary of values to pick from an enum\n   */\n  function printDefinedEnumValues() {\n    return buildBlock({\n      name: `interface DefinedEnumValues`,\n      lines: visited.enums.map(typeName => `${typeName}: ${printPicks(typeName, picks.enums)};`),\n    });\n  }\n\n  function encapsulateTypeName(typeName: string): string {\n    if (encapsulate === 'prefix') {\n      return `${pascalCase(name)}_${typeName}`;\n    }\n\n    return typeName;\n  }\n\n  /**\n   * A dictionary of fields to pick from an input\n   */\n  function printDefinedInputFields() {\n    return buildBlock({\n      name: `interface DefinedInputFields`,\n      lines: visited.inputs.map(typeName => `${typeName}: ${printPicks(typeName, picks.inputs)};`),\n    });\n  }\n\n  /**\n   * Prints signatures of schema types with picks\n   */\n  function printSchemaTypes(types: string[]) {\n    return types\n      .filter(type => !visited.scalars.includes(type))\n      .map(printExportType)\n      .join('\\n');\n  }\n\n  function printResolveSignaturesPerType(registry: Registry) {\n    return [\n      [...registry.objects, ...registry.interfaces]\n        .map(name =>\n          printResolverType(\n            name,\n            'DefinedFields',\n            // In case of enabled `requireRootResolvers` flag, the preset has to produce a non-optional properties.\n            requireRootResolvers && rootTypes.includes(name),\n            !rootTypes.includes(name) && defined.objects.includes(name) && withIsTypeOf.objects.includes(name)\n              ? ` | '__isTypeOf'`\n              : ''\n          )\n        )\n        .join('\\n'),\n    ].join('\\n');\n  }\n\n  function printScalars(registry: Registry) {\n    if (!registry.scalars.length) {\n      return '';\n    }\n\n    return [\n      `export type ${encapsulateTypeName('Scalars')} = Pick<${importNamespace}.Scalars, ${registry.scalars\n        .map(withQuotes)\n        .join(' | ')}>;`,\n      ...registry.scalars.map(scalar => {\n        const convertedName = baseVisitor.convertName(scalar, {\n          suffix: 'ScalarConfig',\n        });\n        return `export type ${encapsulateTypeName(convertedName)} = ${importNamespace}.${convertedName};`;\n      }),\n    ].join('\\n');\n  }\n\n  /**\n   * Aggregation of type resolver signatures\n   */\n  function printResolversType(registry: Registry) {\n    const lines: string[] = [];\n\n    for (const kind in registry) {\n      const k = kind as RegistryKeys;\n      if (Object.prototype.hasOwnProperty.call(registry, k) && resolverKeys.includes(k as any)) {\n        const types = registry[k];\n\n        for (const typeName of types) {\n          if (k === 'enums') {\n            continue;\n          }\n          if (k === 'scalars') {\n            lines.push(`${typeName}?: ${encapsulateTypeName(importNamespace)}.Resolvers['${typeName}'];`);\n          } else {\n            // In case of enabled `requireRootResolvers` flag, the preset has to produce a non-optional property.\n            const fieldModifier = requireRootResolvers && rootTypes.includes(typeName) ? '' : '?';\n\n            lines.push(`${typeName}${fieldModifier}: ${encapsulateTypeName(typeName)}Resolvers;`);\n          }\n        }\n      }\n    }\n\n    return buildBlock({\n      name: `export interface ${encapsulateTypeName('Resolvers')}`,\n      lines,\n    });\n  }\n\n  /**\n   * Signature for a map of resolve middlewares\n   */\n  function printResolveMiddlewareMap() {\n    const wildcardField = printResolveMiddlewareRecord(withQuotes('*'));\n    const blocks: string[] = [buildBlock({ name: `${withQuotes('*')}?:`, lines: [wildcardField] })];\n\n    // Type.Field\n    for (const typeName in picks.objects) {\n      if (Object.prototype.hasOwnProperty.call(picks.objects, typeName)) {\n        const fields = picks.objects[typeName];\n        const lines = [wildcardField].concat(fields.map(field => printResolveMiddlewareRecord(field)));\n\n        blocks.push(\n          buildBlock({\n            name: `${typeName}?:`,\n            lines,\n          })\n        );\n      }\n    }\n\n    return buildBlock({\n      name: `export interface ${encapsulateTypeName('MiddlewareMap')}`,\n      lines: blocks,\n    });\n  }\n\n  function printResolveMiddlewareRecord(path: string): string {\n    return `${path}?: gm.Middleware[];`;\n  }\n\n  function printResolverType(typeName: string, picksTypeName: string, requireFieldsResolvers = false, extraKeys = '') {\n    const typeSignature = `Pick<${importNamespace}.${baseVisitor.convertName(typeName, {\n      suffix: 'Resolvers',\n    })}, ${picksTypeName}['${typeName}']${extraKeys}>`;\n\n    return `export type ${encapsulateTypeName(`${typeName}Resolvers`)} = ${\n      requireFieldsResolvers ? `Required<${typeSignature}>` : typeSignature\n    };`;\n  }\n\n  function printPicks(typeName: string, records: Record<string, string[]>): string {\n    return records[typeName].filter(unique).map(withQuotes).join(' | ');\n  }\n\n  function printTypeBody(typeName: string): string {\n    const coreType = `${importNamespace}.${baseVisitor.convertName(typeName, {\n      useTypesSuffix: true,\n      useTypesPrefix: true,\n    })}`;\n\n    if (external.enums.includes(typeName) || external.objects.includes(typeName)) {\n      if (schema && isScalarType(schema.getType(typeName))) {\n        return `${importNamespace}.Scalars['${typeName}']`;\n      }\n\n      return coreType;\n    }\n\n    if (defined.enums.includes(typeName) && picks.enums[typeName]) {\n      return `DefinedEnumValues['${typeName}']`;\n    }\n\n    if (defined.objects.includes(typeName) && picks.objects[typeName]) {\n      return `Pick<${coreType}, DefinedFields['${typeName}']>`;\n    }\n\n    if (defined.interfaces.includes(typeName) && picks.interfaces[typeName]) {\n      return `Pick<${coreType}, DefinedFields['${typeName}']>`;\n    }\n\n    if (defined.inputs.includes(typeName) && picks.inputs[typeName]) {\n      return `Pick<${coreType}, DefinedInputFields['${typeName}']>`;\n    }\n\n    return coreType;\n  }\n\n  function printExportType(typeName: string): string {\n    return `export type ${encapsulateTypeName(typeName)} = ${printTypeBody(typeName)};`;\n  }\n\n  //\n  //\n  //\n  // Utils\n  //\n  //\n  //\n\n  function collectFields(\n    node:\n      | ObjectTypeDefinitionNode\n      | ObjectTypeExtensionNode\n      | InterfaceTypeDefinitionNode\n      | InterfaceTypeExtensionNode\n      | InputObjectTypeDefinitionNode\n      | InputObjectTypeExtensionNode,\n    picksObj: Record<string, string[]>\n  ) {\n    const name = node.name.value;\n\n    if (node.fields) {\n      picksObj[name] ||= [];\n\n      for (const field of node.fields) {\n        picksObj[name].push(field.name.value);\n      }\n    }\n  }\n\n  function collectValuesFromEnum(node: EnumTypeDefinitionNode | EnumTypeExtensionNode) {\n    const name = node.name.value;\n\n    if (node.values) {\n      picks.enums[name] ||= [];\n\n      for (const field of node.values) {\n        picks.enums[name].push(field.name.value);\n      }\n    }\n  }\n\n  function collectTypeDefinition(node: TypeDefinitionNode) {\n    const name = node.name.value;\n\n    switch (node.kind) {\n      case Kind.OBJECT_TYPE_DEFINITION: {\n        defined.objects.push(name);\n        collectFields(node, picks.objects);\n\n        if (node.interfaces?.length > 0) {\n          withIsTypeOf.objects.push(name);\n        }\n\n        break;\n      }\n\n      case Kind.ENUM_TYPE_DEFINITION: {\n        defined.enums.push(name);\n        collectValuesFromEnum(node);\n        break;\n      }\n\n      case Kind.INPUT_OBJECT_TYPE_DEFINITION: {\n        defined.inputs.push(name);\n        collectFields(node, picks.inputs);\n        break;\n      }\n\n      case Kind.SCALAR_TYPE_DEFINITION: {\n        defined.scalars.push(name);\n        break;\n      }\n\n      case Kind.INTERFACE_TYPE_DEFINITION: {\n        defined.interfaces.push(name);\n        collectFields(node, picks.interfaces);\n        break;\n      }\n\n      case Kind.UNION_TYPE_DEFINITION: {\n        defined.unions.push(name);\n\n        for (const namedType of node.types || []) {\n          pushUnique(withIsTypeOf.objects, namedType.name.value);\n        }\n        break;\n      }\n    }\n  }\n\n  function collectTypeExtension(node: TypeExtensionNode) {\n    const name = node.name.value;\n\n    switch (node.kind) {\n      case Kind.OBJECT_TYPE_EXTENSION: {\n        collectFields(node, picks.objects);\n        // Do not include root types as extensions\n        // so we can use them in DefinedFields\n        if (rootTypes.includes(name)) {\n          pushUnique(defined.objects, name);\n          return;\n        }\n\n        pushUnique(extended.objects, name);\n\n        if (node.interfaces?.length > 0) {\n          pushUnique(withIsTypeOf.objects, name);\n        }\n\n        break;\n      }\n\n      case Kind.ENUM_TYPE_EXTENSION: {\n        collectValuesFromEnum(node);\n        pushUnique(extended.enums, name);\n        break;\n      }\n\n      case Kind.INPUT_OBJECT_TYPE_EXTENSION: {\n        collectFields(node, picks.inputs);\n        pushUnique(extended.inputs, name);\n        break;\n      }\n\n      case Kind.INTERFACE_TYPE_EXTENSION: {\n        collectFields(node, picks.interfaces);\n        pushUnique(extended.interfaces, name);\n        break;\n      }\n\n      case Kind.UNION_TYPE_EXTENSION: {\n        pushUnique(extended.unions, name);\n        break;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/presets/graphql-modules/src/config.ts",
    "content": "export type ModulesConfig = {\n  /**\n   * @name baseTypesPath\n   * @type string\n   * @description Required, should point to the base schema types file.\n   * The key of the output is used a base path for this file.\n   *\n   * @example\n   * ```ts filename=\"codegen.ts\" {10}\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        preset: 'modules',\n   *        plugins: ['typescript-resolvers'],\n   *        presetConfig: {\n   *          baseTypesPath: 'types.ts'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  baseTypesPath: string;\n  /**\n   * @name importBaseTypesFrom\n   * @type string\n   * @description Overrides the package import for the base types. Use this if you are within a monorepo, and you wish\n   * to import the base types directly from a different package, and not from a relative path.\n   *\n   */\n  importBaseTypesFrom?: string;\n  /**\n   * @name cwd\n   * @type string\n   * @description Optional, override the `cwd` of the execution. We are using `cwd` to figure out the imports between files. Use this if your execution path is not your project root directory.\n   * @default process.cwd()\n   *\n   * @example\n   * ```ts filename=\"codegen.ts\" {10}\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        preset: 'modules',\n   *        plugins: ['typescript-resolvers'],\n   *        presetConfig: {\n   *          baseTypesPath: 'types.ts',\n   *          cwd: '/some/path'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  cwd?: string;\n  /**\n   * @name importTypesNamespace\n   * @type string\n   * @description Optional, override the name of the import namespace used to import from the `baseTypesPath` file.\n   * @default Types\n   *\n   * @example\n   * ```ts filename=\"codegen.ts\" {10}\n   *  import type { CodegenConfig } from '@graphql-codegen/cli';\n   *\n   *  const config: CodegenConfig = {\n   *    // ...\n   *    generates: {\n   *      'path/to/file.ts': {\n   *        preset: 'modules',\n   *        plugins: ['typescript-resolvers'],\n   *        presetConfig: {\n   *          baseTypesPath: 'types.ts',\n   *          importTypesNamespace: 'core'\n   *        },\n   *      },\n   *    },\n   *  };\n   *  export default config;\n   * ```\n   */\n  importTypesNamespace?: string;\n  /**\n   * @name filename\n   * @type string\n   * @description Required, sets the file name for the generated files.\n   *\n   */\n  filename: string;\n  /**\n   * @name encapsulateModuleTypes\n   * @type string\n   * @default namespace\n   * @description Configure how to encapsulate the module types, to avoid confusion.\n   *\n   * `namespace` (default): will wrap all types in a TypeScript namespace, using the module name.\n   * `prefix`: will prefix all types from a specific module with the module name.\n   * `none`: will skip encapsulation, and generate type as-is.\n   *\n   */\n  encapsulateModuleTypes: 'prefix' | 'namespace' | 'none';\n  /**\n   * @name requireRootResolvers\n   * @type boolean\n   * @default false\n   * @description Generate resolvers of root types (Query, Mutation and Subscription) as non-optional.\n   *\n   * @example\n   * ```yaml\n   * generates:\n   * src/:\n   *  preset: modules\n   *  presetConfig:\n   *    baseTypesPath: types.ts\n   *    filename: types.ts\n   *    requireRootResolvers: true\n   *  plugins:\n   *    - typescript-resolvers\n   * ```\n   */\n  requireRootResolvers?: boolean;\n  /**\n   * @name useGraphQLModules\n   * @type boolean\n   * @default true\n   * @description By default, the generated types will generate some code specific to `graphql-modules` library.\n   *\n   * If you are not using GraphQL-Modules, you can disable this feature by setting this to `false`.\n   */\n  useGraphQLModules?: boolean;\n};\n"
  },
  {
    "path": "packages/presets/graphql-modules/src/index.ts",
    "content": "import { join, relative, resolve } from 'path';\nimport { normalizeImportExtension, Types } from '@graphql-codegen/plugin-helpers';\nimport { BaseVisitor, getConfigValue } from '@graphql-codegen/visitor-plugin-common';\nimport { concatAST, isScalarType } from 'graphql';\nimport { buildModule } from './builder.js';\nimport { ModulesConfig } from './config.js';\nimport { groupSourcesByModule, isGraphQLPrimitive, normalize, stripFilename } from './utils.js';\n\nexport const preset: Types.OutputPreset<ModulesConfig> = {\n  buildGeneratesSection: options => {\n    const { baseOutputDir } = options;\n    const { baseTypesPath, encapsulateModuleTypes } = options.presetConfig;\n    const useGraphQLModules = getConfigValue(options?.presetConfig.useGraphQLModules, true);\n    const requireRootResolvers = getConfigValue(options?.presetConfig.requireRootResolvers, false);\n    const useTypeImports = getConfigValue(options?.config.useTypeImports, false) || false;\n\n    const cwd = resolve(options.presetConfig.cwd || process.cwd());\n    const importTypesNamespace = options.presetConfig.importTypesNamespace || 'Types';\n\n    if (!baseTypesPath) {\n      throw new Error(\n        `Preset \"graphql-modules\" requires you to specify \"baseTypesPath\" configuration and point it to your base types file (generated by \"typescript\" plugin)!`\n      );\n    }\n\n    if (!options.schemaAst?.extensions.sources) {\n      throw new Error(`Preset \"graphql-modules\" requires to use GraphQL SDL`);\n    }\n\n    const extensions: any = options.schemaAst!.extensions;\n    const sourcesByModuleMap = groupSourcesByModule(extensions.extendedSources, baseOutputDir);\n    const modules = Object.keys(sourcesByModuleMap);\n\n    const baseVisitor = new BaseVisitor(options.config, {});\n\n    // One file with an output from all plugins\n    const baseOutput: Types.GenerateOptions = {\n      filename: resolve(cwd, baseOutputDir, baseTypesPath),\n      schema: options.schema,\n      documents: options.documents,\n      plugins: [\n        ...options.plugins,\n        {\n          'modules-exported-scalars': {},\n        },\n      ],\n      pluginMap: {\n        ...options.pluginMap,\n        'modules-exported-scalars': {\n          plugin: schema => {\n            const typeMap = schema.getTypeMap();\n\n            return Object.keys(typeMap)\n              .map(t => {\n                if (t && typeMap[t] && isScalarType(typeMap[t]) && !isGraphQLPrimitive(t)) {\n                  const convertedName = baseVisitor.convertName(t);\n                  return `export type ${convertedName} = Scalars[\"${t}\"];`;\n                }\n\n                return null;\n              })\n              .filter(Boolean)\n              .join('\\n');\n          },\n        },\n      },\n      config: {\n        ...options.config,\n        enumsAsTypes: true,\n      },\n      schemaAst: options.schemaAst!,\n      documentTransforms: options.documentTransforms,\n    };\n\n    const importExtension = normalizeImportExtension({\n      emitLegacyCommonJSImports: options.config.emitLegacyCommonJSImports,\n      importExtension: options.config.importExtension,\n    });\n\n    const baseTypesFilename = baseTypesPath.replace(\n      /\\.(js|ts|d.ts)$/,\n      // we need extension if ESM modules are used\n      importExtension\n    );\n    const baseTypesDir = stripFilename(baseOutput.filename);\n\n    // One file per each module\n    const outputs: Types.GenerateOptions[] = modules.map(moduleName => {\n      const filename = resolve(cwd, baseOutputDir, moduleName, options.presetConfig.filename);\n      const dirpath = stripFilename(filename);\n      const relativePath = relative(dirpath, baseTypesDir);\n      const importPath = options.presetConfig.importBaseTypesFrom || normalize(join(relativePath, baseTypesFilename));\n      const sources = sourcesByModuleMap[moduleName];\n\n      const moduleDocument = concatAST(sources.map(source => source.document));\n\n      const shouldDeclare = filename.endsWith('.d.ts');\n\n      return {\n        filename,\n        schema: options.schema,\n        documents: [],\n        plugins: [\n          ...options.plugins.filter(p => typeof p === 'object' && !!p.add),\n          {\n            'graphql-modules-plugin': {},\n          },\n        ],\n        pluginMap: {\n          ...options.pluginMap,\n          'graphql-modules-plugin': {\n            plugin: schema =>\n              buildModule(moduleName, moduleDocument, {\n                importNamespace: importTypesNamespace,\n                importPath,\n                encapsulate: encapsulateModuleTypes || 'namespace',\n                requireRootResolvers,\n                shouldDeclare,\n                schema,\n                baseVisitor,\n                useGraphQLModules,\n                rootTypes: [\n                  schema.getQueryType()?.name,\n                  schema.getMutationType()?.name,\n                  schema.getSubscriptionType()?.name,\n                ].filter(Boolean),\n                useTypeImports,\n              }),\n          },\n        },\n        config: options.config,\n        schemaAst: options.schemaAst,\n        documentTransforms: options.documentTransforms,\n      };\n    });\n\n    return [baseOutput].concat(outputs);\n  },\n};\n\nexport default preset;\n"
  },
  {
    "path": "packages/presets/graphql-modules/src/utils.ts",
    "content": "import { Source } from '@graphql-tools/utils';\nimport {\n  DefinitionNode,\n  DocumentNode,\n  FieldDefinitionNode,\n  InputValueDefinitionNode,\n  Kind,\n  NamedTypeNode,\n  TypeNode,\n} from 'graphql';\nimport parse from 'parse-filepath';\n\nconst sep = '/';\n\n/**\n * Searches every node to collect used types\n */\nexport function collectUsedTypes(doc: DocumentNode): string[] {\n  const used: string[] = [];\n\n  for (const node of doc.definitions) {\n    findRelated(node);\n  }\n\n  function markAsUsed(type: string) {\n    pushUnique(used, type);\n  }\n\n  function findRelated(node: DefinitionNode | FieldDefinitionNode | InputValueDefinitionNode | NamedTypeNode) {\n    if (node.kind === Kind.OBJECT_TYPE_DEFINITION || node.kind === Kind.OBJECT_TYPE_EXTENSION) {\n      // Object\n      markAsUsed(node.name.value);\n\n      if (node.fields) {\n        for (const n of node.fields) {\n          findRelated(n);\n        }\n      }\n\n      if (node.interfaces) {\n        for (const n of node.interfaces) {\n          findRelated(n);\n        }\n      }\n    } else if (node.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION || node.kind === Kind.INPUT_OBJECT_TYPE_EXTENSION) {\n      // Input\n      markAsUsed(node.name.value);\n\n      if (node.fields) {\n        for (const n of node.fields) {\n          findRelated(n);\n        }\n      }\n    } else if (node.kind === Kind.INTERFACE_TYPE_DEFINITION || node.kind === Kind.INTERFACE_TYPE_EXTENSION) {\n      // Interface\n      markAsUsed(node.name.value);\n\n      if (node.fields) {\n        for (const n of node.fields) {\n          findRelated(n);\n        }\n      }\n\n      if (node.interfaces) {\n        for (const n of node.interfaces) {\n          findRelated(n);\n        }\n      }\n    } else if (node.kind === Kind.UNION_TYPE_DEFINITION || node.kind === Kind.UNION_TYPE_EXTENSION) {\n      // Union\n      markAsUsed(node.name.value);\n\n      if (node.types) {\n        for (const n of node.types) {\n          findRelated(n);\n        }\n      }\n    } else if (node.kind === Kind.ENUM_TYPE_DEFINITION || node.kind === Kind.ENUM_TYPE_EXTENSION) {\n      // Enum\n      markAsUsed(node.name.value);\n    } else if (node.kind === Kind.SCALAR_TYPE_DEFINITION || node.kind === Kind.SCALAR_TYPE_EXTENSION) {\n      // Scalar\n      if (!isGraphQLPrimitive(node.name.value)) {\n        markAsUsed(node.name.value);\n      }\n    } else if (node.kind === Kind.INPUT_VALUE_DEFINITION) {\n      // Argument\n      findRelated(resolveTypeNode(node.type));\n    } else if (node.kind === Kind.FIELD_DEFINITION) {\n      // Field\n      findRelated(resolveTypeNode(node.type));\n\n      if (node.arguments) {\n        for (const n of node.arguments) {\n          findRelated(n);\n        }\n      }\n    } else if (\n      node.kind === Kind.NAMED_TYPE &&\n      // Named type\n      !isGraphQLPrimitive(node.name.value)\n    ) {\n      markAsUsed(node.name.value);\n    }\n  }\n\n  return used;\n}\n\nexport function resolveTypeNode(node: TypeNode): NamedTypeNode {\n  if (node.kind === Kind.LIST_TYPE) {\n    return resolveTypeNode(node.type);\n  }\n\n  if (node.kind === Kind.NON_NULL_TYPE) {\n    return resolveTypeNode(node.type);\n  }\n\n  return node;\n}\n\nexport function isGraphQLPrimitive(name: string): boolean {\n  return ['String', 'Boolean', 'ID', 'Float', 'Int'].includes(name);\n}\n\nexport function unique<T>(val: T, i: number, all: T[]): boolean {\n  return i === all.indexOf(val);\n}\n\nexport function withQuotes(val: string): string {\n  return `'${val}'`;\n}\n\nexport function indent(size: number) {\n  const space = new Array(size).fill(' ').join('');\n\n  function indentInner(val: string): string {\n    return val\n      .split('\\n')\n      .map(line => `${space}${line}`)\n      .join('\\n');\n  }\n\n  return indentInner;\n}\n\nexport function buildBlock({ name, lines }: { name: string; lines: string[] }): string {\n  if (!lines.length) {\n    return '';\n  }\n\n  return [`${name} {`, ...lines.map(indent(2)), '};'].join('\\n');\n}\n\nconst getRelativePath = function (filepath: string, basePath: string) {\n  const normalizedFilepath = normalize(filepath);\n  const normalizedBasePath = ensureStartsWithSeparator(normalize(ensureEndsWithSeparator(basePath)));\n  const [, relativePath] = normalizedFilepath.split(normalizedBasePath);\n  return relativePath;\n};\n\nexport function groupSourcesByModule(sources: Source[], basePath: string): Record<string, Source[]> {\n  const grouped: Record<string, Source[]> = {};\n\n  for (const source of sources) {\n    const relativePath = getRelativePath(source.location, basePath);\n\n    if (relativePath) {\n      // PERF: we could guess the module by matching source.location with a list of already resolved paths\n      const mod = extractModuleDirectory(source.location, basePath);\n\n      grouped[mod] ||= [];\n\n      grouped[mod].push(source);\n    }\n  }\n\n  return grouped;\n}\n\nfunction extractModuleDirectory(filepath: string, basePath: string): string {\n  const relativePath = getRelativePath(filepath, basePath);\n\n  const [moduleDirectory] = relativePath.split(sep);\n\n  return moduleDirectory;\n}\n\nexport function stripFilename(path: string) {\n  const parsedPath = parse(path);\n  return normalize(parsedPath.dir);\n}\n\nexport function normalize(path: string) {\n  return path.replace(/\\\\/g, '/');\n}\n\nfunction ensureEndsWithSeparator(path: string) {\n  return path.endsWith(sep) ? path : path + sep;\n}\n\nfunction ensureStartsWithSeparator(path: string) {\n  return path.startsWith('.') ? path.replace(/^(..\\/)|(.\\/)/, '/') : path.startsWith('/') ? path : '/' + path;\n}\n\n/**\n * Pushes an item to a list only if the list doesn't include the item\n */\nexport function pushUnique<T>(list: T[], item: T): void {\n  if (!list.includes(item)) {\n    list.push(item);\n  }\n}\n\nexport function concatByKey<T extends Record<string, any[]>, K extends keyof T>(left: T, right: T, key: K) {\n  // Remove duplicate, if an element is in right & left, it will be only once in the returned array.\n  return [...new Set([...left[key], ...right[key]])];\n}\n\nexport function uniqueByKey<T extends Record<string, any[]>, K extends keyof T>(left: T, right: T, key: K) {\n  return left[key].filter(item => !right[key].includes(item));\n}\n\nexport function createObject<K extends string, T>(keys: K[], valueFn: (key: K) => T) {\n  const obj: Record<K, T> = {} as any;\n\n  for (const key of keys) {\n    obj[key] = valueFn(key);\n  }\n\n  return obj;\n}\n"
  },
  {
    "path": "packages/presets/graphql-modules/tests/__snapshots__/builder.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`encapsulate: should wrap correctly with namespace 1`] = `\n\"import * as core from \"../types\";\nimport * as gm from \"graphql-modules\";\nexport namespace TestModule {\n  interface DefinedFields {\n    Article: 'id' | 'title' | 'text' | 'author' | 'comments' | 'url';\n    Query: 'articles' | 'articleById' | 'articlesByUser';\n    User: 'articles';\n    Node: 'id';\n  };\n  \n  interface DefinedEnumValues {\n    UserKind: 'ADMIN' | 'WRITER' | 'REGULAR';\n  };\n  \n  interface DefinedInputFields {\n    NewArticle: 'title' | 'text';\n  };\n  \n  export type Article = Pick<core.Article, DefinedFields['Article']>;\n  export type User = core.User;\n  export type Comment = core.Comment;\n  export type Node = Pick<core.Node, DefinedFields['Node']>;\n  export type ArticleOrUser = core.ArticleOrUser;\n  export type NewArticle = Pick<core.NewArticle, DefinedInputFields['NewArticle']>;\n  export type Query = Pick<core.Query, DefinedFields['Query']>;\n  export type UserKind = DefinedEnumValues['UserKind'];\n  \n  export type Scalars = Pick<core.Scalars, 'DateTime' | 'URL'>;\n  export type DateTimeScalarConfig = core.DateTimeScalarConfig;\n  export type UrlScalarConfig = core.UrlScalarConfig;\n  \n  export type ArticleResolvers = Pick<core.ArticleResolvers, DefinedFields['Article'] | '__isTypeOf'>;\n  export type QueryResolvers = Pick<core.QueryResolvers, DefinedFields['Query']>;\n  export type UserResolvers = Pick<core.UserResolvers, DefinedFields['User']>;\n  export type NodeResolvers = Pick<core.NodeResolvers, DefinedFields['Node']>;\n  \n  export interface Resolvers {\n    Article?: ArticleResolvers;\n    Query?: QueryResolvers;\n    User?: UserResolvers;\n    DateTime?: core.Resolvers['DateTime'];\n    URL?: core.Resolvers['URL'];\n  };\n  \n  export interface MiddlewareMap {\n    '*'?: {\n      '*'?: gm.Middleware[];\n    };\n    Article?: {\n      '*'?: gm.Middleware[];\n      id?: gm.Middleware[];\n      title?: gm.Middleware[];\n      text?: gm.Middleware[];\n      author?: gm.Middleware[];\n      comments?: gm.Middleware[];\n      url?: gm.Middleware[];\n    };\n    User?: {\n      '*'?: gm.Middleware[];\n      articles?: gm.Middleware[];\n    };\n    Query?: {\n      '*'?: gm.Middleware[];\n      articles?: gm.Middleware[];\n      articleById?: gm.Middleware[];\n      articlesByUser?: gm.Middleware[];\n    };\n  };\n}\"\n`;\n\nexports[`encapsulate: should wrap correctly with prefix 1`] = `\n\"import * as core from \"../types\";\nimport * as gm from \"graphql-modules\";\ninterface DefinedFields {\n  Article: 'id' | 'title' | 'text' | 'author' | 'comments' | 'url';\n  Query: 'articles' | 'articleById' | 'articlesByUser';\n  User: 'articles';\n  Node: 'id';\n};\n\ninterface DefinedEnumValues {\n  UserKind: 'ADMIN' | 'WRITER' | 'REGULAR';\n};\n\ninterface DefinedInputFields {\n  NewArticle: 'title' | 'text';\n};\n\nexport type Test_Article = Pick<core.Article, DefinedFields['Article']>;\nexport type Test_User = core.User;\nexport type Test_Comment = core.Comment;\nexport type Test_Node = Pick<core.Node, DefinedFields['Node']>;\nexport type Test_ArticleOrUser = core.ArticleOrUser;\nexport type Test_NewArticle = Pick<core.NewArticle, DefinedInputFields['NewArticle']>;\nexport type Test_Query = Pick<core.Query, DefinedFields['Query']>;\nexport type Test_UserKind = DefinedEnumValues['UserKind'];\n\nexport type Test_Scalars = Pick<core.Scalars, 'DateTime' | 'URL'>;\nexport type Test_DateTimeScalarConfig = core.DateTimeScalarConfig;\nexport type Test_UrlScalarConfig = core.UrlScalarConfig;\n\nexport type Test_ArticleResolvers = Pick<core.ArticleResolvers, DefinedFields['Article'] | '__isTypeOf'>;\nexport type Test_QueryResolvers = Pick<core.QueryResolvers, DefinedFields['Query']>;\nexport type Test_UserResolvers = Pick<core.UserResolvers, DefinedFields['User']>;\nexport type Test_NodeResolvers = Pick<core.NodeResolvers, DefinedFields['Node']>;\n\nexport interface Test_Resolvers {\n  Article?: Test_ArticleResolvers;\n  Query?: Test_QueryResolvers;\n  User?: Test_UserResolvers;\n  DateTime?: Test_core.Resolvers['DateTime'];\n  URL?: Test_core.Resolvers['URL'];\n};\n\nexport interface Test_MiddlewareMap {\n  '*'?: {\n    '*'?: gm.Middleware[];\n  };\n  Article?: {\n    '*'?: gm.Middleware[];\n    id?: gm.Middleware[];\n    title?: gm.Middleware[];\n    text?: gm.Middleware[];\n    author?: gm.Middleware[];\n    comments?: gm.Middleware[];\n    url?: gm.Middleware[];\n  };\n  User?: {\n    '*'?: gm.Middleware[];\n    articles?: gm.Middleware[];\n  };\n  Query?: {\n    '*'?: gm.Middleware[];\n    articles?: gm.Middleware[];\n    articleById?: gm.Middleware[];\n    articlesByUser?: gm.Middleware[];\n  };\n};\"\n`;\n"
  },
  {
    "path": "packages/presets/graphql-modules/tests/__snapshots__/integration.spec.ts.snap",
    "content": "// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html\n\nexports[`Integration > dotanions module should export DefinedFields, Schema Types with Picks and resolvers 1`] = `\n\"import * as Types from \"../global-types\";\nimport * as gm from \"graphql-modules\";\ninterface DefinedFields {\n  Paypal: 'id' | 'url';\n  CreditCard: 'id' | 'cardNumber' | 'cardOwner';\n  Donation: 'id' | 'sender' | 'recipient' | 'amount';\n  Mutation: 'donate';\n  User: 'paymentOptions';\n};\n\ninterface DefinedInputFields {\n  DonationInput: 'user' | 'amount' | 'paymentOption';\n};\n\nexport type Paypal = Pick<Types.Paypal, DefinedFields['Paypal']>;\nexport type CreditCard = Pick<Types.CreditCard, DefinedFields['CreditCard']>;\nexport type PaymentOption = Types.PaymentOption;\nexport type User = Types.User;\nexport type Donation = Pick<Types.Donation, DefinedFields['Donation']>;\nexport type DonationInput = Pick<Types.DonationInput, DefinedInputFields['DonationInput']>;\nexport type Mutation = Pick<Types.Mutation, DefinedFields['Mutation']>;\n\nexport type PaypalResolvers = Pick<Types.PaypalResolvers, DefinedFields['Paypal'] | '__isTypeOf'>;\nexport type CreditCardResolvers = Pick<Types.CreditCardResolvers, DefinedFields['CreditCard'] | '__isTypeOf'>;\nexport type DonationResolvers = Pick<Types.DonationResolvers, DefinedFields['Donation']>;\nexport type MutationResolvers = Pick<Types.MutationResolvers, DefinedFields['Mutation']>;\nexport type UserResolvers = Pick<Types.UserResolvers, DefinedFields['User']>;\n\nexport interface Resolvers {\n  Paypal?: PaypalResolvers;\n  CreditCard?: CreditCardResolvers;\n  Donation?: DonationResolvers;\n  Mutation?: MutationResolvers;\n  User?: UserResolvers;\n};\n\nexport interface MiddlewareMap {\n  '*'?: {\n    '*'?: gm.Middleware[];\n  };\n  Paypal?: {\n    '*'?: gm.Middleware[];\n    id?: gm.Middleware[];\n    url?: gm.Middleware[];\n  };\n  CreditCard?: {\n    '*'?: gm.Middleware[];\n    id?: gm.Middleware[];\n    cardNumber?: gm.Middleware[];\n    cardOwner?: gm.Middleware[];\n  };\n  User?: {\n    '*'?: gm.Middleware[];\n    paymentOptions?: gm.Middleware[];\n  };\n  Donation?: {\n    '*'?: gm.Middleware[];\n    id?: gm.Middleware[];\n    sender?: gm.Middleware[];\n    recipient?: gm.Middleware[];\n    amount?: gm.Middleware[];\n  };\n  Mutation?: {\n    '*'?: gm.Middleware[];\n    donate?: gm.Middleware[];\n  };\n};\"\n`;\n"
  },
  {
    "path": "packages/presets/graphql-modules/tests/builder.spec.ts",
    "content": "import '@graphql-codegen/testing';\nimport { BaseVisitor } from '@graphql-codegen/visitor-plugin-common';\nimport { parse } from 'graphql';\nimport { buildModule } from '../src/builder.js';\n\nconst ROOT_TYPES = ['Query'];\n\nconst testDoc = parse(/* GraphQL */ `\n  scalar DateTime\n  scalar URL\n\n  type Article {\n    id: ID!\n    title: String!\n    text: String!\n    author: User!\n    comments: [Comment!]\n    url: URL!\n  }\n\n  interface Node {\n    id: ID!\n  }\n\n  union ArticleOrUser = Article | User\n\n  input NewArticle {\n    title: String!\n    text: String!\n  }\n\n  extend type User {\n    articles: [Article!]\n  }\n\n  extend type Query {\n    articles: [Article!]\n    articleById(id: ID!): Article\n    articlesByUser(userId: ID!): [Article!]\n  }\n\n  enum UserKind {\n    ADMIN\n    WRITER\n    REGULAR\n  }\n`);\n\nconst baseVisitor = new BaseVisitor({}, {});\n\ntest('should generate interface field resolvers', () => {\n  const output = buildModule(\n    'test',\n    parse(/* GraphQL */ `\n      interface BaseUser {\n        id: ID!\n        email: String!\n      }\n\n      type User implements BaseUser {\n        id: ID!\n        email: String!\n      }\n\n      type Query {\n        me: BaseUser!\n      }\n    `),\n    {\n      importPath: '../types',\n      importNamespace: 'core',\n      encapsulate: 'none',\n      requireRootResolvers: false,\n      shouldDeclare: false,\n      rootTypes: ROOT_TYPES,\n      baseVisitor,\n      useGraphQLModules: true,\n    }\n  );\n\n  expect(output).toContain(`BaseUser: 'id' | 'email';`);\n  expect(output).toContain(`export type BaseUser = Pick<core.BaseUser, DefinedFields['BaseUser']>;`);\n  expect(output).toContain(`export type BaseUserResolvers = Pick<core.BaseUserResolvers, DefinedFields['BaseUser']>;`);\n});\n\ntest('should not generate graphql-modules code when useGraphQLModules=false', () => {\n  const output = buildModule(\n    'test',\n    parse(/* GraphQL */ `\n      interface BaseUser {\n        id: ID!\n        email: String!\n      }\n\n      type User implements BaseUser {\n        id: ID!\n        email: String!\n      }\n\n      type Query {\n        me: BaseUser!\n      }\n    `),\n    {\n      importPath: '../types',\n      importNamespace: 'core',\n      encapsulate: 'none',\n      shouldDeclare: false,\n      rootTypes: ROOT_TYPES,\n      baseVisitor,\n      useGraphQLModules: false,\n      requireRootResolvers: false,\n    }\n  );\n\n  expect(output).not.toContain(`graphql-modules`);\n  expect(output).not.toContain(`gm.`);\n});\n\ntest('should generate interface extensions field resolvers ', () => {\n  const output = buildModule(\n    'test',\n    parse(/* GraphQL */ `\n      extend interface BaseUser {\n        newField: String!\n      }\n\n      type Query {\n        me: BaseUser!\n      }\n    `),\n    {\n      importPath: '../types',\n      importNamespace: 'core',\n      encapsulate: 'none',\n      requireRootResolvers: false,\n      shouldDeclare: false,\n      rootTypes: ROOT_TYPES,\n      baseVisitor,\n      useGraphQLModules: true,\n    }\n  );\n\n  expect(output).toContain(`BaseUser: 'newField';`);\n  expect(output).toContain(`export type BaseUser = core.BaseUser`);\n  expect(output).toContain(`export type BaseUserResolvers = Pick<core.BaseUserResolvers, DefinedFields['BaseUser']>;`);\n});\n\ntest('should include import statement', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'none',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).toBeSimilarStringTo(`\n    import * as core from \"../types\";\n  `);\n});\n\ntest('should include import type statement', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'none',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n    useTypeImports: true,\n  });\n\n  expect(output).toBeSimilarStringTo(`\n    import type * as core from \"../types\";\n  `);\n});\n\ntest('should work with naming conventions', () => {\n  const output = buildModule('test', parse(`type query_root { test: ID! } schema { query: query_root }`), {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'none',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).toContain(`Pick<core.Query_RootResolvers, `);\n  expect(output).toContain(`Pick<core.Query_Root,`);\n});\n\ntest('encapsulate: should wrap correctly with namespace', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'namespace',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).toBeSimilarStringTo(`export namespace TestModule {`);\n  expect(output).toMatchSnapshot();\n});\n\ntest('encapsulate: should wrap correctly with a declared namespace', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'namespace',\n    requireRootResolvers: false,\n    shouldDeclare: true,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).toBeSimilarStringTo(`declare namespace TestModule {`);\n});\n\ntest('encapsulate: should wrap correctly with prefix', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'prefix',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).toMatchSnapshot();\n  expect(output).toContain(`export type Test_Article`);\n  expect(output).toContain(`export type Test_User`);\n  expect(output).toContain(`export type Test_Scalars`);\n  expect(output).toContain(`export type Test_ArticleResolvers`);\n  expect(output).toContain(`export interface Test_Resolvers`);\n  expect(output).toContain(`export interface Test_MiddlewareMap`);\n  expect(output).toContain(`interface DefinedFields {`);\n  expect(output).toContain(`interface DefinedEnumValues {`);\n  expect(output).toContain(`interface DefinedInputFields {`);\n  expect(output).not.toBeSimilarStringTo(`export namespace Test {`);\n});\n\ntest('should pick fields from defined and extended types', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'none',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).toBeSimilarStringTo(`\n    interface DefinedFields {\n      Article: 'id' | 'title' | 'text' | 'author' | 'comments' | 'url';\n      Query: 'articles' | 'articleById' | 'articlesByUser';\n      User: 'articles';\n      Node: 'id';\n    };\n  `);\n\n  expect(output).toBeSimilarStringTo(`\n    interface DefinedEnumValues {\n      UserKind: 'ADMIN' | 'WRITER' | 'REGULAR';\n    };\n  `);\n\n  expect(output).toBeSimilarStringTo(`\n    interface DefinedInputFields {\n      NewArticle: 'title' | 'text';\n    };\n  `);\n});\n\ntest('should reexport used types but not defined in module', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'none',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).toBeSimilarStringTo(`\n    export type User = core.User;\n  `);\n  expect(output).toBeSimilarStringTo(`\n    export type Comment = core.Comment;\n  `);\n});\n\ntest('should export partial types, only those defined in module or root types', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'none',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).toBeSimilarStringTo(`\n    export type Article = Pick<core.Article, DefinedFields['Article']>;\n  `);\n  expect(output).toBeSimilarStringTo(`\n    export type Query = Pick<core.Query, DefinedFields['Query']>;\n  `);\n  expect(output).toBeSimilarStringTo(`\n    export type UserKind = DefinedEnumValues['UserKind'];\n  `);\n  expect(output).toBeSimilarStringTo(`\n    export type NewArticle = Pick<core.NewArticle, DefinedInputFields['NewArticle']>;\n  `);\n  expect(output).toBeSimilarStringTo(`\n    export type Node = Pick<core.Node, DefinedFields['Node']>;\n  `);\n  expect(output).toBeSimilarStringTo(`\n    export type ArticleOrUser = core.ArticleOrUser;\n  `);\n});\n\ntest('should export partial types of scalars, only those defined in module or root types', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'none',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).toBeSimilarStringTo(`\n    export type Scalars = Pick<core.Scalars, 'DateTime' | 'URL'>;\n  `);\n\n  // DateTime type should not be generated\n  expect(output).not.toBeSimilarStringTo(`\n    export type DateTime =\n  `);\n});\n\ntest('should use and export resolver signatures of types defined or extended in a module', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'none',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).toBeSimilarStringTo(`\n    export type ArticleResolvers = Pick<core.ArticleResolvers, DefinedFields['Article'] | '__isTypeOf'>;\n  `);\n  expect(output).toBeSimilarStringTo(`\n    export type QueryResolvers = Pick<core.QueryResolvers, DefinedFields['Query']>;\n  `);\n  expect(output).toBeSimilarStringTo(`\n    export type UserResolvers = Pick<core.UserResolvers, DefinedFields['User']>;\n  `);\n  expect(output).toBeSimilarStringTo(`\n    export type DateTimeScalarConfig = core.DateTimeScalarConfig;\n  `);\n  expect(output).toBeSimilarStringTo(`\n    export type UrlScalarConfig = core.UrlScalarConfig;\n  `);\n  // Interfaces should not have resolvers\n  // We want Object types to have __isTypeOf\n  expect(output).toBeSimilarStringTo(`\n    export type NodeResolvers\n  `);\n  // Unions should not have resolvers\n  // We want Object types to have __isTypeOf\n  expect(output).not.toBeSimilarStringTo(`\n    export type ArticleOrUserResolvers\n  `);\n});\n\ntest('should not generate resolver signatures of types that are not defined or extened by a module', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'none',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).not.toContain('CommentResolvers');\n});\n\ntest('should generate an aggregation of individual resolver signatures', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'none',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).toBeSimilarStringTo(`\n    export interface Resolvers {\n      Article?: ArticleResolvers;\n      Query?: QueryResolvers;\n      User?: UserResolvers;\n      DateTime?: core.Resolvers['DateTime'];\n      URL?: core.Resolvers['URL'];\n    };\n  `);\n});\n\ntest('should generate a signature for ResolveMiddleware (with widlcards)', () => {\n  const output = buildModule('test', testDoc, {\n    importPath: '../types',\n    importNamespace: 'core',\n    encapsulate: 'none',\n    requireRootResolvers: false,\n    shouldDeclare: false,\n    rootTypes: ROOT_TYPES,\n    baseVisitor,\n    useGraphQLModules: true,\n  });\n\n  expect(output).toContain(`import * as gm from \"graphql-modules\";`);\n\n  expect(output).toBeSimilarStringTo(`\n    export interface MiddlewareMap {\n      '*'?: {\n        '*'?: gm.Middleware[];\n      };\n      Article?: {\n        '*'?: gm.Middleware[];\n        id?: gm.Middleware[];\n        title?: gm.Middleware[];\n        text?: gm.Middleware[];\n        author?: gm.Middleware[];\n        comments?: gm.Middleware[];\n        url?: gm.Middleware[];\n      };\n      User?: {\n        '*'?: gm.Middleware[];\n        articles?: gm.Middleware[];\n      };\n      Query?: {\n        '*'?: gm.Middleware[];\n        articles?: gm.Middleware[];\n        articleById?: gm.Middleware[];\n        articlesByUser?: gm.Middleware[];\n      };\n    };\n  `);\n});\n\ntest('only picks __isTypeOf from implementing types (of Interfaces) and union members', () => {\n  const output = buildModule(\n    'test',\n    parse(/* GraphQL */ `\n      type Query {\n        me: User\n        pet: Pet\n        offer: Offer\n      }\n\n      type User {\n        id: ID!\n        username: String!\n      }\n\n      interface Pet {\n        id: ID!\n        name: String!\n      }\n      type Cat implements Pet {\n        id: ID!\n        name: String!\n        canScratch: Boolean!\n      }\n      type Dog implements Pet {\n        id: ID!\n        name: String!\n        canBark: Boolean!\n      }\n      type Elephant {\n        id: ID!\n      }\n      extend type Elephant implements Pet {\n        name: String!\n        hasTrunk: Boolean!\n      }\n\n      union Offer = Discount | Coupon\n      type Discount {\n        id: ID!\n        name: String!\n      }\n      type Coupon {\n        id: ID!\n        name: String!\n      }\n    `),\n    {\n      importPath: '../types',\n      importNamespace: 'core',\n      encapsulate: 'none',\n      requireRootResolvers: false,\n      shouldDeclare: false,\n      rootTypes: ROOT_TYPES,\n      baseVisitor,\n      useGraphQLModules: true,\n    }\n  );\n\n  // User does not pick `__isTypeOf` because it is not a union member, or implementing types\n  expect(output).toBeSimilarStringTo(`\n    export type UserResolvers = Pick<core.UserResolvers, DefinedFields['User']>;\n  `);\n\n  // Cat picks `__isTypeOf` because it is an implementing type of Pet\n  expect(output).toBeSimilarStringTo(`\n    export type CatResolvers = Pick<core.CatResolvers, DefinedFields['Cat'] | '__isTypeOf'>;\n  `);\n  // Dog picks `__isTypeOf` because it is an implementing type of Pet\n  expect(output).toBeSimilarStringTo(`\n    export type DogResolvers = Pick<core.DogResolvers, DefinedFields['Dog'] | '__isTypeOf'>;\n  `);\n  // Elephant picks `__isTypeOf` because it is an implementing type of Pet, via `extend type `\n  expect(output).toBeSimilarStringTo(`\n    export type ElephantResolvers = Pick<core.ElephantResolvers, DefinedFields['Elephant'] | '__isTypeOf'>;\n  `);\n\n  // Discount picks `__isTypeOf` because it is a union member\n  expect(output).toBeSimilarStringTo(`\n    export type DiscountResolvers = Pick<core.DiscountResolvers, DefinedFields['Discount'] | '__isTypeOf'>;\n  `);\n  // Coupon picks `__isTypeOf` because it is a union member\n  expect(output).toBeSimilarStringTo(`\n    export type CouponResolvers = Pick<core.CouponResolvers, DefinedFields['Coupon'] | '__isTypeOf'>;\n  `);\n});\n"
  },
  {
    "path": "packages/presets/graphql-modules/tests/integration.spec.ts",
    "content": "import '@graphql-codegen/testing';\nimport { normalize } from 'path';\nimport { executeCodegen } from '@graphql-codegen/cli';\n\nconst options = {\n  generates: {\n    './tests/test-files/modules': {\n      schema: './tests/test-files/modules/*/types/*.graphql',\n      plugins: ['typescript', 'typescript-resolvers'],\n      preset: 'graphql-modules' as const,\n      presetConfig: {\n        baseTypesPath: 'global-types.ts',\n        filename: 'module-types.ts',\n        encapsulateModuleTypes: 'none',\n      },\n    },\n  },\n};\n\ndescribe('Integration', () => {\n  // In this test, we make sure executeCodegen passes on a list of Sources as an extension\n  // This is very important\n  test('should generate a base output and 4 for modules', async () => {\n    const { result } = await executeCodegen(options);\n\n    expect(result.length).toBe(5);\n    expect(normalize(result[0].filename)).toMatch(normalize(`/modules/global-types.ts`));\n    expect(normalize(result[1].filename)).toMatch(normalize(`/modules/blog/module-types.ts`));\n    expect(normalize(result[2].filename)).toMatch(normalize(`/modules/common/module-types.ts`));\n    expect(normalize(result[3].filename)).toMatch(normalize(`/modules/dotanions/module-types.ts`));\n    expect(normalize(result[4].filename)).toMatch(normalize(`/modules/users/module-types.ts`));\n  });\n\n  test('should not duplicate type even if type and extend type are in the same module', async () => {\n    const { result } = await executeCodegen(options);\n\n    const userResolversStr = `export type UserResolvers = Pick<Types.UserResolvers, DefinedFields['User']>;`;\n    const nbOfTimeUserResolverFound = result[4].content.split(userResolversStr).length - 1;\n\n    expect(nbOfTimeUserResolverFound).toBe(1);\n  });\n\n  test('should allow to override importBaseTypesFrom correctly', async () => {\n    const { result } = await executeCodegen({\n      generates: {\n        './tests/test-files/modules': {\n          schema: './tests/test-files/modules/*/types/*.graphql',\n          plugins: ['typescript', 'typescript-resolvers'],\n          preset: 'graphql-modules',\n          presetConfig: {\n            importBaseTypesFrom: '@types',\n            baseTypesPath: 'global-types.ts',\n            filename: 'module-types.ts',\n            encapsulateModuleTypes: 'none',\n          },\n        },\n      },\n    });\n    const importStatement = `import * as Types from \"@types\";`;\n\n    expect(result.length).toBe(5);\n    expect(result[1].content).toMatch(importStatement);\n    expect(result[2].content).toMatch(importStatement);\n    expect(result[3].content).toMatch(importStatement);\n    expect(result[4].content).toMatch(importStatement);\n  });\n\n  test('should import with respect of useTypeImports config correctly', async () => {\n    const { result } = await executeCodegen({\n      generates: {\n        './tests/test-files/modules': {\n          schema: './tests/test-files/modules/*/types/*.graphql',\n          plugins: ['typescript', 'typescript-resolvers'],\n          preset: 'graphql-modules',\n          presetConfig: {\n            importBaseTypesFrom: '@types',\n            baseTypesPath: 'global-types.ts',\n            filename: 'module-types.ts',\n            encapsulateModuleTypes: 'none',\n          },\n        },\n      },\n      config: {\n        useTypeImports: true,\n      },\n    });\n\n    const importStatement = `import type * as Types from \"@types\";`;\n\n    expect(result.length).toBe(5);\n    expect(result[1].content).toMatch(importStatement);\n    expect(result[2].content).toMatch(importStatement);\n    expect(result[3].content).toMatch(importStatement);\n    expect(result[4].content).toMatch(importStatement);\n  });\n\n  test('should allow to disable graphql-modules', async () => {\n    const { result } = await executeCodegen({\n      generates: {\n        './tests/test-files/modules': {\n          schema: './tests/test-files/modules/*/types/*.graphql',\n          plugins: ['typescript', 'typescript-resolvers'],\n          preset: 'graphql-modules',\n          presetConfig: {\n            importBaseTypesFrom: '@types',\n            baseTypesPath: 'global-types.ts',\n            filename: 'module-types.ts',\n            encapsulateModuleTypes: 'none',\n            useGraphQLModules: false,\n          },\n        },\n      },\n    });\n\n    for (const record of result) {\n      expect(record).not.toContain(`graphql-modules`);\n      expect(record).not.toContain(`gm.`);\n    }\n  });\n\n  test('each module-types should include a relative import to glob-types module', async () => {\n    const { result } = await executeCodegen(options);\n    const importStatement = `import * as Types from \"../global-types\";`;\n\n    expect(result.length).toBe(5);\n    expect(result[1].content).toMatch(importStatement);\n    expect(result[2].content).toMatch(importStatement);\n    expect(result[3].content).toMatch(importStatement);\n    expect(result[4].content).toMatch(importStatement);\n  });\n\n  test('each module-types should export Resolvers', async () => {\n    const { result } = await executeCodegen(options);\n    const exportStatemment = `export interface Resolvers `;\n\n    expect(result.length).toBe(5);\n    expect(result[1].content).toMatch(exportStatemment);\n    expect(result[2].content).toMatch(exportStatemment);\n    expect(result[3].content).toMatch(exportStatemment);\n    expect(result[4].content).toMatch(exportStatemment);\n  });\n\n  test('dotanions module should export DefinedFields, Schema Types with Picks and resolvers', async () => {\n    const { result } = await executeCodegen(options);\n\n    expect(result.length).toBe(5);\n    expect(result[3].content).toMatchSnapshot();\n  });\n\n  test('should NOT produce required root-level resolvers in Resolvers interface by default', async () => {\n    const { result } = await executeCodegen(options);\n\n    const usersModuleOutput = result.find(o => o.filename.includes('users'))!;\n\n    expect(usersModuleOutput).toBeDefined();\n    expect(usersModuleOutput.content).toContain(\n      `export type QueryResolvers = Pick<Types.QueryResolvers, DefinedFields['Query']>;`\n    );\n    expect(usersModuleOutput.content).toContain('Query?: QueryResolvers;');\n  });\n\n  test('should produce required root-level resolvers in Resolvers interface when requireRootResolvers flag is enabled', async () => {\n    const optionsCopy = Object.assign({} as any, options);\n\n    optionsCopy.generates['./tests/test-files/modules'].presetConfig = {\n      ...optionsCopy.generates['./tests/test-files/modules'].presetConfig,\n      requireRootResolvers: true,\n      useGraphQLModules: false,\n    };\n\n    const { result } = await executeCodegen(optionsCopy);\n\n    const usersModuleOutput = result.find(o => o.filename.includes('users'))!;\n\n    expect(usersModuleOutput).toBeDefined();\n\n    // Only Query related properties should be required\n    expect(usersModuleOutput.content).toBeSimilarStringTo(`\n      export type UserResolvers = Pick<Types.UserResolvers, DefinedFields['User']>;\n      export type QueryResolvers = Required<Pick<Types.QueryResolvers, DefinedFields['Query']>>;\n    `);\n    expect(usersModuleOutput.content).toBeSimilarStringTo(`\n      export interface Resolvers {\n        User?: UserResolvers;\n        Query: QueryResolvers;\n      };\n    `);\n  });\n\n  test('import paths for ESM should have correct extension', async () => {\n    const emitLegacyCommonJSImports = {\n      ...options,\n      emitLegacyCommonJSImports: false,\n    };\n    const { result } = await executeCodegen(emitLegacyCommonJSImports);\n    const esmImportStatement = `import * as Types from \"../global-types.js\";`;\n\n    expect(result.length).toBe(5);\n    expect(result[1].content).toMatch(esmImportStatement);\n    expect(result[2].content).toMatch(esmImportStatement);\n    expect(result[3].content).toMatch(esmImportStatement);\n    expect(result[4].content).toMatch(esmImportStatement);\n  });\n\n  test('import paths should use importExtension when set to .mjs', async () => {\n    const withImportExtension = {\n      ...options,\n      importExtension: '.mjs' as const,\n    };\n    const { result } = await executeCodegen(withImportExtension);\n    const importStatement = `import * as Types from \"../global-types.mjs\";`;\n\n    expect(result.length).toBe(5);\n    expect(result[1].content).toMatch(importStatement);\n    expect(result[2].content).toMatch(importStatement);\n    expect(result[3].content).toMatch(importStatement);\n    expect(result[4].content).toMatch(importStatement);\n  });\n\n  test('import paths should use importExtension when set to empty string', async () => {\n    const withImportExtension = {\n      ...options,\n      importExtension: '' as const,\n    };\n    const { result } = await executeCodegen(withImportExtension);\n    const importStatement = `import * as Types from \"../global-types\";`;\n\n    expect(result.length).toBe(5);\n    expect(result[1].content).toMatch(importStatement);\n    expect(result[2].content).toMatch(importStatement);\n    expect(result[3].content).toMatch(importStatement);\n    expect(result[4].content).toMatch(importStatement);\n  });\n\n  test('importExtension should override emitLegacyCommonJSImports', async () => {\n    const withBothOptions = {\n      ...options,\n      importExtension: '.mjs' as const,\n      emitLegacyCommonJSImports: false,\n    };\n    const { result } = await executeCodegen(withBothOptions);\n    const importStatement = `import * as Types from \"../global-types.mjs\";`;\n\n    expect(result.length).toBe(5);\n    // Should use .mjs from importExtension, not .js from emitLegacyCommonJSImports\n    expect(result[1].content).toMatch(importStatement);\n    expect(result[2].content).toMatch(importStatement);\n    expect(result[3].content).toMatch(importStatement);\n    expect(result[4].content).toMatch(importStatement);\n  });\n\n  test('importExtension set to empty string should override emitLegacyCommonJSImports: false', async () => {\n    const withBothOptions = {\n      ...options,\n      importExtension: '' as const,\n      emitLegacyCommonJSImports: false,\n    };\n    const { result } = await executeCodegen(withBothOptions);\n    const importStatement = `import * as Types from \"../global-types\";`;\n\n    expect(result.length).toBe(5);\n    // Should use empty string from importExtension, not .js from emitLegacyCommonJSImports\n    expect(result[1].content).toMatch(importStatement);\n    expect(result[2].content).toMatch(importStatement);\n    expect(result[3].content).toMatch(importStatement);\n    expect(result[4].content).toMatch(importStatement);\n  });\n});\n"
  },
  {
    "path": "packages/presets/graphql-modules/tests/test-files/modules/blog/types/blog.graphql",
    "content": "type Article {\n  id: ID!\n  title: String!\n  text: String!\n  author: User!\n}\n\nextend type Query {\n  articles: [Article!]\n  articleById(id: ID!): Article\n  articlesByUser(userId: ID!): [Article!]\n}\n"
  },
  {
    "path": "packages/presets/graphql-modules/tests/test-files/modules/common/types/common.graphql",
    "content": "type Query {\n  ping: Int\n}\n\ntype Mutation {\n  pong: Int\n}\n"
  },
  {
    "path": "packages/presets/graphql-modules/tests/test-files/modules/dotanions/types/donations.graphql",
    "content": "type Paypal {\n  id: ID!\n  url: String!\n}\n\ntype CreditCard {\n  id: ID!\n  cardNumber: Int!\n  cardOwner: String!\n}\n\nunion PaymentOption = Paypal | CreditCard\n\nextend type User {\n  paymentOptions: [PaymentOption!]\n}\n\ntype Donation {\n  id: ID!\n  sender: User!\n  recipient: User!\n  amount: Float!\n}\n\ninput DonationInput {\n  user: ID!\n  amount: Float!\n  paymentOption: ID!\n}\n\nextend type Mutation {\n  donate(donation: DonationInput): Donation\n}\n"
  },
  {
    "path": "packages/presets/graphql-modules/tests/test-files/modules/users/types/ext_user.graphql",
    "content": "extend type User {\n  age: Int\n}\n"
  },
  {
    "path": "packages/presets/graphql-modules/tests/test-files/modules/users/types/users.graphql",
    "content": "type User {\n  id: ID!\n  firstName: String!\n  lastName: String!\n}\n\nextend type Query {\n  users: [User!]\n  userById(id: ID!): User\n}\n"
  },
  {
    "path": "packages/presets/graphql-modules/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'graphql-modules-preset',\n      setupFiles: './vitest.setup.ts',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/presets/graphql-modules/vitest.setup.ts",
    "content": "import { vi } from 'vitest';\n\nvi.spyOn(process, 'cwd').mockImplementation(() => __dirname);\n"
  },
  {
    "path": "packages/presets/swc-plugin/.gitignore",
    "content": "/target\n^target/\ntarget\nswc_plugin.wasm\n*.wasm\n"
  },
  {
    "path": "packages/presets/swc-plugin/Cargo.toml",
    "content": "[package]\nname = \"swc-plugin\"\nversion = \"0.2.0\"\nedition = \"2021\"\ndescription = \"SWC plugin for https://the-guild.dev/graphql/codegen/plugins/presets/preset-client\"\nlicense = \"MIT\"\npublish = false\n\n\n[lib]\ncrate-type = [\"cdylib\"]\n\n[profile.release]\n# This removes more dead code\ncodegen-units = 1\nlto = true\n# Optimize for size\nopt-level = \"s\"\n# Optimize for performance, this is default so you don't need to specify it\n# opt-level = \"z\"\n\n# Strip debug symbols\nstrip = \"symbols\"\n\n[dependencies]\ngraphql-parser = \"0.4.0\"\npathdiff = \"0.2.1\"\nserde = \"1\"\nserde_json = \"1.0.105\"\nswc_core = { version = \"0.109.*\", features = [\"ecma_plugin_transform\", \"ecma_visit\", \"ecma_utils\", \"ecma_parser\", \"common\", \"testing\" ] }\n\n# .cargo/config defines few alias to build plugin.\n# cargo build-wasi generates wasm-wasi32 binary\n# cargo build-wasm32 generates wasm32-unknown-unknown binary.\n"
  },
  {
    "path": "packages/presets/swc-plugin/README.md",
    "content": "# `@graphql-codegen/client-preset-swc-plugin`\n\nWhen using the [`@graphql-codegen/client-preset`](https://the-guild.dev/graphql/codegen/plugins/presets/preset-client) on large scale projects might want to enable code splitting or tree shaking on the `client-preset` generated files. This is because instead of using the map which contains all GraphQL operations in the project, we can use the specific generated document types.\n\nThis plugin works for [SWC](https://swc.rs) only.\n\n### Installation\n\n```bash\nyarn add -D @graphql-codegen/client-preset-swc-plugin\n```\n\n### Usage\n\nYou will need to provide the `artifactDirectory` path that should be the same as the one configured in your `codegen.ts`\n\n#### Vite\n\n```ts\nimport { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react-swc'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [\n    react({\n      plugins: [\n        ['@graphql-codegen/client-preset-swc-plugin', { artifactDirectory: './src/gql', gqlTagName: 'graphql' }]\n      ]\n    })\n  ]\n})\n```\n\n#### Next.js\n\n```ts\nconst nextConfig = {\n  // ...\n  experimental: {\n    swcPlugins: [\n      ['@graphql-codegen/client-preset-swc-plugin', { artifactDirectory: './src/gql', gqlTagName: 'graphql' }]\n    ]\n  }\n}\n```\n\n#### `.swcrc`\n\n```json5\n{\n  // ...\n  jsc: {\n    // ...\n    experimental: {\n      plugins: [\n        ['@graphql-codegen/client-preset-swc-plugin', { artifactDirectory: './src/gql', gqlTagName: 'graphql' }]\n      ]\n    }\n  }\n}\n```\n\n### Release\n\nTo publish a new version ensure you have done the following:\n\n- Update the version in `package.json`\n- Update the `CHANGELOG.md` with the new version and changes\n- Commit the changes\n- From GitHub Actions, run the `Rust plugin` workflow\n"
  },
  {
    "path": "packages/presets/swc-plugin/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/client-preset-swc-plugin\",\n  \"version\": \"0.2.0\",\n  \"description\": \"A SWC plugin for https://the-guild.dev/graphql/codegen/plugins/presets/preset-client\",\n  \"license\": \"MIT\",\n  \"bob\": false,\n  \"keywords\": [\n    \"swc-plugin\",\n    \"graphql-codegen\",\n    \"preset-client\"\n  ],\n  \"main\": \"swc_plugin.wasm\",\n  \"scripts\": {\n    \"build-wasm\": \"cargo build --target wasm32-wasi --release && cp target/wasm32-wasi/release/swc_plugin.wasm ./\",\n    \"debug\": \"cargo build --target wasm32-wasi && cp target/wasm32-wasi/debug/swc_plugin.wasm ./\"\n  },\n  \"homepage\": \"https://the-guild.dev/graphql/codegen/plugins/presets/preset-client\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/presets/client/swc-plugin\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator/issues\"\n  },\n  \"files\": [\n    \"swc_plugin.wasm\"\n  ],\n  \"type\": \"module\",\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/presets/swc-plugin/src/lib.rs",
    "content": "use graphql_parser::query::parse_query;\nuse pathdiff::diff_paths;\nuse serde::Deserialize;\nuse std::path::{Path, PathBuf};\nuse swc_core::{\n    common::Span,\n    ecma::{\n        ast::*,\n        utils::quote_ident,\n        visit::{as_folder, FoldWith, VisitMut, VisitMutWith},\n    },\n    plugin::{\n        errors::HANDLER, metadata::TransformPluginMetadataContextKind, plugin_transform,\n        proxies::TransformPluginProgramMetadata,\n    },\n};\n\nfn capetalize(s: &str) -> String {\n    format!(\"{}{}\", (&s[..1].to_string()).to_uppercase(), &s[1..])\n}\n\n#[cfg(test)]\nmod tests;\n\npub struct GraphQLCodegenOptions {\n    pub filename: String,\n    pub cwd: String,\n    pub artifact_directory: String,\n    pub gql_tag_name: String,\n}\n\npub struct GraphQLVisitor {\n    options: GraphQLCodegenOptions,\n    graphql_operations_or_fragments_to_import: Vec<String>,\n}\n\nimpl GraphQLVisitor {\n    pub fn new(options: GraphQLCodegenOptions) -> Self {\n        GraphQLVisitor {\n            options,\n            graphql_operations_or_fragments_to_import: Vec::new(),\n        }\n    }\n\n    fn handle_error(&self, details: &str, span: Span) {\n        let message = format!(\n            \"@graphql-codegen/client-preset-swc-plugin details: {}\",\n            details\n        );\n        HANDLER.with(|handler| handler.struct_span_err(span, &message).emit());\n    }\n\n    fn get_relative_import_path(&self, path_end: &str) -> String {\n        // using PathBuf to add the relative path to the artifact directory\n        let mut file_full_path = PathBuf::from(&self.options.cwd);\n        file_full_path.push(&self.options.filename);\n        let file_s_dirname = file_full_path.parent().unwrap();\n\n        // The resolved artifact directory as seen from the current running SWC plugin working directory\n        let resolved_artifact_directory =\n            if Path::new(&self.options.artifact_directory).is_relative() {\n                let mut cwd = PathBuf::from(&self.options.cwd);\n                cwd.push(&self.options.artifact_directory);\n                cwd.to_string_lossy().to_string()\n            } else {\n                self.options.artifact_directory.to_string()\n            };\n\n        let mut relative = diff_paths(resolved_artifact_directory, file_s_dirname).unwrap();\n\n        let start_of_path = \"./\";\n\n        // e.g. add 'graphql' to relative path\n        relative.push(path_end);\n\n        let platform_specific_path = start_of_path.to_string() + relative.to_str().unwrap();\n        platform_specific_path.replace('\\\\', \"/\")\n    }\n}\n\npub fn create_graphql_codegen_visitor(options: GraphQLCodegenOptions) -> impl VisitMut {\n    GraphQLVisitor::new(options)\n}\n\nimpl VisitMut for GraphQLVisitor {\n    fn visit_mut_var_decl(&mut self, e: &mut VarDecl) {\n        e.visit_mut_children_with(self);\n\n        for decl in e.decls.iter_mut() {\n            if let Some(init) = &mut decl.init {\n                if let Expr::Call(CallExpr { callee, args, .. }) = &mut **init {\n                    if args.is_empty() {\n                        return;\n                    }\n\n                    match callee.as_expr() {\n                        Some(expr_box) => match &**expr_box {\n                            Expr::Ident(ident) => {\n                                if &ident.sym != self.options.gql_tag_name.as_str() {\n                                    return;\n                                }\n                            }\n                            _ => return,\n                        },\n                        _ => return,\n                    }\n\n                    let quasis = match &*args[0].expr {\n                        Expr::Tpl(tpl) => &tpl.quasis,\n                        _ => return,\n                    };\n\n                    let raw = match &quasis[0].cooked {\n                        Some(cooked) => cooked,\n                        None => return,\n                    };\n\n                    let graphql_ast = match parse_query::<&str>(raw) {\n                        Ok(ast) => ast,\n                        Err(e) => {\n                            // Currently the parser outputs a string like: \"query parse error\", so we add \"GraphQL\" to the beginning\n                            let error = format!(\"GraphQL {}\", e);\n                            self.handle_error(error.as_str(), quasis[0].span);\n                            return;\n                        }\n                    };\n\n                    let first_definition = match graphql_ast.definitions.get(0) {\n                        Some(definition) => definition,\n                        None => return,\n                    };\n\n                    let operation_name = match first_definition {\n                        graphql_parser::query::Definition::Fragment(fragment) => {\n                            fragment.name.to_string() + \"FragmentDoc\"\n                        }\n                        graphql_parser::query::Definition::Operation(op) => match op {\n                            graphql_parser::query::OperationDefinition::Query(query) => {\n                                match query.name {\n                                    Some(name) => name.to_string() + \"Document\",\n                                    None => return,\n                                }\n                            }\n                            graphql_parser::query::OperationDefinition::Mutation(mutation) => {\n                                match mutation.name {\n                                    Some(name) => name.to_string() + \"Document\",\n                                    None => return,\n                                }\n                            }\n                            graphql_parser::query::OperationDefinition::Subscription(\n                                subscription,\n                            ) => match subscription.name {\n                                Some(name) => name.to_string() + \"Document\",\n                                None => return,\n                            },\n                            _ => return,\n                        },\n                    };\n\n                    self.graphql_operations_or_fragments_to_import\n                        .push(capetalize(&operation_name));\n\n                    // now change the call expression to a Identifier\n                    let new_expr = Expr::Ident(quote_ident!(capetalize(&operation_name)));\n\n                    *init = Box::new(new_expr);\n                }\n            }\n        }\n    }\n\n    fn visit_mut_module(&mut self, module: &mut Module) {\n        // First visit all its children, collect the GraphQL document names, and then add the necessary imports\n        module.visit_mut_children_with(self);\n\n        if self.graphql_operations_or_fragments_to_import.is_empty() {\n            return;\n        }\n\n        let platform_specific_path = self.get_relative_import_path(\"graphql\");\n\n        for operation_or_fragment_name in &self.graphql_operations_or_fragments_to_import {\n            module.body.insert(\n                0,\n                ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl {\n                    span: Default::default(),\n                    specifiers: vec![ImportSpecifier::Named(ImportNamedSpecifier {\n                        span: Default::default(),\n                        local: quote_ident!(operation_or_fragment_name.to_string()),\n                        imported: None,\n                        is_type_only: false,\n                    })],\n                    src: Box::new(Str::from(platform_specific_path.to_string())),\n                    type_only: false,\n                    asserts: None,\n                })),\n            )\n        }\n    }\n}\n\nfn gql_default() -> String {\n    \"gql\".to_string()\n}\n#[allow(non_snake_case)]\n#[derive(Deserialize)]\nstruct PluginOptions {\n    artifactDirectory: String,\n\n    #[serde(default = \"gql_default\")]\n    gqlTagName: String,\n}\n\n#[plugin_transform]\npub fn process_transform(program: Program, metadata: TransformPluginProgramMetadata) -> Program {\n    let filename = metadata\n        .get_context(&TransformPluginMetadataContextKind::Filename)\n        .unwrap_or_default();\n    let cwd = metadata\n        .get_context(&TransformPluginMetadataContextKind::Cwd)\n        .unwrap_or_default();\n\n    let plugin_config: PluginOptions = serde_json::from_str(\n        &metadata\n            .get_transform_plugin_config()\n            .expect(\"Failed to get plugin config for @graphql-codegen/client-preset-swc-plugin\"),\n    )\n    .expect(\"Invalid configuration for @graphql-codegen/client-preset-swc-plugin\");\n\n    let artifact_directory = plugin_config.artifactDirectory;\n    if artifact_directory.is_empty() {\n        panic!(\"artifactDirectory is not present in the config for @graphql-codegen/client-preset-swc-plugin\");\n    }\n\n    let visitor = create_graphql_codegen_visitor(GraphQLCodegenOptions {\n        filename,\n        cwd,\n        artifact_directory,\n        gql_tag_name: plugin_config.gqlTagName,\n    });\n\n    program.fold_with(&mut as_folder(visitor))\n}\n"
  },
  {
    "path": "packages/presets/swc-plugin/src/tests.rs",
    "content": "use std::path::PathBuf;\nuse swc_core::{\n    ecma::{\n        parser::{Syntax, TsConfig},\n        transforms::testing::{test, test_fixture},\n        visit::as_folder,\n    },\n    testing,\n};\n\nuse super::*;\n\nfn get_test_code_visitor() -> GraphQLVisitor {\n    GraphQLVisitor::new(GraphQLCodegenOptions {\n        filename: \"test.ts\".to_string(),\n        cwd: \"/home/faketestproject\".to_string(),\n        artifact_directory: \"./src/gql\".to_string(),\n        gql_tag_name: \"gql\".to_string(),\n    })\n}\n\n#[testing::fixture(\"tests/fixtures/simple-uppercase-operation-name.ts\")]\nfn import_files_from_same_directory(input_path: PathBuf) {\n    let cwd = std::env::current_dir().unwrap();\n\n    let relative_file_path = diff_paths(&input_path, &cwd).unwrap();\n\n    let output_path = input_path.with_extension(\"js\");\n\n    test_fixture(\n        Syntax::Typescript(TsConfig {\n            tsx: input_path.to_string_lossy().ends_with(\".tsx\"),\n            ..Default::default()\n        }),\n        &|_metadata| {\n            as_folder(GraphQLVisitor::new(GraphQLCodegenOptions {\n                filename: relative_file_path.to_string_lossy().to_string(),\n                cwd: cwd.to_string_lossy().to_string(),\n                artifact_directory: \"./tests/fixtures\".to_string(),\n                gql_tag_name: \"gql\".to_string(),\n            }))\n        },\n        &input_path,\n        &output_path,\n        Default::default(),\n    );\n}\n\n#[testing::fixture(\"tests/fixtures/simple-uppercase-operation-name.ts\")]\nfn import_files_from_other_directory(input_path: PathBuf) {\n    // Let's do the same test as for the babel plugin, assume we are in the tests folder\n    let mut cwd = std::env::current_dir().unwrap();\n    cwd.push(\"tests\");\n\n    let relative_file_path = diff_paths(&input_path, &cwd).unwrap();\n\n    let output_path = input_path.with_extension(\"other-dir.js\");\n\n    test_fixture(\n        Syntax::Typescript(TsConfig {\n            tsx: input_path.to_string_lossy().ends_with(\".tsx\"),\n            ..Default::default()\n        }),\n        &|_metadata| {\n            as_folder(GraphQLVisitor::new(GraphQLCodegenOptions {\n                filename: relative_file_path.to_string_lossy().to_string(),\n                cwd: cwd.to_string_lossy().to_string(),\n                artifact_directory: cwd.to_string_lossy().to_string(),\n                gql_tag_name: \"gql\".to_string(),\n            }))\n        },\n        &input_path,\n        &output_path,\n        Default::default(),\n    );\n}\n\ntest!(\n    Default::default(),\n    |_| as_folder(get_test_code_visitor()),\n    expect_normal_declarations_to_not_panic_and_to_be_ignored,\n    // Example from Next.js' server.js\n    r#\"const emitter = (0, _mitt).default();\n    const looseToArray = (input)=>[].slice.call(input);\n    const targetTag = document.querySelector(`style[data-n-href=\"${href}\"]`);\"#,\n    r#\"const emitter = (0, _mitt).default();\n    const looseToArray = (input)=>[].slice.call(input);\n    const targetTag = document.querySelector(`style[data-n-href=\"${href}\"]`);\"#\n);\n"
  },
  {
    "path": "packages/presets/swc-plugin/tests/fixtures/simple-uppercase-operation-name.js",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */ //@ts-ignore\nimport { CFragmentDoc } from \"./graphql\";\nimport { BDocument } from \"./graphql\";\nimport { ADocument } from \"./graphql\";\nimport gql from \"gql-tag\";\n//@ts-ignore\nconst A = ADocument;\n//@ts-ignore\nconst B = BDocument;\n//@ts-ignore\nconst C = CFragmentDoc;\n"
  },
  {
    "path": "packages/presets/swc-plugin/tests/fixtures/simple-uppercase-operation-name.other-dir.js",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */ //@ts-ignore\nimport { CFragmentDoc } from \"./../graphql\";\nimport { BDocument } from \"./../graphql\";\nimport { ADocument } from \"./../graphql\";\nimport gql from \"gql-tag\";\n//@ts-ignore\nconst A = ADocument;\n//@ts-ignore\nconst B = BDocument;\n//@ts-ignore\nconst C = CFragmentDoc;\n"
  },
  {
    "path": "packages/presets/swc-plugin/tests/fixtures/simple-uppercase-operation-name.ts",
    "content": "/* eslint-disable @typescript-eslint/ban-ts-comment */\n//@ts-ignore\nimport gql from \"gql-tag\";\n\n//@ts-ignore\nconst A = gql(/* GraphQL */ `\n  query A {\n    a\n  }\n`);\n\n//@ts-ignore\nconst B = gql(/* GraphQL */ `\n  query B {\n    b\n  }\n`);\n\n//@ts-ignore\nconst C = gql(/* GraphQL */ `\n  fragment C on Query {\n    c\n  }\n`);\n"
  },
  {
    "path": "packages/utils/graphql-codegen-testing/CHANGELOG.md",
    "content": "# @graphql-codegen/testing\n\n## 4.0.4\n\n### Patch Changes\n\n- [#10622](https://github.com/dotansimha/graphql-code-generator/pull/10622) [`369b2c1`](https://github.com/dotansimha/graphql-code-generator/commit/369b2c1934a74a3ca7f49d8972608f5ec341d17b) Thanks [@eddeee888](https://github.com/eddeee888)! - Force publish to fix failed publish 4.0.2\n\n## 4.0.2\n\n### Patch Changes\n\n- [#10614](https://github.com/dotansimha/graphql-code-generator/pull/10614) [`4780d57`](https://github.com/dotansimha/graphql-code-generator/commit/4780d57377392da71e3665f7b8cffe7cbcb98309) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix usage issue due to ESM/CJS incompatibility\n\n## 4.0.1\n\n### Patch Changes\n\n- [#10313](https://github.com/dotansimha/graphql-code-generator/pull/10313) [`ace5c41`](https://github.com/dotansimha/graphql-code-generator/commit/ace5c4176ce4bc8328d3066a8111ca8ce3a34ca6) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`jest-diff@^23.0.0 || ^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0 || ^30.0.0` ↗︎](https://www.npmjs.com/package/jest-diff/v/23.0.0) (from `^23.0.0 || ^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0`, in `peerDependencies`)\n\n## 4.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Bump depdendencies major versions:\n\n  - nock v14\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Patch Changes\n\n- Updated dependencies [[`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2), [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2)]:\n  - @graphql-codegen/plugin-helpers@6.0.0\n\n## 3.0.4\n\n### Patch Changes\n\n- [#10070](https://github.com/dotansimha/graphql-code-generator/pull/10070) [`5fb302c`](https://github.com/dotansimha/graphql-code-generator/commit/5fb302c9ee8fc7af01c03e63a1c33ea1997fca16) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`nock@13.5.4` ↗︎](https://www.npmjs.com/package/nock/v/13.5.4) (from `13.5.3`, in `dependencies`)\n\n## 3.0.3\n\n### Patch Changes\n\n- [#9627](https://github.com/dotansimha/graphql-code-generator/pull/9627) [`422e2a7`](https://github.com/dotansimha/graphql-code-generator/commit/422e2a78f4ebe158e5e4a5f3248e0d03e88b69d6) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`nock@13.3.6` ↗︎](https://www.npmjs.com/package/nock/v/13.3.6) (from `13.3.1`, in `dependencies`)\n\n- [#9851](https://github.com/dotansimha/graphql-code-generator/pull/9851) [`217ed56`](https://github.com/dotansimha/graphql-code-generator/commit/217ed565a2f722f76ce90a3ce5d14117d3e9993f) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`nock@13.5.3` ↗︎](https://www.npmjs.com/package/nock/v/13.5.3) (from `13.3.6`, in `dependencies`)\n\n## 3.0.2\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n- Updated dependencies [[`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653)]:\n  - @graphql-codegen/plugin-helpers@5.0.3\n\n## 3.0.1\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`jest-diff@^23.0.0 || ^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0` ↗︎](https://www.npmjs.com/package/jest-diff/v/23.0.0) (from `^23.0.0 || ^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0`, in `peerDependencies`)\n- Updated dependencies [[`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975)]:\n  - @graphql-codegen/plugin-helpers@5.0.2\n\n## 3.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Patch Changes\n\n- [#9407](https://github.com/dotansimha/graphql-code-generator/pull/9407) [`bec804225`](https://github.com/dotansimha/graphql-code-generator/commit/bec8042256e1718e7867b9d5c038eb7d22e72774) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`nock@13.3.1` ↗︎](https://www.npmjs.com/package/nock/v/13.3.1) (from `13.3.0`, in `dependencies`)\n- Updated dependencies [[`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2), [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2), [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4), [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0)]:\n  - @graphql-codegen/plugin-helpers@5.0.0\n\n## 2.0.2\n\n### Patch Changes\n\n- [#9228](https://github.com/dotansimha/graphql-code-generator/pull/9228) [`a5ec5af36`](https://github.com/dotansimha/graphql-code-generator/commit/a5ec5af36cd77f4ec86773a899aa5ebd16d4ff9f) Thanks [@eddeee888](https://github.com/eddeee888)! - Add complex test cases for resolvers tests\n\n- Updated dependencies [[`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29), [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087)]:\n  - @graphql-codegen/plugin-helpers@4.2.0\n\n## 2.0.1\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n- Updated dependencies [[`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491), [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c), [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15)]:\n  - @graphql-codegen/plugin-helpers@4.1.0\n\n## 2.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- Updated dependencies [[`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5), [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d)]:\n  - @graphql-codegen/plugin-helpers@4.0.0\n\n## 1.18.3\n\n### Patch Changes\n\n- [#8836](https://github.com/dotansimha/graphql-code-generator/pull/8836) [`4fa0a566e`](https://github.com/dotansimha/graphql-code-generator/commit/4fa0a566e1b5253c303ea2a4b5cbbf7c12ca3677) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`nock@13.3.0` ↗︎](https://www.npmjs.com/package/nock/v/13.3.0) (from `13.2.9`, in `dependencies`)\n\n## 1.18.2\n\n### Patch Changes\n\n- [`46f75304a`](https://github.com/dotansimha/graphql-code-generator/commit/46f75304a69a13e8b5f58303f65c81b30a2ad96a) Thanks [@saihaj](https://github.com/saihaj)! - fix the version of `@graphql-codegen/plugin-helpers@3.1.1`\n\n- Updated dependencies [[`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81)]:\n  - @graphql-codegen/plugin-helpers@3.1.1\n\n## 1.18.1\n\n### Patch Changes\n\n- Updated dependencies [[`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22), [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482), [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84)]:\n  - @graphql-codegen/plugin-helpers@3.0.0\n\n## 1.18.0\n\n### Minor Changes\n\n- [#8556](https://github.com/dotansimha/graphql-code-generator/pull/8556) [`64e553c3f`](https://github.com/dotansimha/graphql-code-generator/commit/64e553c3f62618a2aedf122d292e2700fd93d6e1) Thanks [@charlypoly](https://github.com/charlypoly)! - `mockGraphQLServer`, resolvers common testing helpers and fixtures, typing updates\n"
  },
  {
    "path": "packages/utils/graphql-codegen-testing/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/testing\",\n  \"version\": \"4.0.4\",\n  \"description\": \"GraphQL Codegen Testing Utils\",\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\"\n  },\n  \"repository\": \"git@github.com:dotansimha/graphql-code-generator.git\",\n  \"author\": \"Dotan Simha <dotansimha@gmail.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator/issues\"\n  },\n  \"homepage\": \"https://github.com/dotansimha/graphql-code-generator#readme\",\n  \"peerDependencies\": {\n    \"jest-diff\": \"^23.0.0 || ^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0 || ^30.0.0\",\n    \"typescript\": \">=3.0.0\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"^6.0.0\",\n    \"common-tags\": \"^1.8.0\",\n    \"lz-string\": \"^1.4.4\",\n    \"graphql-helix\": \"1.13.0\",\n    \"nock\": \"^14.0.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"devDependencies\": {\n    \"@types/lz-string\": \"1.3.34\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"bob\": {\n    \"check\": false\n  },\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/utils/graphql-codegen-testing/src/index.ts",
    "content": "import { expect } from 'vitest';\nimport { oneLine, stripIndent } from 'common-tags';\nimport { diff } from 'jest-diff';\n\ninterface CustomMatchers<R = unknown> {\n  /**\n   * Normalizes whitespace and performs string comparisons\n   */\n  toBeSimilarStringTo(expected: string): R;\n}\ndeclare module 'vitest' {\n  // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n  interface Matchers<T = any> extends CustomMatchers<T> {}\n}\n\nfunction compareStrings(a: string, b: string): boolean {\n  return a.includes(b);\n}\n\n/** Ignore whitespace, trailing commas, and leading pipes */\nfunction similarize(str: string): string {\n  return (\n    oneLine`${str}`\n      // Trim trailing commas\n      .replace(/\\s*,(\\s*[)}])/g, '$1')\n      // Remove leading pipes\n      .replace(/([<:,=(])\\s*(?:\\|\\s*)?/g, '$1')\n      // Remove spaces around brackets and semicolons\n      .replace(/\\s*([[\\](){}<>;])\\s*/g, '$1')\n      // Replace multiple spaces with a single space\n      .replace(/\\s\\s+/g, ' ')\n  );\n}\n\nexpect.extend({\n  toBeSimilarStringTo(received: string, expected: string) {\n    const strippedReceived = similarize(received);\n    const strippedExpected = similarize(expected);\n\n    if (compareStrings(strippedReceived, strippedExpected)) {\n      return {\n        message: () =>\n          `expected\n   ${received}\n   not to be a string containing (ignoring indents)\n   ${expected}`,\n        pass: true,\n      };\n    }\n    const diffString = diff(stripIndent`${expected}`, stripIndent`${received}`, {\n      expand: this.expand,\n    });\n    const hasExpect = diffString?.includes('- Expect');\n\n    const message = hasExpect\n      ? `Difference:\\n\\n${diffString}`\n      : `expected\n      ${received}\n      to be a string containing (ignoring indents)\n      ${expected}`;\n\n    return {\n      message: () => message,\n      pass: false,\n    };\n  },\n});\n\nexport * from './mock-graphql-server.js';\nexport * from './resolvers-common.js';\nexport * from './typescript.js';\n"
  },
  {
    "path": "packages/utils/graphql-codegen-testing/src/mock-graphql-server.ts",
    "content": "import { GraphQLSchema } from 'graphql';\nimport { getGraphQLParameters, processRequest as processGraphQLHelixRequest } from 'graphql-helix';\nimport nock from 'nock';\n\nexport function mockGraphQLServer({\n  schema,\n  host,\n  path,\n  intercept,\n  method = 'POST',\n}: {\n  schema: GraphQLSchema;\n  host: string;\n  path: string | RegExp | ((path: string) => boolean);\n  intercept?: (obj: nock.ReplyFnContext) => void;\n  method?: string;\n}) {\n  const handler = async function (this: nock.ReplyFnContext, uri: string, body: any) {\n    if (intercept) {\n      intercept(this);\n    }\n    const uriObj = new URL(host + uri);\n    const queryObj: any = {};\n    for (const [key, val] of uriObj.searchParams.entries()) {\n      queryObj[key] = val;\n    }\n    // Create a generic Request object that can be consumed by Graphql Helix's API\n    const request = {\n      body,\n      headers: this.req.headers,\n      method,\n      query: queryObj,\n    };\n    // Extract the GraphQL parameters from the request\n    const { operationName, query, variables } = getGraphQLParameters(request);\n\n    // Validate and execute the query\n    const result = await processGraphQLHelixRequest({\n      operationName,\n      query,\n      variables,\n      request,\n      schema,\n    });\n    // processRequest returns one of three types of results depending on how the server should respond\n    // 1) RESPONSE: a regular JSON payload\n    // 2) MULTIPART RESPONSE: a multipart response (when @stream or @defer directives are used)\n    // 3) PUSH: a stream of events to push back down the client for a subscription\n    if (result.type === 'RESPONSE') {\n      const headers = {};\n      // We set the provided status and headers and just the send the payload back to the client\n      for (const { name, value } of result.headers) {\n        headers[name] = value;\n      }\n      return [result.status, result.payload, headers];\n    }\n    return [500, 'Not implemented'];\n  };\n  switch (method) {\n    case 'GET':\n      return nock(host).get(path).reply(handler);\n    case 'POST':\n      return nock(host).post(path).reply(handler);\n  }\n  return null;\n}\n"
  },
  {
    "path": "packages/utils/graphql-codegen-testing/src/resolvers-common.ts",
    "content": "import { mergeOutputs, Types } from '@graphql-codegen/plugin-helpers';\nimport { validateTs } from '@graphql-codegen/testing';\nimport { plugin as tsPlugin } from '@graphql-codegen/typescript';\nimport { buildSchema } from 'graphql';\n\nexport const resolversTestingSchema = buildSchema(/* GraphQL */ `\n  type MyType {\n    foo: String! @authenticated\n    otherType: MyOtherType\n    withArgs(arg: String, arg2: String!): String\n    unionChild: ChildUnion\n  }\n\n  type Child {\n    bar: String!\n    parent: MyType\n  }\n\n  type MyOtherType {\n    bar: String!\n  }\n\n  union ChildUnion = Child | MyOtherType\n\n  type Query {\n    something: MyType!\n  }\n\n  type Subscription {\n    somethingChanged: MyOtherType\n  }\n\n  interface Node {\n    id: ID!\n  }\n\n  type SomeNode implements Node {\n    id: ID!\n  }\n\n  interface AnotherNode {\n    id: ID!\n  }\n\n  interface WithChild {\n    unionChild: ChildUnion\n    node: AnotherNode\n  }\n\n  interface WithChildren {\n    unionChildren: [ChildUnion!]!\n    nodes: [AnotherNode!]!\n  }\n\n  type AnotherNodeWithChild implements AnotherNode & WithChild {\n    id: ID!\n    unionChild: ChildUnion\n    interfaceChild: Node\n  }\n\n  type AnotherNodeWithAll implements AnotherNode & WithChild & WithChildren {\n    id: ID!\n    unionChild: ChildUnion\n    unionChildren: [ChildUnion!]!\n    interfaceChild: Node\n    interfaceChildren: [Node!]!\n  }\n\n  union MyUnion = MyType | MyOtherType\n\n  scalar MyScalar\n\n  directive @myDirective(arg: Int!, arg2: String!, arg3: Boolean!) on FIELD\n  directive @authenticated on FIELD_DEFINITION\n`);\n\nexport const resolversTestingValidate = async (\n  content: Types.PluginOutput,\n  config: any = {},\n  pluginSchema = resolversTestingSchema,\n  additionalCode = ''\n) => {\n  const mergedContent = mergeOutputs([\n    await tsPlugin(pluginSchema, [], config, { outputFile: '' }),\n    content,\n    additionalCode,\n  ]);\n\n  validateTs(mergedContent);\n\n  return mergedContent;\n};\n"
  },
  {
    "path": "packages/utils/graphql-codegen-testing/src/typescript.ts",
    "content": "import { dirname, join, resolve } from 'path';\nimport { Types } from '@graphql-codegen/plugin-helpers';\nimport * as LZString from 'lz-string'; // lz-string is a package which has CJS/ESM issues. So, we cannot do `import { something } from 'lz-string'`\nimport {\n  CompilerOptions,\n  createCompilerHost,\n  createProgram,\n  createSourceFile,\n  Diagnostic,\n  flattenDiagnosticMessageText,\n  JsxEmit,\n  ModuleKind,\n  ModuleResolutionKind,\n  ScriptKind,\n  ScriptTarget,\n  ScriptTarget as ScriptTargetType,\n} from 'typescript';\n\nexport function validateTs(\n  pluginOutput: Types.PluginOutput,\n  options: CompilerOptions = {\n    noEmitOnError: true,\n    noImplicitAny: true,\n    moduleResolution: ModuleResolutionKind.NodeJs,\n    experimentalDecorators: true,\n    emitDecoratorMetadata: true,\n    target: ScriptTarget.ES5,\n    typeRoots: [resolve(require.resolve('typescript'), '../../../@types/')],\n    jsx: JsxEmit.React,\n    allowJs: true,\n    skipLibCheck: true,\n    lib: [\n      join(dirname(require.resolve('typescript')), 'lib.es5.d.ts'),\n      join(dirname(require.resolve('typescript')), 'lib.es6.d.ts'),\n      join(dirname(require.resolve('typescript')), 'lib.dom.d.ts'),\n      join(dirname(require.resolve('typescript')), 'lib.scripthost.d.ts'),\n      join(dirname(require.resolve('typescript')), 'lib.es2015.d.ts'),\n      join(dirname(require.resolve('typescript')), 'lib.esnext.d.ts'),\n    ],\n    module: ModuleKind.ESNext,\n  },\n  isTsx = false,\n  isStrict = false,\n  suspenseErrors: string[] = [],\n  compileProgram = false\n): void {\n  if (process.env.SKIP_VALIDATION) {\n    return;\n  }\n  if (isStrict) {\n    options.strictNullChecks = true;\n    options.strict = true;\n    options.strictBindCallApply = true;\n    options.strictPropertyInitialization = true;\n    options.alwaysStrict = true;\n    options.strictFunctionTypes = true;\n  }\n\n  const contents: string =\n    typeof pluginOutput === 'string'\n      ? pluginOutput\n      : [...new Set([...(pluginOutput.prepend || []), pluginOutput.content, ...(pluginOutput.append || [])])].join(\n          '\\n'\n        );\n\n  const testFile = `test-file.${isTsx ? 'tsx' : 'ts'}`;\n  const errors: string[] = [];\n\n  if (compileProgram) {\n    const host = createCompilerHost(options);\n    const program = createProgram([testFile], options, {\n      ...host,\n      getSourceFile: (\n        fileName: string,\n        languageVersion: ScriptTargetType,\n        onError?: (message: string) => void,\n        shouldCreateNewSourceFile?: boolean\n      ) => {\n        if (fileName === testFile) {\n          return createSourceFile(fileName, contents, options.target);\n        }\n\n        return host.getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile);\n      },\n      writeFile() {},\n      useCaseSensitiveFileNames() {\n        return false;\n      },\n      getCanonicalFileName(filename) {\n        return filename;\n      },\n      getCurrentDirectory() {\n        return '';\n      },\n      getNewLine() {\n        return '\\n';\n      },\n    });\n    const emitResult = program.emit();\n    const allDiagnostics = emitResult.diagnostics;\n\n    for (const diagnostic of allDiagnostics) {\n      if (diagnostic.file) {\n        const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);\n        const message = flattenDiagnosticMessageText(diagnostic.messageText, '\\n');\n        errors.push(`${line + 1},${character + 1}: ${message} ->\n    ${contents.split('\\n')[line]}`);\n      } else {\n        errors.push(String(flattenDiagnosticMessageText(diagnostic.messageText, '\\n')));\n      }\n    }\n  } else {\n    const result = createSourceFile(\n      testFile,\n      contents,\n      ScriptTarget.ES2016,\n      false,\n      isTsx ? ScriptKind.TSX : undefined\n    ) as { parseDiagnostics?: Diagnostic[] };\n\n    const allDiagnostics = result.parseDiagnostics;\n\n    if (allDiagnostics && allDiagnostics.length > 0) {\n      for (const diagnostic of allDiagnostics) {\n        if (diagnostic.file) {\n          const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start!);\n          const message = flattenDiagnosticMessageText(diagnostic.messageText, '\\n');\n          errors.push(`${line + 1},${character + 1}: ${message} ->\n  ${contents.split('\\n')[line]}`);\n        } else {\n          errors.push(String(flattenDiagnosticMessageText(diagnostic.messageText, '\\n')));\n        }\n      }\n    }\n  }\n\n  const relevantErrors = errors.filter(e => {\n    if (e.includes('Cannot find module')) {\n      return false;\n    }\n\n    for (const suspenseError of suspenseErrors) {\n      if (e.includes(suspenseError)) {\n        return false;\n      }\n    }\n\n    return true;\n  });\n\n  if (relevantErrors && relevantErrors.length > 0) {\n    if (relevantErrors.length === 1) {\n      throw new Error(relevantErrors[0]);\n    }\n    throw new AggregateError(relevantErrors, relevantErrors.join('\\n'));\n  }\n}\n\nexport function compileTs(\n  contents: string,\n  options: CompilerOptions = {\n    noEmitOnError: true,\n    noImplicitAny: true,\n    moduleResolution: ModuleResolutionKind.NodeJs,\n    allowSyntheticDefaultImports: true,\n    experimentalDecorators: true,\n    emitDecoratorMetadata: true,\n    target: ScriptTarget.ES5,\n    typeRoots: [resolve(require.resolve('typescript'), '../../../@types/')],\n    jsx: JsxEmit.Preserve,\n    allowJs: true,\n    lib: [\n      join(dirname(require.resolve('typescript')), 'lib.es5.d.ts'),\n      join(dirname(require.resolve('typescript')), 'lib.es6.d.ts'),\n      join(dirname(require.resolve('typescript')), 'lib.dom.d.ts'),\n      join(dirname(require.resolve('typescript')), 'lib.scripthost.d.ts'),\n      join(dirname(require.resolve('typescript')), 'lib.es2015.d.ts'),\n      join(dirname(require.resolve('typescript')), 'lib.esnext.asynciterable.d.ts'),\n    ],\n    module: ModuleKind.ESNext,\n  },\n  isTsx = false,\n  openPlayground = false\n): void {\n  if (process.env.SKIP_VALIDATION) {\n    return;\n  }\n\n  try {\n    const testFile = `test-file.${isTsx ? 'tsx' : 'ts'}`;\n    const host = createCompilerHost(options);\n    const program = createProgram([testFile], options, {\n      ...host,\n      getSourceFile: (\n        fileName: string,\n        languageVersion: ScriptTargetType,\n        onError?: (message: string) => void,\n        shouldCreateNewSourceFile?: boolean\n      ) => {\n        if (fileName === testFile) {\n          return createSourceFile(fileName, contents, options.target);\n        }\n\n        return host.getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile);\n      },\n      writeFile() {},\n      useCaseSensitiveFileNames() {\n        return false;\n      },\n      getCanonicalFileName(filename) {\n        return filename;\n      },\n      getCurrentDirectory() {\n        return '';\n      },\n      getNewLine() {\n        return '\\n';\n      },\n    });\n    const emitResult = program.emit();\n    const allDiagnostics = emitResult.diagnostics;\n    const errors: string[] = [];\n\n    for (const diagnostic of allDiagnostics) {\n      if (diagnostic.file) {\n        const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);\n        const message = flattenDiagnosticMessageText(diagnostic.messageText, '\\n');\n        errors.push(`${line + 1},${character + 1}: ${message} ->\n  ${contents.split('\\n')[line]}`);\n      } else {\n        errors.push(String(flattenDiagnosticMessageText(diagnostic.messageText, '\\n')));\n      }\n    }\n\n    const relevantErrors = errors.filter(e => !e.includes('Cannot find module'));\n\n    if (relevantErrors && relevantErrors.length > 0) {\n      throw new Error(relevantErrors.join('\\n'));\n    }\n  } catch (e) {\n    if (openPlayground) {\n      const compressedCode = LZString.compressToEncodedURIComponent(contents);\n      open('http://www.typescriptlang.org/play/#code/' + compressedCode);\n    }\n\n    throw e;\n  }\n}\n"
  },
  {
    "path": "packages/utils/graphql-codegen-testing/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'graphql-codegen-testing',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "packages/utils/plugins-helpers/CHANGELOG.md",
    "content": "# @graphql-codegen/plugin-helpers\n\n## 6.2.0\n\n### Minor Changes\n\n- [#10617](https://github.com/dotansimha/graphql-code-generator/pull/10617) [`8c4db2a`](https://github.com/dotansimha/graphql-code-generator/commit/8c4db2abd0578d7b1c9b4197dfa41dae3ef6252b) Thanks [@ikusakov2](https://github.com/ikusakov2)! - Allow GraphQLSchema to be passed directly to generate({schema: ...}) function\n\n## 6.1.1\n\n### Patch Changes\n\n- [#10619](https://github.com/dotansimha/graphql-code-generator/pull/10619) [`cdf5dc5`](https://github.com/dotansimha/graphql-code-generator/commit/cdf5dc56c5591cfe031e02cbc31deff761a40072) Thanks [@ardatan](https://github.com/ardatan)! - dependencies updates:\n  - Updated dependency [`@graphql-tools/utils@^11.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/11.0.0) (from `^10.0.0`, in `dependencies`)\n\n## 6.1.0\n\n### Minor Changes\n\n- [#10510](https://github.com/dotansimha/graphql-code-generator/pull/10510) [`9e70bcb`](https://github.com/dotansimha/graphql-code-generator/commit/9e70bcbf5390e815a6844f1965b04056e5d8e670) Thanks [@nickmessing](https://github.com/nickmessing)! - add importExtension configuration option\n\n## 6.0.0\n\n### Major Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - BREAKING CHANGES: Do not generate \\_\\_isTypeOf for non-implementing types or non-union members\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Remove deprecated option `watchConfig`\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Ensure Federation Interfaces have `__resolveReference` if they are resolvable entities\n\n  BREAKING CHANGES: Deprecate `onlyResolveTypeForInterfaces` because majority of use cases cannot implement resolvers in Interfaces.\n  BREAKING CHANGES: Deprecate `generateInternalResolversIfNeeded.__resolveReference` because types do not have `__resolveReference` if they are not Federation entities or are not resolvable. Users should not have to manually set this option. This option was put in to wait for this major version.\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - BREAKING CHANGE: Improve Federation Entity's resolvers' parent param type: These types were using reference types inline. This makes it hard to handle mappers. The Parent type now all comes from ParentResolverTypes to make handling mappers and parent types simpler.\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix `mappers` usage with Federation\n\n  `mappers` was previously used as `__resolveReference`'s first param (usually called \"reference\"). However, this is incorrect because `reference` interface comes directly from `@key` and `@requires` directives. This patch fixes the issue by creating a new `FederationTypes` type and use it as the base for federation entity types when being used to type entity references.\n\n  BREAKING CHANGES: No longer generate `UnwrappedObject` utility type, as this was used to support the wrong previously generated type.\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Drop Node 18 support\n\n### Minor Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Add `allowPartialOutputs` flag to partially write successful generation to files\n\n### Patch Changes\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Update @requires type\n\n- [#10218](https://github.com/dotansimha/graphql-code-generator/pull/10218) [`140298a`](https://github.com/dotansimha/graphql-code-generator/commit/140298a33b257a0b7958e361971b5bc97bbc01c2) Thanks [@eddeee888](https://github.com/eddeee888)! - Fix fields or object types marked with @external being wrongly generated\n\n## 5.1.1\n\n### Patch Changes\n\n- [#10150](https://github.com/dotansimha/graphql-code-generator/pull/10150) [`e324382`](https://github.com/dotansimha/graphql-code-generator/commit/e3243824cfe0d7ab463cf0d5a6455715510959be) Thanks [@ArminWiebigke](https://github.com/ArminWiebigke)! - Allow functions to be passed as valid values for `UrlSchemaOptions.customFetch`. This was already possible, but the type definitions did not reflect that correctly.\n\n## 5.1.0\n\n### Minor Changes\n\n- [#9989](https://github.com/dotansimha/graphql-code-generator/pull/9989) [`55a1e9e`](https://github.com/dotansimha/graphql-code-generator/commit/55a1e9e63830df17ed40602ea7e322bbf48b17bc) Thanks [@eddeee888](https://github.com/eddeee888)! - Add `generateInternalResolversIfNeeded` option\n\n  This option can be used to generate more correct types for internal resolvers. For example, only generate `__resolveReference` if the federation object has a resolvable `@key`.\n\n  In the future, this option can be extended to support other internal resolvers e.g. `__isTypeOf` is only generated for implementing types and union members.\n\n## 5.0.4\n\n### Patch Changes\n\n- [#9961](https://github.com/dotansimha/graphql-code-generator/pull/9961) [`dfc5310`](https://github.com/dotansimha/graphql-code-generator/commit/dfc5310ab476bed6deaefc608f311ff368722f7e) Thanks [@eddeee888](https://github.com/eddeee888)! - Update plugin output type to allow option `meta` field\n\n## 5.0.3\n\n### Patch Changes\n\n- [#9813](https://github.com/dotansimha/graphql-code-generator/pull/9813) [`4e69568`](https://github.com/dotansimha/graphql-code-generator/commit/4e6956899c96f8954cea8d5bbe32aa35a70cc653) Thanks [@saihaj](https://github.com/saihaj)! - bumping for a release\n\n## 5.0.2\n\n### Patch Changes\n\n- [#9811](https://github.com/dotansimha/graphql-code-generator/pull/9811) [`d8364e045`](https://github.com/dotansimha/graphql-code-generator/commit/d8364e045a46ca6e8173583b5108d161c6832975) Thanks [@saihaj](https://github.com/saihaj)! - dependencies updates:\n  - Updated dependency [`tslib@~2.6.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.6.0) (from `~2.5.0`, in `dependencies`)\n\n## 5.0.1\n\n### Patch Changes\n\n- [#9523](https://github.com/dotansimha/graphql-code-generator/pull/9523) [`bb1e0e96e`](https://github.com/dotansimha/graphql-code-generator/commit/bb1e0e96ed9d519684630cd7ea53869b48b4632e) Thanks [@tnyo43](https://github.com/tnyo43)! - add noSilentErrors option to the config type\n\n## 5.0.0\n\n### Major Changes\n\n- [`bb66c2a31`](https://github.com/dotansimha/graphql-code-generator/commit/bb66c2a31985c1375912ccd6b2b02933f313c9c0) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Require Node.js `>= 16`. Drop support for Node.js 14\n\n### Patch Changes\n\n- [#9449](https://github.com/dotansimha/graphql-code-generator/pull/9449) [`4d9ea1a5a`](https://github.com/dotansimha/graphql-code-generator/commit/4d9ea1a5a94cd3458c1bd868ce1ab1cb806257f2) Thanks [@n1ru4l](https://github.com/n1ru4l)! - dependencies updates:\n\n  - Updated dependency [`@graphql-tools/utils@^10.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/10.0.0) (from `^9.0.0`, in `dependencies`)\n\n- [#9332](https://github.com/dotansimha/graphql-code-generator/pull/9332) [`f46803a8c`](https://github.com/dotansimha/graphql-code-generator/commit/f46803a8c70840280529a52acbb111c865712af2) Thanks [@eddeee888](https://github.com/eddeee888)! - Update GitHub loader TypeScript type and usage docs\n\n- [#9360](https://github.com/dotansimha/graphql-code-generator/pull/9360) [`63827fabe`](https://github.com/dotansimha/graphql-code-generator/commit/63827fabede76b2380d40392aba2a3ccb099f0c4) Thanks [@beerose](https://github.com/beerose)! - Add handleAsSDL property to UrlSchemaOptions type\n\n## 4.2.0\n\n### Minor Changes\n\n- [#9151](https://github.com/dotansimha/graphql-code-generator/pull/9151) [`b7dacb21f`](https://github.com/dotansimha/graphql-code-generator/commit/b7dacb21fb0ed1173d1e45120dc072e29231ed29) Thanks [@'./user/schema.mappers#UserMapper',](https://github.com/'./user/schema.mappers#UserMapper',)! - Add `watchPattern` config option for `generates` sections.\n\n  By default, `watch` mode automatically watches all GraphQL schema and document files. This means when a change is detected, Codegen CLI is run.\n\n  A user may want to run Codegen CLI when non-schema and non-document files are changed. Each `generates` section now has a `watchPattern` option to allow more file patterns to be added to the list of patterns to watch.\n\n  In the example below, mappers are exported from `schema.mappers.ts` files. We want to re-run Codegen if the content of `*.mappers.ts` files change because they change the generated types file. To solve this, we can add mapper file patterns to watch using the glob pattern used for schema and document files.\n\n  ```ts\n  // codegen.ts\n  const config: CodegenConfig = {\n    schema: 'src/schema/**/*.graphql',\n    generates: {\n      'src/schema/types.ts': {\n        plugins: ['typescript', 'typescript-resolvers'],\n        config: {\n          mappers: {\n\n            Book: './book/schema.mappers#BookMapper',\n          },\n        }\n        watchPattern: 'src/schema/**/*.mappers.ts', // Watches mapper files in `watch` mode. Use an array for multiple patterns e.g. `['src/*.pattern1.ts','src/*.pattern2.ts']`\n      },\n    },\n  };\n  ```\n\n  Then, run Codegen CLI in `watch` mode:\n\n  ```shell\n  yarn graphql-codegen --watch\n  ```\n\n  Now, updating `*.mappers.ts` files re-runs Codegen! 🎉\n\n  Note: `watchPattern` is only used in `watch` mode i.e. running CLI with `--watch` flag.\n\n### Patch Changes\n\n- [`f104619ac`](https://github.com/dotansimha/graphql-code-generator/commit/f104619acd27c9d62a06bc577737500880731087) Thanks [@saihaj](https://github.com/saihaj)! - Resolve issue with nesting fields in `@provides` directive being prevented\n\n## 4.1.0\n\n### Minor Changes\n\n- [#8893](https://github.com/dotansimha/graphql-code-generator/pull/8893) [`a118c307a`](https://github.com/dotansimha/graphql-code-generator/commit/a118c307a35bbb97b7cbca0f178a88276032a26c) Thanks [@n1ru4l](https://github.com/n1ru4l)! - mark `plugins` in config optional\n\n- [#8723](https://github.com/dotansimha/graphql-code-generator/pull/8723) [`a3309e63e`](https://github.com/dotansimha/graphql-code-generator/commit/a3309e63efed880e6f74ce6fcbf82dd3d7857a15) Thanks [@kazekyo](https://github.com/kazekyo)! - Introduce a new feature called DocumentTransform.\n\n  DocumentTransform is a functionality that allows you to modify `documents` before they are processed by plugins. You can use functions passed to the `documentTransforms` option to make changes to GraphQL documents.\n\n  To use this feature, you can write `documentTransforms` as follows:\n\n  ```ts\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: [\n          {\n            transform: ({ documents }) => {\n              // Make some changes to the documents\n              return documents\n            }\n          }\n        ]\n      }\n    }\n  }\n  export default config\n  ```\n\n  For instance, to remove a `@localOnlyDirective` directive from `documents`, you can write the following code:\n\n  ```js\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n  import { visit } from 'graphql'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: [\n          {\n            transform: ({ documents }) => {\n              return documents.map(documentFile => {\n                documentFile.document = visit(documentFile.document, {\n                  Directive: {\n                    leave(node) {\n                      if (node.name.value === 'localOnlyDirective') return null\n                    }\n                  }\n                })\n                return documentFile\n              })\n            }\n          }\n        ]\n      }\n    }\n  }\n  export default config\n  ```\n\n  DocumentTransform can also be specified by file name. You can create a custom file for a specific transformation and pass it to `documentTransforms`.\n\n  Let's create the document transform as a file:\n\n  ```js\n  module.exports = {\n    transform: ({ documents }) => {\n      // Make some changes to the documents\n      return documents\n    }\n  }\n  ```\n\n  Then, you can specify the file name as follows:\n\n  ```ts\n  import type { CodegenConfig } from '@graphql-codegen/cli'\n\n  const config: CodegenConfig = {\n    schema: 'https://localhost:4000/graphql',\n    documents: ['src/**/*.tsx'],\n    generates: {\n      './src/gql/': {\n        preset: 'client',\n        documentTransforms: ['./my-document-transform.js']\n      }\n    }\n  }\n  export default config\n  ```\n\n### Patch Changes\n\n- [#8879](https://github.com/dotansimha/graphql-code-generator/pull/8879) [`8206b268d`](https://github.com/dotansimha/graphql-code-generator/commit/8206b268dfb485a748fd7783a163cb0ee9931491) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n  - Updated dependency [`tslib@~2.5.0` ↗︎](https://www.npmjs.com/package/tslib/v/2.5.0) (from `~2.4.0`, in `dependencies`)\n\n## 4.0.0\n\n### Major Changes\n\n- [#8885](https://github.com/dotansimha/graphql-code-generator/pull/8885) [`fd0b0c813`](https://github.com/dotansimha/graphql-code-generator/commit/fd0b0c813015cae4f6f6bda5f4c5515e544eb76d) Thanks [@n1ru4l](https://github.com/n1ru4l)! - drop Node.js 12 support\n\n### Patch Changes\n\n- [#8871](https://github.com/dotansimha/graphql-code-generator/pull/8871) [`fc79b65d4`](https://github.com/dotansimha/graphql-code-generator/commit/fc79b65d4914fd25ae6bd5d58ebc7ded573a08a5) Thanks [@B2o5T](https://github.com/B2o5T)! - eslint fixes\n\n## 3.1.2\n\n### Patch Changes\n\n- [#8771](https://github.com/dotansimha/graphql-code-generator/pull/8771) [`ed87c782b`](https://github.com/dotansimha/graphql-code-generator/commit/ed87c782bf3292bfbee772c6962d6cbc43a9abe7) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`@graphql-tools/utils@^9.0.0` ↗︎](https://www.npmjs.com/package/@graphql-tools/utils/v/9.0.0) (from `^8.8.0`, in `dependencies`)\n\n- [#8718](https://github.com/dotansimha/graphql-code-generator/pull/8718) [`6c6b6f2df`](https://github.com/dotansimha/graphql-code-generator/commit/6c6b6f2df88a3a37b437a25320dab5590f033316) Thanks [@AaronBuxbaum](https://github.com/AaronBuxbaum)! - Add `globalGqlIdentifierName` to the types\n\n## 3.1.1\n\n### Patch Changes\n\n- [`307a5d350`](https://github.com/dotansimha/graphql-code-generator/commit/307a5d350643dd065d228b04ef3b4bd70cac0e81) Thanks [@saihaj](https://github.com/saihaj)! - Something went wrong in old relesae so this will ensure we have a good bump on all packages\n\n## 3.1.0\n\n### Minor Changes\n\n- [#8662](https://github.com/dotansimha/graphql-code-generator/pull/8662) [`c0183810f`](https://github.com/dotansimha/graphql-code-generator/commit/c0183810f0178aec6f49ab8a6f35f7adc4d9f13e) Thanks [@jantimon](https://github.com/jantimon)! - the life cycle hook beforeOneFileWrite is now able to modify the generated content\n\n## 3.0.0\n\n### Major Changes\n\n- [#8652](https://github.com/dotansimha/graphql-code-generator/pull/8652) [`c802a0c0b`](https://github.com/dotansimha/graphql-code-generator/commit/c802a0c0b775cfabc5ace3e7fb6655540c6c4d84) Thanks [@jantimon](https://github.com/jantimon)! - improve typings for life cycle hooks\n\n### Patch Changes\n\n- [#8686](https://github.com/dotansimha/graphql-code-generator/pull/8686) [`a6c2097f4`](https://github.com/dotansimha/graphql-code-generator/commit/a6c2097f4789c0cce4296ce349790ce29943ed22) Thanks [@renovate](https://github.com/apps/renovate)! - dependencies updates:\n\n  - Updated dependency [`change-case-all@1.0.15` ↗︎](https://www.npmjs.com/package/change-case-all/v/1.0.15) (from `1.0.14`, in `dependencies`)\n\n- [#8661](https://github.com/dotansimha/graphql-code-generator/pull/8661) [`f79a00e8a`](https://github.com/dotansimha/graphql-code-generator/commit/f79a00e8ae073eab426ca08795c924e716123482) Thanks [@jantimon](https://github.com/jantimon)! - refactor hook execution\n\n## 2.7.2\n\n### Patch Changes\n\n- [#8525](https://github.com/dotansimha/graphql-code-generator/pull/8525) [`63dc8f205`](https://github.com/dotansimha/graphql-code-generator/commit/63dc8f2054e27b944f7d8dc59db8afa85760a127) Thanks [@charlypoly](https://github.com/charlypoly)! - remove `DetailledError`, not supported by Listr renderer\n\n## 2.7.1\n\n### Patch Changes\n\n- [#8368](https://github.com/dotansimha/graphql-code-generator/pull/8368) [`4113b1bd3`](https://github.com/dotansimha/graphql-code-generator/commit/4113b1bd39f3d32759c68a292e8492a0dd4f7371) Thanks [@charlypoly](https://github.com/charlypoly)! - fix(cli): support ApolloEngine loader in TypeScript config\n\n## 2.7.0\n\n### Minor Changes\n\n- [#8301](https://github.com/dotansimha/graphql-code-generator/pull/8301) [`2ed21a471`](https://github.com/dotansimha/graphql-code-generator/commit/2ed21a471f8de58ecafebf4bf64b3c32cee24d2f) Thanks [@charlypoly](https://github.com/charlypoly)! - Introduces support for TypeScript config file and a new preset lifecycle (required for `client-preset`)\n\n## 2.6.2\n\n### Patch Changes\n\n- [#8189](https://github.com/dotansimha/graphql-code-generator/pull/8189) [`b408f8238`](https://github.com/dotansimha/graphql-code-generator/commit/b408f8238c00bbb4cd448501093856c06cfde50f) Thanks [@n1ru4l](https://github.com/n1ru4l)! - Fix CommonJS TypeScript resolution with `moduleResolution` `node16` or `nodenext`\n\n## 2.6.1\n\n### Patch Changes\n\n- 6a2e328e6: feat(cli): `--verbose` and `--debug` flags\n\n## 2.6.0\n\n### Minor Changes\n\n- 2cbcbb371: Add new flag to emit legacy common js imports. Default it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\n\n  You can use the option in your config:\n\n  ```yaml\n  schema: 'schema.graphql'\n   documents:\n     - 'src/**/*.graphql'\n   emitLegacyCommonJSImports: true\n  ```\n\n  Alternative you can use the CLI to set this option:\n\n  ```bash\n  $ codegen --config-file=config.yml --emit-legacy-common-js-imports\n  ```\n\n## 2.5.0\n\n### Minor Changes\n\n- d84afec09: Support TypeScript ESM modules (`\"module\": \"node16\"` and `\"moduleResolution\": \"node16\"`).\n\n  [More information on the TypeScript Release Notes.](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n\n- 8e44df58b: Add new config option to not exit with non-zero exit code when there are no documents.\n\n  You can use this option in your config:\n\n  ```yaml\n  schema: 'schema.graphql'\n  documents:\n    - 'src/**/*.graphql'\n  ignoreNoDocuments: true\n  ```\n\n  Alternative you can use the CLI to set this option:\n\n  ```bash\n  $ codegen --config-file=config.yml --ignore-no-documents\n  ```\n\n### Patch Changes\n\n- a4fe5006b: Fix TS type error on strictNullChecks: true\n\n  Fix the compiler error:\n\n  ```\n  node_modules/@graphql-codegen/plugin-helpers/oldVisit.d.ts:5:75 - error TS2339: Property 'enter' does not exist on type '{ readonly enter?: ASTVisitFn<NameNode> | undefined; readonly leave: ASTReducerFn<NameNode, unknown>; } | { readonly enter?: ASTVisitFn<DocumentNode> | undefined; readonly leave: ASTReducerFn<...>; } | ... 41 more ... | undefined'.\n\n  5     enter?: Partial<Record<keyof NewVisitor, NewVisitor[keyof NewVisitor]['enter']>>;\n                                                                              ~~~~~~~\n\n  node_modules/@graphql-codegen/plugin-helpers/oldVisit.d.ts:6:75 - error TS2339: Property 'leave' does not exist on type '{ readonly enter?: ASTVisitFn<NameNode> | undefined; readonly leave: ASTReducerFn<NameNode, unknown>; } | { readonly enter?: ASTVisitFn<DocumentNode> | undefined; readonly leave: ASTReducerFn<...>; } | ... 41 more ... | undefined'.\n\n  6     leave?: Partial<Record<keyof NewVisitor, NewVisitor[keyof NewVisitor]['leave']>>;\n                                                                              ~~~~~~~\n\n\n  Found 2 errors in the same file, starting at: node_modules/@graphql-codegen/plugin-helpers/oldVisit.d.ts:5\n  ```\n\n  Only happens when TS compiler options `strictNullChecks: true` and `skipLibCheck: false`.\n\n  `Partial<T>` includes `{}`, therefore `NewVisitor[keyof NewVisitor]` includes `undefined`, and indexing `undefined` is error.\n  Eliminate `undefined` by wrapping it inside `NonNullable<...>`.\n\n  Related #7519\n\n## 2.4.2\n\n### Patch Changes\n\n- a521216d6: broken links within documentation\n\n## 2.4.1\n\n### Patch Changes\n\n- cb9adeb96: Cache validation of documents\n\n## 2.4.0\n\n### Minor Changes\n\n- 754a33715: Performance Profiler --profile\n\n## 2.3.2\n\n### Patch Changes\n\n- 6002feb3d: Fix exports in package.json files for react-native projects\n\n## 2.3.1\n\n### Patch Changes\n\n- bcc5636fc: fix wrong dependency version range\n\n## 2.3.0\n\n### Minor Changes\n\n- 97ddb487a: feat: GraphQL v16 compatibility\n\n## 2.2.0\n\n### Minor Changes\n\n- 7c60e5acc: feat(core): ability to skip some specific validation rules with skipDocumentsValidation option\n\n## 2.1.1\n\n### Patch Changes\n\n- 6470e6cc9: fix(plugin-helpers): remove unnecessary import\n- 35199dedf: Fix module not found bug in resolveExternalModuleAndFn\n\n## 2.1.0\n\n### Minor Changes\n\n- 39773f59b: enhance(plugins): use getDocumentNodeFromSchema and other utilities from @graphql-tools/utils\n- 440172cfe: support ESM\n\n### Patch Changes\n\n- 24185985a: bump graphql-tools package versions\n\n## 2.0.0\n\n### Major Changes\n\n- b0cb13df4: Update to latest `graphql-tools` and `graphql-config` version.\n\n  ‼️ ‼️ ‼️ Please note ‼️ ‼️ ‼️:\n\n  This is a breaking change since Node 10 is no longer supported in `graphql-tools`, and also no longer supported for Codegen packages.\n\n## 1.18.8\n\n### Patch Changes\n\n- 470336a1: don't require plugins for for config if preset provides plugin. Instead the preset should throw if no plugins were provided.\n\n## 1.18.7\n\n### Patch Changes\n\n- dfd25caf: chore(deps): bump graphql-tools versions\n\n## 1.18.6\n\n### Patch Changes\n\n- 637338cb: fix: make lifecycle hooks definition a partial\n\n## 1.18.5\n\n### Patch Changes\n\n- d9212aa0: fix(visitor-plugin-common): guard for a runtime type error\n\n## 1.18.4\n\n### Patch Changes\n\n- 23862e7e: fix(naming-convention): revert and pin change-case-all dependency for workaround #3256\n\n## 1.18.3\n\n### Patch Changes\n\n- 29b75b1e: enhance(namingConvention): use change-case-all instead of individual packages for naming convention\n\n## 1.18.2\n\n### Patch Changes\n\n- 1183d173: Bump all packages to resolve issues with shared dependencies\n\n## 1.18.1\n\n### Patch Changes\n\n- eaf45d1f: fix issue with inline fragment without typeCondition\n\n## 1.18.0\n\n### Minor Changes\n\n- 857c603c: Adds the --errors-only flag to the cli to print errors only.\n\n## 1.17.9\n\n### Patch Changes\n\n- da8bdd17: Allow hooks to be defined as partial object\n\n## 1.17.8\n\n### Patch Changes\n\n- 1d7c6432: Bump all packages to allow \"^\" in deps and fix compatibility issues\n- 1d7c6432: Bump versions of @graphql-tools/ packages to fix issues with loading schemas and SDL comments\n"
  },
  {
    "path": "packages/utils/plugins-helpers/package.json",
    "content": "{\n  \"name\": \"@graphql-codegen/plugin-helpers\",\n  \"version\": \"6.2.0\",\n  \"description\": \"GraphQL Code Generator common utils and types\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/dotansimha/graphql-code-generator.git\",\n    \"directory\": \"packages/utils/plugins-helpers\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0\"\n  },\n  \"dependencies\": {\n    \"@graphql-tools/utils\": \"^11.0.0\",\n    \"change-case-all\": \"1.0.15\",\n    \"common-tags\": \"1.8.2\",\n    \"import-from\": \"4.0.0\",\n    \"lodash\": \"~4.17.0\",\n    \"tslib\": \"~2.6.0\"\n  },\n  \"main\": \"dist/cjs/index.js\",\n  \"module\": \"dist/esm/index.js\",\n  \"exports\": {\n    \".\": {\n      \"require\": {\n        \"types\": \"./dist/typings/index.d.cts\",\n        \"default\": \"./dist/cjs/index.js\"\n      },\n      \"import\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      },\n      \"default\": {\n        \"types\": \"./dist/typings/index.d.ts\",\n        \"default\": \"./dist/esm/index.js\"\n      }\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"typings\": \"dist/typings/index.d.ts\",\n  \"typescript\": {\n    \"definition\": \"dist/typings/index.d.ts\"\n  },\n  \"publishConfig\": {\n    \"directory\": \"dist\",\n    \"access\": \"public\"\n  },\n  \"type\": \"module\",\n  \"devDependencies\": {\n    \"@graphql-tools/apollo-engine-loader\": \"8.0.1\"\n  },\n  \"engines\": {\n    \"node\": \">=16\"\n  }\n}\n"
  },
  {
    "path": "packages/utils/plugins-helpers/src/federation.ts",
    "content": "import { astFromInterfaceType, astFromObjectType, getRootTypeNames, MapperKind, mapSchema } from '@graphql-tools/utils';\nimport type { FieldDefinitionResult } from '@graphql-codegen/visitor-plugin-common';\nimport {\n  DefinitionNode,\n  DirectiveNode,\n  FieldDefinitionNode,\n  GraphQLFieldConfigMap,\n  GraphQLInterfaceType,\n  GraphQLObjectType,\n  GraphQLSchema,\n  InterfaceTypeDefinitionNode,\n  isObjectType,\n  ObjectTypeDefinitionNode,\n  OperationDefinitionNode,\n  parse,\n  StringValueNode,\n} from 'graphql';\nimport { oldVisit } from './index.js';\nimport { getBaseType } from './utils.js';\n\n/**\n * Federation Spec\n */\nexport const federationSpec = parse(/* GraphQL */ `\n  scalar _FieldSet\n\n  directive @external on FIELD_DEFINITION\n  directive @requires(fields: _FieldSet!) on FIELD_DEFINITION\n  directive @provides(fields: _FieldSet!) on FIELD_DEFINITION\n  directive @key(fields: _FieldSet!) on OBJECT | INTERFACE\n`);\n\n/**\n * ReferenceSelectionSet\n * @description Each is a collection of fields that are available in a reference payload (originated from the Router)\n * @example\n * - resolvable fields marked with `@key`\n * - fields declared in `@provides`\n * - fields declared in `@requires`\n */\ninterface DirectiveSelectionSet {\n  name: string;\n  selection: boolean | DirectiveSelectionSet[];\n}\n\ntype ReferenceSelectionSet = Record<string, boolean>; // TODO: handle nested\n\ninterface TypeMeta {\n  hasResolveReference: boolean;\n  resolvableKeyDirectives: readonly DirectiveNode[];\n  /**\n   * referenceSelectionSets\n   * @description Each element can be `ReferenceSelectionSet[]`.\n   * Elements at the root level are combined with `&` and nested elements are combined with `|`.\n   *\n   * @example:\n   * - [[A, B], [C], [D]]      -> (A | B) & C & D\n   * - [[A, B], [C, D], [E]] -> (A | B) & (C | D) & E\n   */\n  referenceSelectionSets: { directive: '@key' | '@requires'; selectionSets: ReferenceSelectionSet[] }[];\n  referenceSelectionSetsString: string;\n}\n\nexport type FederationMeta = { [typeName: string]: TypeMeta };\n\n/**\n * Adds `__resolveReference` in each ObjectType and InterfaceType involved in Federation.\n * We do this to utilise the existing FieldDefinition logic of the plugin, which includes many logic:\n * - mapper\n * - return type\n * @param schema\n */\nexport function addFederationReferencesToSchema(schema: GraphQLSchema): {\n  transformedSchema: GraphQLSchema;\n  federationMeta: FederationMeta;\n} {\n  const setFederationMeta = ({\n    meta,\n    typeName,\n    update,\n  }: {\n    meta: FederationMeta;\n    typeName: string;\n    update: TypeMeta;\n  }): void => {\n    meta[typeName] = {\n      ...(meta[typeName] ||\n        ({\n          hasResolveReference: false,\n          resolvableKeyDirectives: [],\n          referenceSelectionSets: [],\n          referenceSelectionSetsString: '',\n        } satisfies TypeMeta)),\n      ...update,\n    };\n  };\n\n  const getReferenceSelectionSets = ({\n    resolvableKeyDirectives,\n    fields,\n  }: {\n    resolvableKeyDirectives: readonly DirectiveNode[];\n    fields: GraphQLFieldConfigMap<any, any>;\n  }): TypeMeta['referenceSelectionSets'] => {\n    const referenceSelectionSets: TypeMeta['referenceSelectionSets'] = [];\n\n    // @key() @key() - \"primary keys\" in Federation\n    // A reference may receive one primary key combination at a time, so they will be combined with `|`\n    const primaryKeys = resolvableKeyDirectives.map(extractReferenceSelectionSet);\n    referenceSelectionSets.push({ directive: '@key', selectionSets: [...primaryKeys] });\n\n    const requiresPossibleTypes: ReferenceSelectionSet[] = [];\n    for (const fieldNode of Object.values(fields)) {\n      // Look for @requires and see what the service needs and gets\n      const directives = getDirectivesByName('requires', fieldNode.astNode);\n      for (const directive of directives) {\n        const requires = extractReferenceSelectionSet(directive);\n        requiresPossibleTypes.push(requires);\n      }\n    }\n    referenceSelectionSets.push({ directive: '@requires', selectionSets: requiresPossibleTypes });\n\n    return referenceSelectionSets;\n  };\n\n  /**\n   * Function to find all combinations of selection sets and push them into the `result`\n   * This is used for `@requires` directive because depending on the operation selection set, different\n   * combination of fields are sent from the router.\n   *\n   * @example\n   * Input: [\n   *   { a: true },\n   *   { b: true },\n   *   { c: true },\n   *   { d: true},\n   * ]\n   * Output: [\n   *   { a: true },\n   *   { a: true, b: true },\n   *   { a: true, c: true },\n   *   { a: true, d: true },\n   *   { a: true, b: true, c: true },\n   *   { a: true, b: true, d: true },\n   *   { a: true, c: true, d: true },\n   *   { a: true, b: true, c: true, d: true }\n   *\n   *   { b: true },\n   *   { b: true, c: true },\n   *   { b: true, d: true },\n   *   { b: true, c: true, d: true }\n   *\n   *   { c: true },\n   *   { c: true, d: true },\n   *\n   *   { d: true },\n   * ]\n   * ```\n   */\n  function findAllSelectionSetCombinations(\n    selectionSets: ReferenceSelectionSet[],\n    result: ReferenceSelectionSet[]\n  ): void {\n    if (selectionSets.length === 0) {\n      return;\n    }\n\n    for (let baseIndex = 0; baseIndex < selectionSets.length; baseIndex++) {\n      const base = selectionSets.slice(0, baseIndex + 1);\n      const rest = selectionSets.slice(baseIndex + 1, selectionSets.length);\n\n      const currentSelectionSet = base.reduce((acc, selectionSet) => {\n        acc = { ...acc, ...selectionSet };\n        return acc;\n      }, {});\n\n      if (baseIndex === 0) {\n        result.push(currentSelectionSet);\n      }\n\n      for (const selectionSet of rest) {\n        result.push({ ...currentSelectionSet, ...selectionSet });\n      }\n    }\n\n    const next = selectionSets.slice(1, selectionSets.length);\n\n    if (next.length > 0) {\n      findAllSelectionSetCombinations(next, result);\n    }\n  }\n\n  const printReferenceSelectionSets = ({\n    typeName,\n    baseFederationType,\n    referenceSelectionSets,\n  }: {\n    typeName: string;\n    baseFederationType: string;\n    referenceSelectionSets: TypeMeta['referenceSelectionSets'];\n  }): string => {\n    const referenceSelectionSetStrings = referenceSelectionSets.reduce<string[]>(\n      (acc, { directive, selectionSets: originalSelectionSets }) => {\n        const result: string[] = [];\n\n        let selectionSets = originalSelectionSets;\n        if (directive === '@requires') {\n          selectionSets = [];\n          findAllSelectionSetCombinations(originalSelectionSets, selectionSets);\n          if (selectionSets.length > 0) {\n            result.push('Record<PropertyKey, never>');\n          }\n        }\n\n        for (const referenceSelectionSet of selectionSets) {\n          result.push(`GraphQLRecursivePick<${baseFederationType}, ${JSON.stringify(referenceSelectionSet)}>`);\n        }\n\n        if (result.length === 0) {\n          return acc;\n        }\n\n        if (result.length === 1) {\n          acc.push(result.join(' | '));\n          return acc;\n        }\n\n        acc.push(`( ${result.join('\\n        | ')} )`);\n        return acc;\n      },\n      []\n    );\n\n    return `\\n    ( { __typename: '${typeName}' }\\n    & ${referenceSelectionSetStrings.join('\\n    & ')} )`;\n  };\n\n  const federationMeta: FederationMeta = {};\n\n  const transformedSchema = mapSchema(schema, {\n    [MapperKind.INTERFACE_TYPE]: type => {\n      const node = astFromInterfaceType(type, schema);\n      const federationDetails = checkTypeFederationDetails(node, schema);\n      if (federationDetails && federationDetails.resolvableKeyDirectives.length > 0) {\n        const typeConfig = type.toConfig();\n        typeConfig.fields = {\n          [resolveReferenceFieldName]: {\n            type,\n          },\n          ...typeConfig.fields,\n        };\n\n        const referenceSelectionSets = getReferenceSelectionSets({\n          resolvableKeyDirectives: federationDetails.resolvableKeyDirectives,\n          fields: typeConfig.fields,\n        });\n\n        const referenceSelectionSetsString = printReferenceSelectionSets({\n          typeName: type.name,\n          baseFederationType: `FederationTypes['${type.name}']`, // FIXME: run convertName on FederationTypes\n          referenceSelectionSets,\n        });\n\n        setFederationMeta({\n          meta: federationMeta,\n          typeName: type.name,\n          update: {\n            hasResolveReference: true,\n            resolvableKeyDirectives: federationDetails.resolvableKeyDirectives,\n            referenceSelectionSets,\n            referenceSelectionSetsString,\n          },\n        });\n\n        return new GraphQLInterfaceType(typeConfig);\n      }\n\n      return type;\n    },\n    [MapperKind.OBJECT_TYPE]: type => {\n      const node = astFromObjectType(type, schema);\n      const federationDetails = checkTypeFederationDetails(node, schema);\n      if (federationDetails && federationDetails.resolvableKeyDirectives.length > 0) {\n        const typeConfig = type.toConfig();\n\n        const referenceSelectionSets = getReferenceSelectionSets({\n          resolvableKeyDirectives: federationDetails.resolvableKeyDirectives,\n          fields: typeConfig.fields,\n        });\n\n        typeConfig.fields = {\n          [resolveReferenceFieldName]: {\n            type,\n          },\n          ...typeConfig.fields,\n        };\n\n        const referenceSelectionSetsString = printReferenceSelectionSets({\n          typeName: type.name,\n          baseFederationType: `FederationTypes['${type.name}']`, // FIXME: run convertName on FederationTypes\n          referenceSelectionSets,\n        });\n\n        setFederationMeta({\n          meta: federationMeta,\n          typeName: type.name,\n          update: {\n            hasResolveReference: true,\n            resolvableKeyDirectives: federationDetails.resolvableKeyDirectives,\n            referenceSelectionSets,\n            referenceSelectionSetsString,\n          },\n        });\n\n        return new GraphQLObjectType(typeConfig);\n      }\n      return type;\n    },\n  });\n\n  return {\n    transformedSchema,\n    federationMeta,\n  };\n}\n\n/**\n * Removes Federation Spec from GraphQL Schema\n * @param schema\n * @param config\n */\nexport function removeFederation(schema: GraphQLSchema): GraphQLSchema {\n  return mapSchema(schema, {\n    [MapperKind.QUERY]: queryType => {\n      const queryTypeConfig = queryType.toConfig();\n      delete queryTypeConfig.fields._entities;\n      delete queryTypeConfig.fields._service;\n      return new GraphQLObjectType(queryTypeConfig);\n    },\n    [MapperKind.UNION_TYPE]: unionType => {\n      const unionTypeName = unionType.name;\n      if (unionTypeName === '_Entity' || unionTypeName === '_Any') {\n        return null;\n      }\n      return unionType;\n    },\n    [MapperKind.OBJECT_TYPE]: objectType => {\n      if (objectType.name === '_Service') {\n        return null;\n      }\n      return objectType;\n    },\n  });\n}\n\nconst resolveReferenceFieldName = '__resolveReference';\n\nexport class ApolloFederation {\n  private enabled = false;\n  private schema: GraphQLSchema;\n  private providesMap: Record<string, string[]>;\n  /**\n   * `fieldsToGenerate` is a meta object where the keys are object type names\n   * and the values are fields that must be generated for that object.\n   */\n  private fieldsToGenerate: Record<string, FieldDefinitionNode[]>;\n  protected meta: FederationMeta = {};\n\n  constructor({ enabled, schema, meta }: { enabled: boolean; schema: GraphQLSchema; meta: FederationMeta }) {\n    this.enabled = enabled;\n    this.schema = schema;\n    this.providesMap = this.createMapOfProvides();\n    this.fieldsToGenerate = {};\n    this.meta = meta;\n  }\n\n  /**\n   * Excludes types definde by Federation\n   * @param typeNames List of type names\n   */\n  filterTypeNames(typeNames: string[]): string[] {\n    return this.enabled ? typeNames.filter(t => t !== '_FieldSet') : typeNames;\n  }\n\n  /**\n   * Excludes `__resolveReference` fields\n   * @param fieldNames List of field names\n   */\n  filterFieldNames(fieldNames: string[]): string[] {\n    return this.enabled ? fieldNames.filter(t => t !== resolveReferenceFieldName) : fieldNames;\n  }\n\n  /**\n   * Decides if directive should not be generated\n   * @param name directive's name\n   */\n  skipDirective(name: string): boolean {\n    return this.enabled && ['external', 'requires', 'provides', 'key'].includes(name);\n  }\n\n  /**\n   * Decides if scalar should not be generated\n   * @param name directive's name\n   */\n  skipScalar(name: string): boolean {\n    return this.enabled && name === '_FieldSet';\n  }\n\n  /**\n   * findFieldNodesToGenerate\n   * @description Function to find field nodes to generate.\n   * In a normal setup, all fields must be generated.\n   * However, in a Federatin setup, a field should not be generated if:\n   * - The field is marked as `@external` and there is no `@provides` path to the field\n   * - The parent object is marked as `@external` and there is no `@provides` path to the field\n   */\n  findFieldNodesToGenerate({\n    node,\n  }: {\n    node: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode;\n  }): readonly FieldDefinitionNode[] {\n    const nodeName = node.name.value;\n    if (this.fieldsToGenerate[nodeName]) {\n      return this.fieldsToGenerate[nodeName];\n    }\n\n    const fieldNodes = ((node.fields || []) as unknown as FieldDefinitionResult[]).map(field => field.node);\n\n    if (!this.enabled) {\n      return fieldNodes;\n    }\n\n    // If the object is marked with `@external`, fields to generate are those with `@provides`\n    if (this.isExternal(node)) {\n      const fieldNodesWithProvides = fieldNodes.reduce<FieldDefinitionNode[]>((acc, fieldNode) => {\n        if (this.hasProvides(node, fieldNode.name.value)) {\n          acc.push(fieldNode);\n          return acc;\n        }\n        return acc;\n      }, []);\n\n      this.fieldsToGenerate[nodeName] = fieldNodesWithProvides;\n\n      return fieldNodesWithProvides;\n    }\n\n    // If the object is not marked with `@external`, fields to generate are:\n    // - the fields without `@external`\n    // - the `@external` fields with `@provides`\n    const fieldNodesWithoutExternalOrHasProvides = fieldNodes.reduce<FieldDefinitionNode[]>((acc, fieldNode) => {\n      if (!this.isExternal(fieldNode)) {\n        acc.push(fieldNode);\n        return acc;\n      }\n\n      if (this.isExternal(fieldNode) && this.hasProvides(node, fieldNode.name.value)) {\n        acc.push(fieldNode);\n        return acc;\n      }\n\n      return acc;\n    }, []);\n\n    this.fieldsToGenerate[nodeName] = fieldNodesWithoutExternalOrHasProvides;\n\n    return fieldNodesWithoutExternalOrHasProvides;\n  }\n\n  isResolveReferenceField(fieldNode: FieldDefinitionNode): boolean {\n    const name = typeof fieldNode.name === 'string' ? fieldNode.name : fieldNode.name.value;\n    return this.enabled && name === resolveReferenceFieldName;\n  }\n\n  addFederationTypeGenericIfApplicable({\n    genericTypes,\n    typeName,\n    federationTypesType,\n  }: {\n    genericTypes: string[];\n    typeName: string;\n    federationTypesType: string;\n  }): void {\n    if (!this.getMeta()[typeName]) {\n      return;\n    }\n\n    const typeRef = `${federationTypesType}['${typeName}']`;\n    genericTypes.push(`FederationReferenceType extends ${typeRef} = ${typeRef}`);\n  }\n\n  getMeta() {\n    return this.meta;\n  }\n\n  private isExternal(node: FieldDefinitionNode | ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode): boolean {\n    return getDirectivesByName('external', node).length > 0;\n  }\n\n  private hasProvides(node: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode, fieldName: string): boolean {\n    const fields = this.providesMap[node.name.value];\n\n    if (fields?.length) {\n      return fields.includes(fieldName);\n    }\n\n    return false;\n  }\n\n  private createMapOfProvides() {\n    const providesMap: Record<string, string[]> = {};\n\n    for (const typename of Object.keys(this.schema.getTypeMap())) {\n      const objectType = this.schema.getType(typename);\n\n      if (isObjectType(objectType)) {\n        for (const field of Object.values(objectType.getFields())) {\n          const provides = getDirectivesByName('provides', field.astNode)\n            .map(extractReferenceSelectionSet)\n            .reduce((prev, curr) => [...prev, ...Object.keys(curr)], []); // FIXME: this is not taking into account nested selection sets e.g. `company { taxCode }`\n          const ofType = getBaseType(field.type);\n\n          providesMap[ofType.name] ||= [];\n\n          providesMap[ofType.name].push(...provides);\n        }\n      }\n    }\n\n    return providesMap;\n  }\n}\n\n/**\n * Checks if Object Type is involved in Federation. Based on `@key` directive\n * @param node Type\n */\nfunction checkTypeFederationDetails(\n  node: ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode,\n  schema: GraphQLSchema\n): { resolvableKeyDirectives: readonly DirectiveNode[] } | false {\n  const name = node.name.value;\n  const directives = node.directives;\n\n  const rootTypeNames = getRootTypeNames(schema);\n  const isNotRoot = !rootTypeNames.has(name);\n  const isNotIntrospection = !name.startsWith('__');\n  const keyDirectives = directives.filter(d => d.name.value === 'key');\n\n  const check = isNotRoot && isNotIntrospection && keyDirectives.length > 0;\n\n  if (!check) {\n    return false;\n  }\n\n  const resolvableKeyDirectives = keyDirectives.filter(d => {\n    for (const arg of d.arguments) {\n      if (arg.name.value === 'resolvable' && arg.value.kind === 'BooleanValue' && arg.value.value === false) {\n        return false;\n      }\n    }\n    return true;\n  });\n\n  return { resolvableKeyDirectives };\n}\n\n/**\n * Extracts directives from a node based on directive's name\n * @param name directive name\n * @param node ObjectType or Field\n */\nfunction getDirectivesByName(\n  name: string,\n  node: ObjectTypeDefinitionNode | FieldDefinitionNode | InterfaceTypeDefinitionNode\n): readonly DirectiveNode[] {\n  return node?.directives?.filter(d => d.name.value === name) || [];\n}\n\nfunction extractReferenceSelectionSet(directive: DirectiveNode): ReferenceSelectionSet {\n  const arg = directive.arguments.find(arg => arg.name.value === 'fields');\n  const { value } = arg.value as StringValueNode;\n\n  return oldVisit(parse(`{${value}}`), {\n    leave: {\n      SelectionSet(node) {\n        return (node.selections as any as DirectiveSelectionSet[]).reduce((accum, field) => {\n          accum[field.name] = field.selection;\n          return accum;\n        }, {});\n      },\n      Field(node) {\n        return {\n          name: node.name.value,\n          selection: node.selectionSet || true,\n        } as DirectiveSelectionSet;\n      },\n      Document(node) {\n        return node.definitions.find(\n          (def: DefinitionNode): def is OperationDefinitionNode =>\n            def.kind === 'OperationDefinition' && def.operation === 'query'\n        ).selectionSet;\n      },\n    },\n  });\n}\n"
  },
  {
    "path": "packages/utils/plugins-helpers/src/getCachedDocumentNodeFromSchema.ts",
    "content": "import { getDocumentNodeFromSchema, memoize1 } from '@graphql-tools/utils';\n\nexport const getCachedDocumentNodeFromSchema = memoize1(getDocumentNodeFromSchema);\n"
  },
  {
    "path": "packages/utils/plugins-helpers/src/helpers.ts",
    "content": "import {\n  ASTNode,\n  DocumentNode,\n  FieldNode,\n  FragmentDefinitionNode,\n  GraphQLObjectType,\n  GraphQLOutputType,\n  GraphQLSchema,\n  InlineFragmentNode,\n  InputValueDefinitionNode,\n  isListType,\n  isNonNullType,\n  isObjectType,\n  Kind,\n  OperationDefinitionNode,\n  SelectionSetNode,\n  VariableDefinitionNode,\n  visit,\n} from 'graphql';\nimport { Types } from './types.js';\nimport { getBaseType } from './utils.js';\n\nexport function isOutputConfigArray(type: any): type is Types.OutputConfig[] {\n  return Array.isArray(type);\n}\n\nexport function isConfiguredOutput(type: any): type is Types.ConfiguredOutput {\n  return typeof type === 'object';\n}\n\nexport function normalizeOutputParam(\n  config: Types.OutputConfig | Types.ConfiguredPlugin[] | Types.ConfiguredOutput\n): Types.ConfiguredOutput {\n  // In case of direct array with a list of plugins\n  if (isOutputConfigArray(config)) {\n    return {\n      documents: [],\n      schema: [],\n      plugins: isConfiguredOutput(config) ? config.plugins : config,\n    };\n  }\n  if (isConfiguredOutput(config)) {\n    return config;\n  }\n  throw new Error(`Invalid \"generates\" config!`);\n}\n\nexport function normalizeInstanceOrArray<T>(type: T | T[]): T[] {\n  if (Array.isArray(type)) {\n    return type;\n  }\n  if (!type) {\n    return [];\n  }\n\n  return [type];\n}\n\nexport function normalizeConfig(config: Types.OutputConfig | Types.OutputConfig[]): Types.ConfiguredPlugin[] {\n  if (typeof config === 'string') {\n    return [{ [config]: {} }];\n  }\n  if (Array.isArray(config)) {\n    return config.map(plugin => (typeof plugin === 'string' ? { [plugin]: {} } : plugin));\n  }\n  if (typeof config === 'object') {\n    return Object.keys(config).reduce((prev, pluginName) => [...prev, { [pluginName]: config[pluginName] }], []);\n  }\n  return [];\n}\n\nexport function hasNullableTypeRecursively(type: GraphQLOutputType): boolean {\n  if (!isNonNullType(type)) {\n    return true;\n  }\n\n  if (isListType(type) || isNonNullType(type)) {\n    return hasNullableTypeRecursively(type.ofType);\n  }\n\n  return false;\n}\n\nexport function isUsingTypes(document: DocumentNode, externalFragments: string[], schema?: GraphQLSchema): boolean {\n  let foundFields = 0;\n  const typesStack: GraphQLObjectType[] = [];\n\n  visit(document, {\n    SelectionSet: {\n      enter(\n        node: SelectionSetNode,\n        key,\n        parent: InlineFragmentNode | FragmentDefinitionNode | FieldNode | OperationDefinitionNode,\n        anscestors\n      ) {\n        const insideIgnoredFragment = (anscestors as any).find(\n          (f: ASTNode) => f.kind && f.kind === 'FragmentDefinition' && externalFragments.includes(f.name.value)\n        );\n\n        if (insideIgnoredFragment) {\n          return;\n        }\n\n        const selections = node.selections || [];\n\n        if (schema && selections.length > 0) {\n          const nextTypeName = (() => {\n            if (parent.kind === Kind.FRAGMENT_DEFINITION) {\n              return parent.typeCondition.name.value;\n            }\n            if (parent.kind === Kind.FIELD) {\n              const lastType = typesStack[typesStack.length - 1];\n\n              if (!lastType) {\n                throw new Error(`Unable to find parent type! Please make sure you operation passes validation`);\n              }\n              const field = lastType.getFields()[parent.name.value];\n\n              if (!field) {\n                throw new Error(`Unable to find field \"${parent.name.value}\" on type \"${lastType}\"!`);\n              }\n\n              return getBaseType(field.type).name;\n            }\n            if (parent.kind === Kind.OPERATION_DEFINITION) {\n              if (parent.operation === 'query') {\n                return schema.getQueryType().name;\n              }\n              if (parent.operation === 'mutation') {\n                return schema.getMutationType().name;\n              }\n              if (parent.operation === 'subscription') {\n                return schema.getSubscriptionType().name;\n              }\n            } else if (parent.kind === Kind.INLINE_FRAGMENT) {\n              if (parent.typeCondition) {\n                return parent.typeCondition.name.value;\n              }\n              return typesStack[typesStack.length - 1].name;\n            }\n\n            return null;\n          })();\n\n          typesStack.push(schema.getType(nextTypeName) as any);\n        }\n      },\n      leave(node: SelectionSetNode) {\n        const selections = node.selections || [];\n\n        if (schema && selections.length > 0) {\n          typesStack.pop();\n        }\n      },\n    },\n    Field: {\n      enter: (node: FieldNode, key, parent, path, anscestors) => {\n        if (node.name.value.startsWith('__')) {\n          return;\n        }\n\n        const insideIgnoredFragment = (anscestors as any).find(\n          (f: ASTNode) => f.kind && f.kind === 'FragmentDefinition' && externalFragments.includes(f.name.value)\n        );\n\n        if (insideIgnoredFragment) {\n          return;\n        }\n\n        const selections = node.selectionSet ? node.selectionSet.selections || [] : [];\n        const relevantFragmentSpreads = selections.filter(\n          s => s.kind === Kind.FRAGMENT_SPREAD && !externalFragments.includes(s.name.value)\n        );\n\n        if (selections.length === 0 || relevantFragmentSpreads.length > 0) {\n          foundFields++;\n        }\n\n        if (schema) {\n          const lastType = typesStack[typesStack.length - 1];\n\n          if (lastType && isObjectType(lastType)) {\n            const field = lastType.getFields()[node.name.value];\n\n            if (!field) {\n              throw new Error(`Unable to find field \"${node.name.value}\" on type \"${lastType}\"!`);\n            }\n\n            const currentType = field.type;\n\n            // To handle `Maybe` usage\n            if (hasNullableTypeRecursively(currentType)) {\n              foundFields++;\n            }\n          }\n        }\n      },\n    },\n    VariableDefinition: {\n      enter: (node: VariableDefinitionNode, key, parent, path, anscestors) => {\n        const insideIgnoredFragment = (anscestors as any).find(\n          (f: ASTNode) => f.kind && f.kind === 'FragmentDefinition' && externalFragments.includes(f.name.value)\n        );\n\n        if (insideIgnoredFragment) {\n          return;\n        }\n        foundFields++;\n      },\n    },\n    InputValueDefinition: {\n      enter: (node: InputValueDefinitionNode, key, parent, path, anscestors) => {\n        const insideIgnoredFragment = (anscestors as any).find(\n          (f: ASTNode) => f.kind && f.kind === 'FragmentDefinition' && externalFragments.includes(f.name.value)\n        );\n\n        if (insideIgnoredFragment) {\n          return;\n        }\n        foundFields++;\n      },\n    },\n  });\n\n  return foundFields > 0;\n}\n\nexport function normalizeImportExtension({\n  emitLegacyCommonJSImports,\n  importExtension,\n}: {\n  emitLegacyCommonJSImports: boolean | undefined;\n  importExtension: '' | `.${string}` | undefined;\n}): '' | `.${string}` {\n  if (importExtension !== undefined) {\n    return importExtension;\n  }\n\n  if (emitLegacyCommonJSImports === undefined || emitLegacyCommonJSImports === true) {\n    return '';\n  }\n\n  return '.js';\n}\n"
  },
  {
    "path": "packages/utils/plugins-helpers/src/index.ts",
    "content": "export * from './federation.js';\nexport * from './getCachedDocumentNodeFromSchema.js';\nexport * from './helpers.js';\nexport * from './oldVisit.js';\nexport * from './profiler.js';\nexport { resolveExternalModuleAndFn } from './resolve-external-module-and-fn.js';\nexport * from './types.js';\nexport { Types } from './types.js';\nexport * from './utils.js';\n"
  },
  {
    "path": "packages/utils/plugins-helpers/src/oldVisit.ts",
    "content": "import { ASTNode, visit } from 'graphql';\n\ntype VisitFn = typeof visit;\ntype NewVisitor = Partial<Parameters<VisitFn>[1]>;\ntype OldVisitor = {\n  enter?: Partial<Record<keyof NewVisitor, NonNullable<NewVisitor[keyof NewVisitor]>['enter']>>;\n  leave?: Partial<Record<keyof NewVisitor, NonNullable<NewVisitor[keyof NewVisitor]>['leave']>>;\n} & NewVisitor;\n\nexport function oldVisit(\n  root: ASTNode,\n  { enter: enterVisitors, leave: leaveVisitors, ...newVisitor }: OldVisitor\n): any {\n  if (typeof enterVisitors === 'object') {\n    for (const key in enterVisitors) {\n      newVisitor[key] ||= {};\n      newVisitor[key].enter = enterVisitors[key];\n    }\n  }\n  if (typeof leaveVisitors === 'object') {\n    for (const key in leaveVisitors) {\n      newVisitor[key] ||= {};\n      newVisitor[key].leave = leaveVisitors[key];\n    }\n  }\n  return visit(root, newVisitor);\n}\n"
  },
  {
    "path": "packages/utils/plugins-helpers/src/profiler.ts",
    "content": "export interface ProfilerEvent {\n  /** The name of the event, as displayed in Trace Viewer */\n  name: string;\n  /** The event categories. This is a comma separated list of categories for the event. The categories can be used to hide events in the Trace Viewer UI. */\n  cat: string;\n  /** The event type. This is a single character which changes depending on the type of event being output. The valid values are listed in the table below. We will discuss each phase type below. */\n  ph: string;\n  /** The tracing clock timestamp of the event. The timestamps are provided at microsecond granularity. */\n  ts: number;\n  /** Optional. The thread clock timestamp of the event. The timestamps are provided at microsecond granularity. */\n  tts?: string;\n  /** The process ID for the process that output this event. */\n  pid: number;\n  /** The thread ID for the thread that output this event. */\n  tid: number;\n  /** Any arguments provided for the event. Some of the event types have required argument fields, otherwise, you can put any information you wish in here. The arguments are displayed in Trace Viewer when you view an event in the analysis section. */\n  args?: any;\n  /** duration */\n  dur: number;\n  /** A fixed color name to associate with the event. If provided, cname must be one of the names listed in trace-viewer's base color scheme's reserved color names list */\n  cname?: string;\n}\n\nexport interface Profiler {\n  run<T>(fn: () => Promise<T>, name: string, cat?: string): Promise<T>;\n  collect(): ProfilerEvent[];\n}\n\nexport function createNoopProfiler(): Profiler {\n  return {\n    run(fn) {\n      return Promise.resolve().then(() => fn());\n    },\n    collect() {\n      return [];\n    },\n  };\n}\n\nexport function createProfiler(): Profiler {\n  const events: ProfilerEvent[] = [];\n\n  return {\n    collect() {\n      return events;\n    },\n    run(fn, name, cat) {\n      let startTime: [number, number];\n\n      return Promise.resolve()\n        .then(() => {\n          startTime = process.hrtime();\n        })\n        .then(() => fn())\n        .then(value => {\n          const duration = process.hrtime(startTime);\n\n          // Trace Event Format documentation:\n          // https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview\n          const event: ProfilerEvent = {\n            name,\n            cat,\n            ph: 'X',\n            ts: hrtimeToMicroseconds(startTime),\n            pid: 1,\n            tid: 0,\n            dur: hrtimeToMicroseconds(duration),\n          };\n\n          events.push(event);\n\n          return value;\n        });\n    },\n  };\n}\n\nfunction hrtimeToMicroseconds(hrtime: any) {\n  return (hrtime[0] * 1e9 + hrtime[1]) / 1000;\n}\n"
  },
  {
    "path": "packages/utils/plugins-helpers/src/resolve-external-module-and-fn.ts",
    "content": "import { createRequire } from 'module';\nimport { cwd } from 'process';\nimport * as changeCaseAll from 'change-case-all';\n\nexport function resolveExternalModuleAndFn(pointer: any): any {\n  if (typeof pointer === 'function') {\n    return pointer;\n  }\n\n  let [moduleName, functionName] = pointer.split('#');\n  // Temp workaround until v2\n  if (moduleName === 'change-case') {\n    moduleName = 'change-case-all';\n  }\n\n  let loadedModule: any;\n  if (moduleName === 'change-case-all') {\n    loadedModule = changeCaseAll;\n  } else {\n    // we have to use a path to a filename here (it does not need to exist.)\n    // https://github.com/dotansimha/graphql-code-generator/issues/6553\n    const cwdRequire = createRequire(cwd() + '/index.js');\n    loadedModule = cwdRequire(moduleName);\n\n    if (!(functionName in loadedModule) && typeof loadedModule !== 'function') {\n      throw new Error(`${functionName} couldn't be found in module ${moduleName}!`);\n    }\n  }\n\n  return loadedModule[functionName] || loadedModule;\n}\n"
  },
  {
    "path": "packages/utils/plugins-helpers/src/types.ts",
    "content": "import type { ApolloEngineOptions } from '@graphql-tools/apollo-engine-loader';\nimport { Source } from '@graphql-tools/utils';\nimport { DocumentNode, GraphQLSchema } from 'graphql';\nimport type { Profiler } from './profiler.js';\n\nexport namespace Types {\n  export interface GenerateOptions {\n    filename: string;\n    plugins: Types.ConfiguredPlugin[];\n    // TODO: Remove schemaAst and change schema to GraphQLSchema in the next major version\n    schema: DocumentNode;\n    schemaAst?: GraphQLSchema;\n    documents: Types.DocumentFile[];\n    config: { [key: string]: any };\n    pluginMap: {\n      [name: string]: CodegenPlugin;\n    };\n    skipDocumentsValidation?: Types.SkipDocumentsValidationOptions;\n    pluginContext?: { [key: string]: any };\n    profiler?: Profiler;\n    cache?<T>(namespace: string, key: string, factory: () => Promise<T>): Promise<T>;\n    documentTransforms?: ConfiguredDocumentTransform[];\n    emitLegacyCommonJSImports?: boolean;\n    importExtension?: '' | `.${string}`;\n  }\n\n  export type FileOutput = {\n    filename: string;\n    content: string;\n    hooks?: {\n      beforeOneFileWrite?: LifecycleHooksDefinition['beforeOneFileWrite'];\n      afterOneFileWrite?: LifecycleHooksDefinition['afterOneFileWrite'];\n    };\n  };\n\n  export interface DocumentFile extends Source {\n    hash?: string;\n  }\n\n  /* Utils */\n  export type Promisable<T> = T | Promise<T>;\n  export type InstanceOrArray<T> = T | T[];\n\n  /**\n   * @additionalProperties false\n   * @description Loads schema using a pointer, with a custom loader (code file).\n   */\n  export interface SchemaWithLoaderOptions {\n    /**\n     * @description Specify a path to a custom code file (local or module) that will handle the schema loading.\n     */\n    loader: string;\n  }\n  export interface SchemaWithLoader {\n    [pointer: string]: SchemaWithLoaderOptions;\n  }\n\n  /**\n   * @additionalProperties false\n   * @description Loads schema using a pointer, without using `require` while looking for schemas in code files.\n   */\n  export interface SchemaFromCodeFileOptions {\n    /**\n     * @description Set this to `true` in order to tell codegen not to try to `require` files in order to find schema/docs\n     */\n    noRequire?: boolean;\n    /**\n     * @description Set this to `true` in order to tell codegen not to try to extract GraphQL AST strings schema/docs\n     */\n    noPluck?: boolean;\n    /**\n     * @description Set this to `true` in order to tell codegen to skip documents validation.\n     */\n    assumeValid?: boolean;\n  }\n  export interface SchemaFromCodeFile {\n    [path: string]: SchemaFromCodeFileOptions;\n  }\n\n  /**\n   * @description A function to use for fetching the schema.\n   * @see fetch\n   */\n  export type CustomSchemaFetcher = (url: string, options?: RequestInit) => Promise<Response>;\n\n  /**\n   * @additionalProperties false\n   * @description Loads a schema from remote endpoint, with custom http options.\n   */\n  export interface UrlSchemaOptions {\n    /**\n     * @description HTTP headers you wish to add to the HTTP request sent by codegen to fetch your GraphQL remote schema.\n     */\n    headers?: { [headerName: string]: string };\n    /**\n     * @description Specify a Node module name, a custom file, or a function, to be used instead of a standard `fetch`.\n     */\n    customFetch?: string | CustomSchemaFetcher;\n    /**\n     * @description HTTP Method to use, either POST (default) or GET.\n     */\n    method?: string;\n    /**\n     * @description Handling the response as SDL will allow you to load schema from remote server that doesn't return a JSON introspection.\n     */\n    handleAsSDL?: boolean;\n  }\n  export interface UrlSchemaWithOptions {\n    [url: string]: UrlSchemaOptions;\n  }\n\n  /**\n   * @additionalProperties false\n   * @description Loads a schema a local file or files, with customized options for parsing/loading.\n   */\n  export interface LocalSchemaPathOptions {\n    /**\n     * @description Skips checks for graphql-import syntax and loads the file as-is, without imports support.\n     * @default true\n     */\n    skipGraphQLImport?: boolean;\n\n    /**\n     * @description Converts all GraphQL comments (`#` sign) to descriptions during the parse phase, to make it available\n     * for plugins later.\n     * @default false\n     */\n    commentDescriptions?: boolean;\n\n    /**\n     * Set to true to assume the SDL is valid.\n     *\n     * @default false\n     */\n    assumeValidSDL?: boolean;\n\n    /**\n     * By default, the parser creates AST nodes that know the location\n     * in the source that they correspond to. This configuration flag\n     * disables that behavior for performance or testing.\n     *\n     * @default false\n     */\n    noLocation?: boolean;\n\n    /**\n     * If enabled, the parser will parse empty fields sets in the Schema\n     * Definition Language. Otherwise, the parser will follow the current\n     * specification.\n     *\n     * This option is provided to ease adoption of the final SDL specification\n     * and will be removed in v16.\n     *\n     * @default false\n     */\n    allowLegacySDLEmptyFields?: boolean;\n\n    /**\n     * If enabled, the parser will parse implemented interfaces with no `&`\n     * character between each interface. Otherwise, the parser will follow the\n     * current specification.\n     *\n     * This option is provided to ease adoption of the final SDL specification\n     * and will be removed in v16.\n     *\n     * @default false\n     */\n    allowLegacySDLImplementsInterfaces?: boolean;\n\n    /**\n     * EXPERIMENTAL:\n     *\n     * If enabled, the parser will understand and parse variable definitions\n     * contained in a fragment definition. They'll be represented in the\n     * `variableDefinitions` field of the FragmentDefinitionNode.\n     *\n     * The syntax is identical to normal, query-defined variables. For example:\n     *\n     *   fragment A($var: Boolean = false) on T  {\n     *     ...\n     *   }\n     *\n     * Note: this feature is experimental and may change or be removed in the\n     * future.\n     *\n     * @default false\n     */\n    experimentalFragmentVariables?: boolean;\n  }\n  export interface LocalSchemaPathWithOptions {\n    [globPath: string]: LocalSchemaPathOptions;\n  }\n\n  export interface ApolloEngineSchemaOptions {\n    'apollo-engine': ApolloEngineOptions;\n  }\n\n  export interface GitHubSchemaOptions {\n    [githubProtocol: string]: { token: string };\n  }\n\n  export type SchemaGlobPath = string;\n  /**\n   * @description A URL to your GraphQL endpoint, a local path to `.graphql` file, a glob pattern to your GraphQL schema files, or a JavaScript file that exports the schema to generate code from. This can also be an array which specifies multiple schemas to generate code from. You can read more about the supported formats [here](schema-field#available-formats).\n   */\n  export type Schema =\n    | string\n    | UrlSchemaWithOptions\n    | ApolloEngineSchemaOptions\n    | GitHubSchemaOptions\n    | LocalSchemaPathWithOptions\n    | SchemaGlobPath\n    | SchemaWithLoader\n    | SchemaFromCodeFile\n    | GraphQLSchema;\n\n  /* Document Definitions */\n  export type OperationDocumentGlobPath = string;\n\n  /**\n   * @additionalProperties false\n   * @description Specify a path to a custom loader for your GraphQL documents.\n   */\n  export interface CustomDocumentLoaderOptions {\n    /**\n     * @description Specify a path to a custom code file (local or module) that will handle the documents loading.\n     */\n    loader: string;\n  }\n  export interface CustomDocumentLoader {\n    [path: string]: CustomDocumentLoaderOptions;\n  }\n  export type OperationDocument = OperationDocumentGlobPath | CustomDocumentLoader;\n\n  /* Plugin Definition */\n  export type PluginConfig<T = any> = { [key: string]: T };\n  export interface ConfiguredPlugin {\n    [name: string]: PluginConfig;\n  }\n  export type NamedPlugin = string;\n\n  /* Output Definition */\n  export type NamedPreset = string;\n  export type OutputConfig = NamedPlugin | ConfiguredPlugin;\n\n  export type PresetNamesBase =\n    | 'client'\n    | 'near-operation-file'\n    | 'gql-tag-operations'\n    | 'graphql-modules'\n    | 'import-types';\n  export type PresetNames = `${PresetNamesBase}-preset` | PresetNamesBase;\n\n  /**\n   * @additionalProperties false\n   */\n  export interface ConfiguredOutput {\n    /**\n     * @type array\n     * @items { \"$ref\": \"#/definitions/GeneratedPluginsMap\" }\n     * @description List of plugins to apply to this current output file.\n     *\n     * You can either specify plugins from the community using the NPM package name (after you installed it in your project), or you can use a path to a local file for custom plugins.\n     *\n     * You can find a list of available plugins here: https://the-guild.dev/graphql/codegen/docs/plugins/index\n     * Need a custom plugin? read this: https://the-guild.dev/graphql/codegen/docs/custom-codegen/index\n     */\n    plugins?: OutputConfig[];\n    /**\n     * @description If your setup uses Preset to have a more dynamic setup and output, set the name of your preset here.\n     *\n     * Presets are a way to have more than one file output, for example: https://the-guild.dev/graphql/codegen/docs/presets/near-operation-file\n     *\n     * You can either specify a preset from the community using the NPM package name (after you installed it in your project), or you can use a path to a local file for a custom preset.\n     *\n     * List of available presets: https://graphql-code-generator.com/docs/presets/presets-index\n     */\n    preset?: PresetNames | OutputPreset;\n    /**\n     * @description If your setup uses Preset to have a more dynamic setup and output, set the configuration object of your preset here.\n     *\n     * List of available presets: https://graphql-code-generator.com/docs/presets/presets-index\n     */\n    presetConfig?: { [key: string]: any };\n    /**\n     * @description A flag to overwrite files if they already exist when generating code (`true` by default).\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/codegen-config\n     */\n    overwrite?: boolean;\n    /**\n     * @description A pointer(s) to your GraphQL documents: query, mutation, subscription and fragment. These documents will be loaded into for all your output files.\n     * You can use one of the following:\n     *\n     * - Path to a local `.graphql` file\n     * - Path to a code file (for example: `.js` or `.tsx`) containing GraphQL operation strings.\n     * - Glob expression pointing to multiple `.graphql` files\n     * - Glob expression pointing to multiple code files\n     * - Inline string containing GraphQL SDL operation definition\n     *\n     * You can specify either a single file, or multiple.\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/documents-field\n     */\n    documents?: InstanceOrArray<OperationDocument>;\n    /**\n     * @description A pointer(s) to your GraphQL schema. This schema will be available only for this specific `generates` record.\n     * You can use one of the following:\n     *\n     * - URL pointing to a GraphQL endpoint\n     * - Path to a local `.json` file\n     * - Path to a local `.graphql` file\n     * - Glob expression pointing to multiple `.graphql` files\n     * - Path to a local code file (for example: `.js`) that exports `GraphQLSchema` object\n     * - Inline string containing GraphQL SDL schema definition\n     *\n     * You can specify either a single schema, or multiple, and GraphQL Code Generator will merge the schemas into a single schema.\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/schema-field\n     */\n    schema?: InstanceOrArray<Schema>;\n    /**\n     * @description Configuration object containing key => value that will be passed to the plugins.\n     * Specifying configuration in this level of your configuration file will pass it to all plugins, in all outputs.\n     *\n     * The options may vary depends on what plugins you are using.\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/config-field\n     */\n    config?: PluginConfig;\n    /**\n     * @description Specifies scripts to run when events are happening in the codegen core.\n     * Hooks defined on that level will effect only the current output files.\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/lifecycle-hooks\n     */\n    hooks?: Partial<LifecycleHooksDefinition>;\n    /**\n     * @description DocumentTransform changes documents before executing plugins.\n     */\n    documentTransforms?: OutputDocumentTransform[];\n    /**\n     * @description: Additional file pattern to watch when using watch mode\n     */\n    watchPattern?: string | string[];\n  }\n\n  /* Output Builder Preset */\n  export type PresetFnArgs<\n    Config = any,\n    PluginConfig = {\n      [key: string]: any;\n    }\n  > = {\n    presetConfig: Config;\n    baseOutputDir: string;\n    plugins: Types.ConfiguredPlugin[];\n    schema: DocumentNode;\n    schemaAst?: GraphQLSchema;\n    documents: Types.DocumentFile[];\n    config: PluginConfig;\n    pluginMap: {\n      [name: string]: CodegenPlugin;\n    };\n    pluginContext?: {\n      [name: string]: any;\n    };\n    profiler?: Profiler;\n    cache?<T>(namespace: string, key: string, factory: () => Promise<T>): Promise<T>;\n    documentTransforms?: ConfiguredDocumentTransform[];\n  };\n\n  export type OutputPreset<TPresetConfig = any> = {\n    buildGeneratesSection: (options: PresetFnArgs<TPresetConfig>) => Promisable<GenerateOptions[]>;\n    prepareDocuments?: (\n      outputFilePath: string,\n      outputSpecificDocuments: Types.OperationDocument[]\n    ) => Promisable<Types.OperationDocument[]>;\n  };\n\n  /* Require Extensions */\n  export type RequireExtension = InstanceOrArray<string>;\n\n  /* PackageLoaderFn Loader */\n  export type PackageLoaderFn<TExpectedResult> = (name: string) => Promisable<TExpectedResult>;\n\n  /**\n   * @description Represents the root YAML schema for the config file.\n   * @additionalProperties false\n   */\n  export interface Config {\n    /**\n     * @description A pointer(s) to your GraphQL schema. This schema will be the base schema for all your outputs.\n     * You can use one of the following:\n     *\n     * - URL pointing to a GraphQL endpoint\n     * - Path to a local `.json` file\n     * - Path to a local `.graphql` file\n     * - Glob expression pointing to multiple `.graphql` files\n     * - Path to a local code file (for example: `.js`) that exports `GraphQLSchema` object\n     * - Inline string containing GraphQL SDL schema definition\n     *\n     * You can specify either a single schema, or multiple, and GraphQL Code Generator will merge the schemas into a single schema.\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/schema-field\n     */\n    schema?: InstanceOrArray<Schema>;\n    /**\n     * @description A path to a file which defines custom Node.JS require() handlers for custom file extensions.\n     * This is essential if the code generator has to go through files which require other files in an unsupported format (by default).\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/require-field\n     * See more information about require.extensions: https://gist.github.com/jamestalmage/df922691475cff66c7e6.\n     *\n     * Note: values that specified in your .yml file will get loaded after loading the config .yml file.\n     */\n    require?: RequireExtension;\n    /**\n     * @description Specify a Node module name, a custom file, or a function, to be used instead of a standard `fetch`.\n     */\n    customFetch?: string | CustomSchemaFetcher;\n    /**\n     * @description A pointer(s) to your GraphQL documents: query, mutation, subscription and fragment. These documents will be loaded into for all your output files.\n     * You can use one of the following:\n     *\n     * - Path to a local `.graphql` file\n     * - Path to a code file (for example: `.js` or `.tsx`) containing GraphQL operation strings.\n     * - Glob expression pointing to multiple `.graphql` files\n     * - Glob expression pointing to multiple code files\n     * - Inline string containing GraphQL SDL operation definition\n     *\n     * You can specify either a single file, or multiple.\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/documents-field\n     */\n    documents?: InstanceOrArray<OperationDocument>;\n    /**\n     * @type object\n     * @additionalProperties true\n     * @description Configuration object containing key => value that will be passed to the plugins.\n     * Specifying configuration in this level of your configuration file will pass it to all plugins, in all outputs.\n     *\n     * The options may vary depends on what plugins you are using.\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/config-field\n     */\n    config?: PluginConfig;\n    /**\n     * @description A map where the key represents an output path for the generated code and the value represents a set of options which are relevant for that specific file.\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/codegen-config\n     */\n    generates: {\n      [outputPath: string]: ConfiguredOutput | ConfiguredPlugin[];\n    };\n    /**\n     * @description A flag to overwrite files if they already exist when generating code (`true` by default).\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/codegen-config\n     */\n    overwrite?: boolean;\n    /**\n     * @description A flag to trigger codegen when there are changes in the specified GraphQL schemas.\n     *\n     * You can either specify a boolean to turn it on/off or specify an array of glob patterns to add custom files to the watch.\n     *\n     * For more details: https://graphql-code-generator.com/docs/getting-started/development-workflow#watch-mode\n     */\n    watch?: boolean | string | string[];\n    /**\n     * @description A flag to suppress non-zero exit code when there are no documents to generate.\n     */\n    ignoreNoDocuments?: boolean;\n    /**\n     * @deprecated Please use `importExtension` instead.\n     * @description A flag to disable adding `.js` extension to the output file. Default: `true`.\n     */\n    emitLegacyCommonJSImports?: boolean;\n    /**\n     * @description Append this extension to all imports.\n     * Useful for ESM environments that require file extensions in import statements.\n     */\n    importExtension?: '' | `.${string}`;\n    /**\n     * @description A flag to suppress printing errors when they occur.\n     */\n    silent?: boolean;\n    /**\n     * @description A flag to output more detailed information about tasks\n     */\n    verbose?: boolean;\n    /**\n     * @description A flag to output debug logs\n     */\n    debug?: boolean;\n    /**\n     * @description A flag to print only errors.\n     */\n    errorsOnly?: boolean;\n    /**\n     * @description If you are using the programmatic API in a browser environment, you can override this configuration to load your plugins in a way different than require.\n     */\n    pluginLoader?: PackageLoaderFn<CodegenPlugin>;\n    /**\n     * @description Additional context passed to plugins\n     */\n    pluginContext?: { [key: string]: any };\n    /**\n     * @description Allows you to override the configuration for `@graphql-tools/graphql-tag-pluck`, the tool that extracts your GraphQL operations from your code files.\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/documents-field#graphql-tag-pluck\n     */\n    pluckConfig?: {\n      /**\n       * @description An array of package name and identifier that will be used to track down your gql usages and imports. Use this if your code files imports gql from another library or you have a custom gql tag. identifier is the named export, so don't provide it if the tag function is imported as default.\n       */\n      modules?: Array<{\n        /**\n         * @description the name of the NPM package name you wish to look for\n         */\n        name: string;\n        /**\n         * @description the tag identifier name you wish to look for\n         */\n        identifier?: string;\n      }>;\n      /**\n       * @description Configures the magic GraphQL comments to look for. The default is `GraphQL`.\n       */\n      gqlMagicComment?: string;\n      /**\n       * @description Overrides the name of the default GraphQL name identifier.\n       */\n      globalIdentifier?: string;\n      /**\n       * @description Allows to use a global identifier instead of a module import.\n       */\n      globalGqlIdentifierName?: string | string[];\n    };\n    /**\n     * @description Specifies scripts to run when events are happening in the codegen core.\n     * Hooks defined on that level will effect all output files.\n     *\n     * For more details: https://graphql-code-generator.com/docs/config-reference/lifecycle-hooks\n     */\n    hooks?: Partial<LifecycleHooksDefinition>;\n    /**\n     * @description Alows to raise errors if any matched files are not valid GraphQL. Default: false.\n     */\n    noSilentErrors?: boolean;\n    /**\n     * @description If `true`, write to files whichever `generates` block succeeds. If `false`, one failed `generates` means no output is written to files. Default: false\n     */\n    allowPartialOutputs?: boolean;\n  }\n\n  export type ComplexPluginOutput<M = Record<string, unknown>> = {\n    content: string;\n    prepend?: string[];\n    append?: string[];\n    meta?: M;\n  };\n  export type PluginOutput = string | ComplexPluginOutput;\n  export type HookFunction = (...args: any[]) => void | Promise<void>;\n  export type HookAlterFunction = (...args: any[]) => void | string | Promise<void | string>;\n\n  export type LifeCycleHookValue = string | HookFunction | (string | HookFunction)[];\n  export type LifeCycleAlterHookValue =\n    | string\n    | HookFunction\n    | HookAlterFunction\n    | (string | HookFunction | HookAlterFunction)[];\n\n  /**\n   * @description All available lifecycle hooks\n   * @additionalProperties false\n   */\n  export type LifecycleHooksDefinition = {\n    /**\n     * @description Triggered with no arguments when the codegen starts (after the `codegen.yml` has beed parsed).\n     *\n     * Specify a shell command to run.\n     */\n    afterStart: LifeCycleHookValue;\n    /**\n     * @description Triggered with no arguments, right before the codegen closes, or when watch mode is stopped.\n     *\n     * Specify a shell command to run.\n     */\n    beforeDone: LifeCycleHookValue;\n    /**\n     * @description Triggered every time a file changes when using watch mode.\n     * Triggered with two arguments: the type of the event (for example, `changed`) and the path of the file.\n     */\n    onWatchTriggered: LifeCycleHookValue;\n    /**\n     * @description Triggered in case of a general error in the codegen. The argument is a string containing the error.\n     */\n    onError: LifeCycleHookValue;\n    /**\n     * @description Triggered after a file is written to the file-system. Executed with the path for the file.\n     * If the content of the file hasn't changed since last execution - this hooks won't be triggered.\n     *\n     * > This is a very useful hook, you can use it for integration with Prettier or other linters.\n     */\n    afterOneFileWrite: LifeCycleHookValue;\n    /**\n     * @description Executed after writing all the files to the file-system.\n     * Triggered with multiple arguments - paths for all files.\n     */\n    afterAllFileWrite: LifeCycleHookValue;\n    /**\n     * @description Triggered before a file is written to the file-system.\n     * Executed with the path and content for the file.\n     *\n     * Returning a string will override the content of the file.\n     *\n     * If the content of the file hasn't changed since last execution - this hooks won't be triggered.\n     */\n    beforeOneFileWrite: LifeCycleAlterHookValue;\n    /**\n     * @description Executed after the codegen has done creating the output and before writing the files to the file-system.\n     *\n     * Triggered with multiple arguments - paths for all relevant files.\n     *\n     * > Not all the files will be actually written to the file-system, because this is triggered before checking if the file has changed since last execution.\n     */\n    beforeAllFileWrite: LifeCycleHookValue;\n  };\n\n  export type SkipDocumentsValidationOptions =\n    | {\n        /**\n         * @description Allows you to skip specific rules while validating the documents.\n         * See all the rules; https://github.com/graphql/graphql-js/tree/main/src/validation/rules\n         */\n        ignoreRules?: string[];\n        /**\n         * @description Ignore duplicate documents validation\n         */\n        skipDuplicateValidation?: boolean;\n        /**\n         * @description Skip document validation entirely against the schema\n         */\n        skipValidationAgainstSchema?: boolean;\n      }\n    | boolean;\n\n  export type DocumentTransformFunction<Config = object> = (options: {\n    documents: Types.DocumentFile[];\n    schema: DocumentNode;\n    config: Config;\n    pluginContext?: { [key: string]: any };\n  }) => Types.Promisable<Types.DocumentFile[]>;\n\n  export type DocumentTransformObject<T = object> = {\n    transform: DocumentTransformFunction<T>;\n  };\n\n  export type DocumentTransformFileName = string;\n  export type DocumentTransformFileConfig<T = object> = { [name: DocumentTransformFileName]: T };\n  export type DocumentTransformFile<T> = DocumentTransformFileName | DocumentTransformFileConfig<T>;\n\n  export type OutputDocumentTransform<T = object> = DocumentTransformObject<T> | DocumentTransformFile<T>;\n  export type ConfiguredDocumentTransform<T = object> = {\n    name: string;\n    transformObject: DocumentTransformObject<T>;\n    config?: T;\n  };\n}\n\nexport function isComplexPluginOutput(obj: Types.PluginOutput): obj is Types.ComplexPluginOutput {\n  return typeof obj === 'object' && Object.prototype.hasOwnProperty.call(obj, 'content');\n}\n\nexport type PluginFunction<T = any, TOutput extends Types.PluginOutput = Types.PluginOutput> = (\n  schema: GraphQLSchema,\n  documents: Types.DocumentFile[],\n  config: T,\n  info?: {\n    outputFile?: string;\n    allPlugins?: Types.ConfiguredPlugin[];\n    pluginContext?: { [key: string]: any };\n    [key: string]: any;\n  }\n) => Types.Promisable<TOutput>;\n\nexport type PluginValidateFn<T = any> = (\n  schema: GraphQLSchema,\n  documents: Types.DocumentFile[],\n  config: T,\n  outputFile: string,\n  allPlugins: Types.ConfiguredPlugin[],\n  pluginContext?: { [key: string]: any }\n) => Types.Promisable<void>;\n\nexport type AddToSchemaResult = string | DocumentNode | undefined;\n\nexport interface CodegenPlugin<T = any> {\n  plugin: PluginFunction<T>;\n  addToSchema?: AddToSchemaResult | ((config: T) => AddToSchemaResult);\n  validate?: PluginValidateFn;\n}\n"
  },
  {
    "path": "packages/utils/plugins-helpers/src/typings.d.ts",
    "content": "declare module 'import-from';\n"
  },
  {
    "path": "packages/utils/plugins-helpers/src/utils.ts",
    "content": "import { GraphQLList, GraphQLNamedType, GraphQLNonNull, GraphQLOutputType, isListType, isNonNullType } from 'graphql';\nimport { Types } from './types.js';\n\nexport function mergeOutputs(content: Types.PluginOutput | Array<Types.PluginOutput>): string {\n  const result: Types.ComplexPluginOutput = { content: '', prepend: [], append: [] };\n\n  if (Array.isArray(content)) {\n    for (const item of content) {\n      if (typeof item === 'string') {\n        result.content += item;\n      } else {\n        result.content += item.content;\n        result.prepend.push(...(item.prepend || []));\n        result.append.push(...(item.append || []));\n      }\n    }\n  }\n\n  return [...result.prepend, result.content, ...result.append].join('\\n');\n}\n\nexport function isWrapperType(t: GraphQLOutputType): t is GraphQLNonNull<any> | GraphQLList<any> {\n  return isListType(t) || isNonNullType(t);\n}\n\nexport function getBaseType(type: GraphQLOutputType): GraphQLNamedType {\n  if (isWrapperType(type)) {\n    return getBaseType(type.ofType);\n  }\n  return type;\n}\n\nexport function removeNonNullWrapper(type: GraphQLOutputType): GraphQLOutputType {\n  return isNonNullType(type) ? type.ofType : type;\n}\n"
  },
  {
    "path": "packages/utils/plugins-helpers/tests/fixtures/externalModuleFn.js",
    "content": "export const test = 'foobar';\n"
  },
  {
    "path": "packages/utils/plugins-helpers/tests/is-using-types.spec.ts",
    "content": "import { buildSchema, parse } from 'graphql';\nimport { isUsingTypes } from '../src/helpers.js';\n\ndescribe('isUsingTypes', () => {\n  describe('Issues', () => {\n    it('#3248 - error on missing field on type', () => {\n      const schema = buildSchema(/* GraphQL */ `\n        scalar ObjectId\n\n        type UserTypeA {\n          _id: ObjectId!\n        }\n\n        type UserTypeB {\n          _id: ObjectId!\n        }\n\n        union User = UserTypeA | UserTypeB\n\n        interface Request {\n          _id: ObjectId!\n          foo: User\n          barRequired: User!\n        }\n\n        type ARequest implements Request {\n          _id: ObjectId!\n          foo: User\n          barRequired: User!\n        }\n\n        type BRequest implements Request {\n          _id: ObjectId!\n          foo: User\n          barRequired: User!\n        }\n\n        type Query {\n          allRequests: [Request!]!\n          nodes: [Node!]!\n        }\n\n        interface Node {\n          id: ID!\n          s: NodeSelection\n        }\n\n        type NodeSelection {\n          foo: String\n        }\n\n        type A implements Node {\n          id: ID!\n          s: NodeSelection\n          a: String\n          b: AInner\n        }\n\n        type AInner {\n          id: ID!\n          inner: AInner2\n        }\n\n        type AInner2 {\n          f: String\n        }\n      `);\n      const ast = parse(/* GraphQL */ `\n        query AllRequests {\n          nodes {\n            id\n            s {\n              foo\n            }\n            ... on A {\n              a\n              b {\n                id\n                inner {\n                  f\n                }\n              }\n            }\n          }\n          allRequests {\n            _id\n\n            foo {\n              ... on UserTypeA {\n                _id\n              }\n              ... on UserTypeB {\n                _id\n              }\n            }\n\n            barRequired {\n              ... on UserTypeA {\n                _id\n              }\n              ... on UserTypeB {\n                _id\n              }\n            }\n          }\n        }\n      `);\n\n      expect(isUsingTypes(ast, [], schema)).toBeTruthy();\n    });\n\n    it('#3217 - complex selection set causes issues with incorrect parent type', () => {\n      const schema = buildSchema(/* GraphQL */ `\n        type BrazilianCompany {\n          _id: ID!\n          ratings: [BrazilianCompanyRating!]!\n          chiefExecutiveOfficer: String!\n          financials: BrazilianCompanyFinancials!\n        }\n\n        type BrazilianCompanyFinancials {\n          template: BrazilianCompanyFinancialsTemplate!\n        }\n\n        enum BrazilianCompanyFinancialsTemplate {\n          BANK\n          COMPANY\n          INSURER\n        }\n\n        type GlassdoorRating {\n          linkHref: String!\n          overallRating: Float!\n          reviewsCount: Int!\n          recommendToFriend: Int!\n          dateOfReference: String!\n        }\n\n        type ReclameAquiRating {\n          linkHref: String!\n          humanReadablePeriod: String\n          classification: String\n          score: Float\n          formattedScore: String\n        }\n\n        union BrazilianCompanyRating = GlassdoorRating | ReclameAquiRating\n\n        type Query {\n          assetById(id: String!): Asset\n        }\n\n        union Asset = BrazilianCompany\n      `);\n      const ast = parse(/* GraphQL */ `\n        query AssetById($id: String!) {\n          assetById(id: $id) {\n            __typename\n            ... on BrazilianCompany {\n              ...BrazilianCompanyTopLevel\n            }\n          }\n        }\n\n        fragment BrazilianCompanyTopLevel on BrazilianCompany {\n          _id\n          ratings {\n            ... on ReclameAquiRating {\n              linkHref\n              humanReadablePeriod\n              classification\n              score\n              formattedScore\n            }\n            ... on GlassdoorRating {\n              linkHref\n              overallRating\n            }\n          }\n          chiefExecutiveOfficer\n          financials {\n            template\n          }\n        }\n      `);\n\n      expect(isUsingTypes(ast, [], schema)).toBeTruthy();\n    });\n  });\n\n  it('Should work with __typename on fragments', () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type Query {\n        user(id: ID!): User!\n      }\n\n      type User {\n        id: ID!\n        username: String!\n        email: String!\n      }\n    `);\n    const ast = parse(/* GraphQL */ `\n      fragment User on User {\n        __typename\n      }\n    `);\n\n    expect(isUsingTypes(ast, [], schema)).toBeFalsy();\n  });\n\n  it('Should include fragments when they are not extenral', () => {\n    const ast = parse(/* GraphQL */ `\n      fragment UserFields on User {\n        id\n      }\n\n      query user {\n        ...UserFields\n      }\n    `);\n\n    expect(isUsingTypes(ast, [], null)).toBeTruthy();\n  });\n\n  it('Should ignore fragments when they are extenral', () => {\n    const ast = parse(/* GraphQL */ `\n      fragment UserFields on User {\n        id\n      }\n\n      query user {\n        ...UserFields\n      }\n    `);\n\n    expect(isUsingTypes(ast, ['UserFields'], null)).toBeFalsy();\n  });\n\n  it('Should includes types import when fragment spread is used over an optional field', () => {\n    const schema = buildSchema(/* GraphQL */ `\n      interface Node {\n        id: ID!\n      }\n\n      type User implements Node {\n        id: ID!\n        login: String!\n        name: String\n      }\n\n      type Query {\n        user: User\n      }\n    `);\n    const ast = parse(/* GraphQL */ `\n      query getUser {\n        user {\n          ...user\n        }\n      }\n\n      fragment user on User {\n        id\n      }\n    `);\n\n    expect(isUsingTypes(ast, ['user'], schema)).toBeTruthy();\n  });\n\n  it('Should includes types correctly', () => {\n    const schema = buildSchema(/* GraphQL */ `\n      type User {\n        id: ID!\n        profile: Profile\n      }\n\n      type Profile {\n        name: String\n      }\n\n      type Query {\n        user: User\n      }\n    `);\n    const ast = parse(/* GraphQL */ `\n      query getUser {\n        user {\n          id\n          profile {\n            name\n          }\n        }\n      }\n    `);\n\n    expect(isUsingTypes(ast, ['user'], schema)).toBeTruthy();\n  });\n\n  it('Should includes types correctly when used in fragment', () => {\n    const schema = buildSchema(/* GraphQL */ `\n      interface Node {\n        id: ID!\n      }\n\n      type User implements Node {\n        id: ID!\n        login: String!\n        name: String\n\n        pictures(limit: Int!): PictureConnection!\n      }\n\n      type PictureConnection {\n        nodes: [Picture]!\n      }\n\n      type Picture {\n        size: Int!\n        url: String!\n      }\n\n      type Query {\n        user: User\n      }\n    `);\n    const ast = parse(/* GraphQL */ `\n      fragment pictures on User {\n        pictures(limit: 10) {\n          nodes {\n            ...picture\n          }\n        }\n      }\n\n      fragment picture on Picture {\n        size\n        url\n      }\n    `);\n\n    expect(isUsingTypes(ast, ['picture'], schema)).toBeTruthy();\n  });\n});\n"
  },
  {
    "path": "packages/utils/plugins-helpers/tests/resolve-external-module-and-fn.spec.ts",
    "content": "import path from 'path';\nimport { resolveExternalModuleAndFn } from '../src/resolve-external-module-and-fn.js';\n\ndescribe('resolveExternalModuleAndFn', () => {\n  describe('Issues', () => {\n    it('#6553 - Cannot find module', () => {\n      const relativePathToSelf = path.relative(process.cwd(), path.join(__dirname, './fixtures/externalModuleFn.js'));\n      expect(resolveExternalModuleAndFn('./' + relativePathToSelf + '#test')).toBe('foobar');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/utils/plugins-helpers/vitest.config.ts",
    "content": "import { defineProject, mergeConfig } from 'vitest/config';\nimport { sharedConfig } from '../../../vitest.config.js';\n\nexport default mergeConfig(\n  sharedConfig,\n  defineProject({\n    test: {\n      name: 'plugin-helpers',\n      include: ['**/*.spec.ts'],\n    },\n  })\n);\n"
  },
  {
    "path": "patches/typescript-json-schema+0.56.0.patch",
    "content": "diff --git a/node_modules/typescript-json-schema/dist/typescript-json-schema.js b/node_modules/typescript-json-schema/dist/typescript-json-schema.js\nindex d5aa7f7..b5f0978 100644\n--- a/node_modules/typescript-json-schema/dist/typescript-json-schema.js\n+++ b/node_modules/typescript-json-schema/dist/typescript-json-schema.js\n@@ -302,6 +302,8 @@ var annotationKeywords = {\n     description: true,\n     default: true,\n     examples: true,\n+    // https://github.com/YousefED/typescript-json-schema/issues/431\n+    exampleMarkdown: true,\n     $ref: true,\n };\n var subDefinitions = {\n"
  },
  {
    "path": "prettier.config.cjs",
    "content": "/* eslint-disable import/no-extraneous-dependencies */\nconst { plugins, ...prettierConfig } = require('@theguild/prettier-config');\n\nmodule.exports = {\n  ...prettierConfig,\n  plugins: [\n    ...plugins,\n    // `prettier-plugin-svelte` and `svelte` packages used for formatting ```svelte code blocks in md/mdx files\n    require('prettier-plugin-svelte'),\n    // Sort classes in website\n    require('prettier-plugin-tailwindcss'),\n  ],\n  tailwindConfig: './website/tailwind.config.ts',\n};\n"
  },
  {
    "path": "renovate.json",
    "content": "{\n  \"extends\": [\"github>the-guild-org/shared-config:renovate\"],\n  \"automerge\": true,\n  \"major\": {\n    \"automerge\": false\n  },\n  \"lockFileMaintenance\": {\n    \"enabled\": true,\n    \"automerge\": true\n  },\n  \"lockFileMaintenance\": {\n    \"enabled\": true,\n    \"automerge\": true\n  },\n  \"packageRules\": [\n    {\n      \"excludePackagePatterns\": [\n        \"@changesets/*\",\n        \"typescript\",\n        \"^@theguild/\",\n        \"next\",\n        \"tailwindcss\",\n        \"@whatwg-node/*\",\n        \"graphql-jit\",\n        \"husky\",\n        \"@types/lz-string\",\n        \"swc*\"\n      ],\n      \"matchPackagePatterns\": [\"*\"],\n      \"matchUpdateTypes\": [\"minor\", \"patch\"],\n      \"groupName\": \"all non-major dependencies\",\n      \"groupSlug\": \"all-minor-patch\"\n    }\n  ]\n}\n"
  },
  {
    "path": "scripts/fix-bin.js",
    "content": "/* eslint-disable import/no-extraneous-dependencies */\n// @ts-check\nconst fs = require('fs-extra');\nconst path = require('path');\nconst fg = require('fast-glob');\n\nconst absoluteBinPath = path.resolve(__dirname, '../packages/graphql-codegen-cli/dist/cjs/bin.js');\nconst packageDirectories = fg\n  .sync(['examples/**/package.json'], { ignore: ['**/node_modules/**'] })\n  .map(p => path.dirname(p));\npackageDirectories.push('website');\n\nfor (const dirname of packageDirectories) {\n  const absolutePath = path.join(__dirname, '..', dirname);\n  if (fs.lstatSync(absolutePath).isDirectory()) {\n    const execNames = ['graphql-codegen', 'graphql-codegen-esm'];\n    for (const execName of execNames) {\n      const targetPath = path.join(absolutePath, 'node_modules', '.bin', execName);\n      try {\n        fs.ensureSymlinkSync(absoluteBinPath, targetPath);\n        fs.chmodSync(targetPath, '755');\n        const targetCmdPath = targetPath + '.cmd';\n        fs.writeFileSync(\n          targetCmdPath,\n          `\n@IF EXIST \"%~dp0\\\\node.exe\" (\n  \"%~dp0\\\\node.exe\"  \"${absoluteBinPath}\" %*\n) ELSE (\n  @SETLOCAL\n  @SET PATHEXT=%PATHEXT:;.JS;=;%\n  node  \"${absoluteBinPath}\" %*\n)\n            `\n        );\n        fs.chmodSync(targetCmdPath, '755');\n      } catch {\n        /* ignore symlink that already exist */\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "scripts/match-graphql.js",
    "content": "const { writeFileSync } = require('fs');\nconst { resolve } = require('path');\nconst { argv, cwd } = require('process');\n\nconst pkgPath = resolve(cwd(), './package.json');\n\nconst pkg = require(pkgPath);\n\nconst version = argv[2];\n\npkg.resolutions ||= {};\nif (pkg.devDependencies.graphql?.startsWith(version)) {\n  // eslint-disable-next-line no-console\n  console.info(`GraphQL v${version} is match! Skipping.`);\n  return;\n}\n\nconst npmVersion = version.includes('-') ? version : `^${version}`;\npkg.devDependencies.graphql = npmVersion;\npkg.resolutions.graphql = npmVersion;\n\nwriteFileSync(pkgPath, JSON.stringify(pkg, null, 2), 'utf8');\n"
  },
  {
    "path": "scripts/print-example-ci-command.js",
    "content": "/* eslint-disable import/no-extraneous-dependencies, no-console */\nconst fs = require('fs-extra');\nconst fg = require('fast-glob');\n\nconst packageJSON = fg.sync(['examples/**/package.json'], { ignore: ['**/node_modules/**'] });\n\nconst ignoredPackages = [];\n\nconst exampleTypeMap = {\n  all: 'all',\n  swc: 'swc',\n  normal: 'normal',\n};\nconst exampleType = exampleTypeMap[process.env.EXAMPLE_TYPE] || 'all';\n\nconst result = packageJSON.reduce(\n  (res, packageJSONPath) => {\n    const { name, devDependencies } = fs.readJSONSync(packageJSONPath);\n\n    if (ignoredPackages.includes(name)) {\n      res.ignored.push(name);\n      return res;\n    }\n\n    if (\n      (exampleType === 'swc' && !devDependencies['@graphql-codegen/client-preset-swc-plugin']) ||\n      (exampleType === 'normal' && devDependencies['@graphql-codegen/client-preset-swc-plugin'])\n    ) {\n      res.ignored.push(name);\n      return res;\n    }\n\n    res.commands.push(`yarn workspace ${name} run ${process.argv[2]}`);\n    return res;\n  },\n  { ignored: [], commands: [] }\n);\n\nif (result.ignored.length > 0) {\n  result.commands.push(`echo \"Ignored packages: ${result.ignored.join(',')}\"`);\n}\n\nconsole.log(result.commands.join(' && '));\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"incremental\": true,\n    \"baseUrl\": \".\",\n    \"outDir\": \"dist\",\n    \"rootDir\": \"packages\",\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"importHelpers\": true,\n    \"experimentalDecorators\": true,\n    \"module\": \"esnext\",\n    \"target\": \"es2022\",\n    \"lib\": [\"es6\", \"esnext\", \"es2023\", \"dom\"],\n    \"moduleResolution\": \"node\",\n    \"emitDecoratorMetadata\": true,\n    \"sourceMap\": true,\n    \"declaration\": true,\n    \"noImplicitThis\": true,\n    \"alwaysStrict\": true,\n    \"noImplicitReturns\": true,\n    \"noUnusedLocals\": true,\n    \"resolveJsonModule\": true,\n    \"skipLibCheck\": true,\n    \"paths\": {\n      \"@graphql-codegen/cli\": [\"packages/graphql-codegen-cli/src/index.ts\"],\n      \"@graphql-codegen/core\": [\"packages/graphql-codegen-core/src/index.ts\"],\n      \"@graphql-codegen/add\": [\"packages/plugins/other/add/src/index.ts\"],\n      \"@graphql-codegen/fragment-matcher\": [\"packages/plugins/other/fragment-matcher/src/index.ts\"],\n      \"@graphql-codegen/introspection\": [\"packages/plugins/other/introspection/src/index.ts\"],\n      \"@graphql-codegen/schema-ast\": [\"packages/plugins/other/schema-ast/src/index.ts\"],\n      \"@graphql-codegen/time\": [\"packages/plugins/other/time/src/index.ts\"],\n      \"@graphql-codegen/visitor-plugin-common\": [\"packages/plugins/other/visitor-plugin-common/src/index.ts\"],\n      \"@graphql-codegen/typescript-document-nodes\": [\"packages/plugins/typescript/document-nodes/src/index.ts\"],\n      \"@graphql-codegen/typescript-operations\": [\"packages/plugins/typescript/operations/src/index.ts\"],\n      \"@graphql-codegen/typescript-resolvers\": [\"packages/plugins/typescript/resolvers/src/index.ts\"],\n      \"@graphql-codegen/typed-document-node\": [\"packages/plugins/typescript/typed-document-node/src/index.ts\"],\n      \"@graphql-codegen/gql-tag-operations\": [\"packages/plugins/typescript/gql-tag-operations/src/index.ts\"],\n      \"@graphql-codegen/typescript\": [\"packages/plugins/typescript/typescript/src/index.ts\"],\n      \"@graphql-codegen/testing\": [\"packages/utils/graphql-codegen-testing/src/index.ts\"],\n      \"@graphql-codegen/plugin-helpers\": [\"packages/utils/plugins-helpers/src/index.ts\"]\n    }\n  },\n  \"include\": [\"packages\"],\n  \"exclude\": [\n    \"**/dist\",\n    \"**/temp\",\n    \"**/vitest.config.ts\",\n    \"**/vitest.setup.ts\",\n    \"**/*.spec.ts\",\n    \"**/tests/**/*.ts\",\n    \"**/tests/test-files\",\n    \"**/tests/test-documents\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"./tsconfig.spec.json\"\n    }\n  ]\n}\n"
  },
  {
    "path": "tsconfig.spec.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"rootDir\": \".\",\n    \"composite\": true,\n    \"types\": [\"vitest/globals\"]\n  },\n  \"exclude\": [],\n  \"include\": [\n    \"**/vitest.config.ts\",\n    \"**/vitest.setup.ts\",\n    \"**/*.spec.ts\",\n    \"**/tests/**/*.ts\",\n    \"**/tests/test-files\",\n    \"**/tests/test-documents\"\n  ]\n}\n"
  },
  {
    "path": "vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport tsconfigPaths from 'vite-tsconfig-paths';\n\nexport const sharedConfig = defineConfig({\n  plugins: [tsconfigPaths() as any],\n  resolve: {\n    alias: {\n      graphql: 'graphql/index.js',\n    },\n  },\n  test: {\n    globals: true,\n  },\n});\n\nexport default defineConfig({\n  test: {\n    projects: ['packages/**/vitest.config.ts', 'examples/**/vitest.config.ts'],\n    watch: false,\n  },\n});\n"
  },
  {
    "path": "website/.gitignore",
    "content": "# NPM packages info fetched before building.\n# Without this, every page build process will hit NPM and may get rate limited.\n# Run `yarn generate-packages-info` to regenerate.\nsrc/lib/packages-info.generated.ts\n"
  },
  {
    "path": "website/README.md",
    "content": "# Website\n\nThis website is built using NextJS\n\n## Installation\n\nRun `yarn` from the root directory\n\n## Building the app\n\nRun `yarn build` from the root directory\n\n## Local Development\n\n```sh\nyarn dev\n```\n\nThis command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server.\n"
  },
  {
    "path": "website/next-env.d.ts",
    "content": "/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information.\n"
  },
  {
    "path": "website/next-sitemap.config.js",
    "content": "/** @type {import('next-sitemap').IConfig} */\nexport default {\n  siteUrl: process.env.SITE_URL || 'https://the-guild.dev/graphql/codegen',\n  generateIndexSitemap: false,\n  exclude: ['*/_meta'],\n  output: 'export',\n};\n"
  },
  {
    "path": "website/next.config.js",
    "content": "import { withGuildDocs } from '@theguild/components/next.config';\nimport { CategoryToPackages } from './src/category-to-packages.mjs';\n\nconst PLUGINS_REDIRECTS = Object.entries(CategoryToPackages).flatMap(([category, packageNames]) =>\n  packageNames.map(packageName => [`/plugins/${packageName}`, `/plugins/${category}/${packageName}`])\n);\n\nexport default withGuildDocs({\n  nextraConfig: {\n    autoImportThemeStyle: false,\n  },\n  output: 'export',\n  experimental: {\n    urlImports: [\n      'https://graphql-modules.com/assets/subheader-logo.svg',\n      'https://pbs.twimg.com/profile_images/1004185780313395200/ImZxrDWf_400x400.jpg',\n      'https://raw.githubusercontent.com/mswjs/msw/HEAD/media/msw-logo.svg',\n    ],\n  },\n  typescript: {\n    // Todo: remove it before merge to master\n    ignoreBuildErrors: true,\n  },\n  webpack(config, meta) {\n    config.resolve.fallback = {\n      ...config.resolve.fallback,\n      module: false,\n    };\n    return config;\n  },\n  redirects: () =>\n    Object.entries({\n      '/live-demo': '/',\n      '/docs/presets/presets-index': '/plugins',\n      '/docs/guides': '/docs/guides/react',\n      '/docs/plugins/typescript-server': '/plugins/typescript/typescript-resolvers',\n      '/docs/react': '/docs/guides/react',\n      '/docs/guides/react-vue-angular': '/docs/guides/react-vue',\n      '/docs/guides/front-end-typescript-only': '/docs/guides/react-vue',\n      '/plugins/other': '/plugins',\n      '/plugins/c-sharp': '/plugins/c-sharp/c-sharp-operations',\n      '/docs/integrations': '/plugins',\n      '/docs/advanced': '/docs/advanced/generated-files-colocation',\n      '/plugins/java-installation': '/plugins/java/java',\n      '/docs/plugins/c-sharp': '/plugins/c-sharp/c-sharp-operations',\n      '/plugins/dart/flutter': '/plugins/dart/flutter-freezed',\n      '/docs/getting-started/programmatic-usage': '/docs/advanced/programmatic-usage',\n      '/docs/tags': '/docs/getting-started',\n      '/docs': '/docs/getting-started',\n      '/docs/plugins': '/plugins',\n      '/docs/generated-config/base-documents-visitor': '/plugins',\n      '/docs/config-reference': '/docs/config-reference/codegen-config',\n      '/docs/config-reference/': '/docs/config-reference/codegen-config',\n      '/plugins/flow': '/plugins/flow/flow-operations',\n      '/plugins/typescript-common': '/plugins/typescript/typescript',\n      '/plugins/other/typescript-operations': '/plugins/typescript/typescript-operations',\n      '/plugins/typescript-urql-graphcache': '/plugins/typescript/typescript-urql',\n      '/plugins/typescript/typescript-urql-graphcache': '/plugins/typescript/typescript-urql',\n      '/docs/generated-config/:presetName-preset': '/plugins/:presetName-preset',\n      '/docs/generated-config/:pluginName': '/plugins/:pluginName',\n      '/docs/custom-codegen/write-your-plugin': '/docs/custom-codegen',\n      '/plugins/typescript': '/plugins/typescript/typescript',\n      '/docs/plugins/typescript-common': '/plugins/typescript/typescript',\n      '/docs/presets/:presetName': '/plugins/:presetName-preset',\n      '/docs/plugins/:pluginName': '/plugins/:pluginName',\n      '/docs/plugins/client-note': '/plugins',\n      '/docs/getting-started/config-reference/codegen-config': '/docs/config-reference/codegen-config',\n      '/docs/getting-started/codegen-config': '/docs/config-reference/codegen-config',\n      '/docs/getting-started/documents-field': '/docs/config-reference/documents-field',\n      '/docs/getting-started/schema-field': '/docs/config-reference/schema-field',\n      '/docs/getting-started/config-field': '/docs/config-reference/config-field',\n      '/docs/getting-started/lifecycle-hooks': '/docs/config-reference/lifecycle-hooks',\n      '/docs/getting-started/require-field': '/docs/config-reference/require-field',\n      '/docs/getting-started/naming-convention': '/docs/config-reference/naming-convention',\n      '/docs/getting-started/how-does-it-work': '/docs/advanced/how-does-it-work',\n      '/docs/guides/react': '/docs/guides/react-vue',\n      '/docs/guides/vue': '/docs/guides/react-vue',\n      '/plugins/typescript-svelte-urql': '/plugins',\n      '/plugins/presets': '/plugins',\n      '/docs/getting-startedinstallation': '/docs/getting-started',\n      '/docs/plugins/typescript-graphql-requesttypescript-graphql-request':\n        '/plugins/typescript/typescript-graphql-request',\n      '/plugins/typescript/fragment-matcher': '/plugins/other/fragment-matcher',\n      '/plugins/core': '/plugins',\n      '/plugins/dart': '/plugins',\n      '/docs/presets': '/plugins',\n      '/home': '/',\n      '/plugins/presets/client': '/docs/guides/react-vue',\n      '/plugins/presets/client-preset': '/docs/guides/react-vue',\n      '/plugins/typescript/add': '/plugins/other/add',\n      '/plugins/typescript/typescript-add': '/plugins/other/add',\n      '/docs/generated-config/base-visitor': '/docs/custom-codegen/using-visitor',\n      '/plugins/base-visitor': '/docs/custom-codegen/using-visitor',\n      '/plugins/typescript/instrospection': '/plugins/other/introspection',\n      '/docs/custom-codegen/using-handlebars': '/docs/custom-codegen',\n      '/plugins/presets/near-operation-file': '/plugins/presets/near-operation-file-preset',\n      '/plugins/typescript/near-operation-file': '/plugins/presets/near-operation-file-preset',\n      '/typescript/typescript-resolvers': '/plugins/typescript/typescript-resolvers',\n      '/docs/guides/graphql-cli': '/docs/migration/graphql-cli',\n      '/plugins/presets/gql-tag-operations-preset': '/plugins/presets/preset-client',\n      '/plugins/gql-tag-operations-preset': '/plugins/presets/preset-client',\n    })\n      .concat(PLUGINS_REDIRECTS)\n      .map(([from, to]) => ({\n        source: from,\n        destination: to,\n        permanent: true,\n      })),\n});\n"
  },
  {
    "path": "website/package.json",
    "content": "{\n  \"name\": \"website\",\n  \"version\": \"1.17.7\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"start\": \"next start\",\n    \"build\": \"yarn generate-packages-info && yarn generate-json-config && next build && next-sitemap\",\n    \"dev\": \"next\",\n    \"generate-json-config\": \"tsx scripts/generate-config-json-schema.ts\",\n    \"generate-packages-info\": \"tsx scripts/generate-packages-info.ts\"\n  },\n  \"devDependencies\": {\n    \"@theguild/tailwind-config\": \"0.6.4\",\n    \"@types/dedent\": \"0.7.2\",\n    \"@types/jsonpath\": \"0.2.4\",\n    \"@types/node\": \"22.10.7\",\n    \"@types/react\": \"18.3.3\",\n    \"fast-xml-parser\": \"5.4.2\",\n    \"jsonpath\": \"1.1.1\",\n    \"postcss-import\": \"^16.1.0\",\n    \"postcss-lightningcss\": \"^1.0.1\",\n    \"prettier-plugin-tailwindcss\": \"0.2.8\",\n    \"tailwindcss\": \"^3.4.14\",\n    \"semver\": \"7.7.3\",\n    \"@types/semver\": \"7.7.1\"\n  },\n  \"dependencies\": {\n    \"@graphql-codegen/add\": \"6.0.0\",\n    \"@graphql-codegen/c-sharp\": \"4.3.1\",\n    \"@graphql-codegen/c-sharp-operations\": \"2.3.1\",\n    \"@graphql-codegen/cli\": \"6.2.1\",\n    \"@graphql-codegen/client-preset\": \"5.2.4\",\n    \"@graphql-codegen/core\": \"5.0.1\",\n    \"@graphql-codegen/flow\": \"2.3.6\",\n    \"@graphql-codegen/flow-operations\": \"2.3.6\",\n    \"@graphql-codegen/flow-resolvers\": \"2.4.4\",\n    \"@graphql-codegen/flutter-freezed\": \"^3.0.1\",\n    \"@graphql-codegen/fragment-matcher\": \"6.0.0\",\n    \"@graphql-codegen/hasura-allow-list\": \"2.0.0\",\n    \"@graphql-codegen/import-types-preset\": \"2.2.6\",\n    \"@graphql-codegen/introspection\": \"5.0.1\",\n    \"@graphql-codegen/java\": \"3.3.6\",\n    \"@graphql-codegen/java-apollo-android\": \"2.3.6\",\n    \"@graphql-codegen/java-resolvers\": \"2.3.6\",\n    \"@graphql-codegen/jsdoc\": \"2.3.6\",\n    \"@graphql-codegen/kotlin\": \"2.3.6\",\n    \"@graphql-codegen/named-operations-object\": \"2.3.1\",\n    \"@graphql-codegen/near-operation-file-preset\": \"2.5.0\",\n    \"@graphql-codegen/schema-ast\": \"5.0.1\",\n    \"@graphql-codegen/time\": \"6.0.0\",\n    \"@graphql-codegen/typed-document-node\": \"6.1.7\",\n    \"@graphql-codegen/typescript\": \"5.0.9\",\n    \"@graphql-codegen/typescript-apollo-angular\": \"3.5.6\",\n    \"@graphql-codegen/typescript-apollo-client-helpers\": \"2.2.6\",\n    \"@graphql-codegen/typescript-generic-sdk\": \"3.1.0\",\n    \"@graphql-codegen/typescript-graphql-files-modules\": \"2.2.1\",\n    \"@graphql-codegen/typescript-graphql-request\": \"5.0.0\",\n    \"@graphql-codegen/typescript-mongodb\": \"2.4.6\",\n    \"@graphql-codegen/typescript-msw\": \"3.0.1\",\n    \"@graphql-codegen/typescript-nhost\": \"0.0.3\",\n    \"@graphql-codegen/typescript-operations\": \"5.0.9\",\n    \"@graphql-codegen/typescript-react-apollo\": \"3.3.7\",\n    \"@graphql-codegen/typescript-react-query\": \"4.1.0\",\n    \"@graphql-codegen/typescript-resolvers\": \"5.1.7\",\n    \"@graphql-codegen/typescript-rtk-query\": \"2.4.1\",\n    \"@graphql-codegen/typescript-stencil-apollo\": \"2.3.6\",\n    \"@graphql-codegen/typescript-type-graphql\": \"2.3.6\",\n    \"@graphql-codegen/typescript-urql\": \"3.7.3\",\n    \"@graphql-codegen/typescript-vue-apollo\": \"3.3.7\",\n    \"@graphql-codegen/typescript-vue-apollo-smart-ops\": \"2.3.6\",\n    \"@graphql-codegen/typescript-vue-urql\": \"2.3.6\",\n    \"@graphql-codegen/urql-introspection\": \"2.2.1\",\n    \"@mizdra/graphql-codegen-typescript-fabbrica\": \"^0.6.0\",\n    \"@monaco-editor/react\": \"4.6.0\",\n    \"@radix-ui/react-accordion\": \"^1.2.1\",\n    \"@radix-ui/react-icons\": \"^1.3.0\",\n    \"@theguild/components\": \"7.6.5\",\n    \"classnames\": \"2.5.1\",\n    \"date-fns\": \"4.1.0\",\n    \"dedent\": \"1.5.3\",\n    \"graphql\": \"16.9.0\",\n    \"js-yaml\": \"4.1.0\",\n    \"next\": \"14.2.35\",\n    \"next-mdx-remote\": \"5.0.0\",\n    \"next-sitemap\": \"4.2.3\",\n    \"postcss-nesting\": \"^13.0.1\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-markdown\": \"9.0.3\",\n    \"react-select\": \"5.8.0\",\n    \"typescript-json-schema\": \"0.56.0\"\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.2%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  }\n}\n"
  },
  {
    "path": "website/postcss.config.mjs",
    "content": "import config from '@theguild/tailwind-config/postcss.config';\n\nexport default {\n  ...config,\n  plugins: {\n    ...config.plugins,\n    'postcss-nesting': {},\n  },\n};\n"
  },
  {
    "path": "website/public/config.schema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"definitions\": {\n    \"Types.Config\": {\n      \"description\": \"Represents the root YAML schema for the config file.\",\n      \"additionalProperties\": false,\n      \"type\": \"object\",\n      \"properties\": {\n        \"schema\": {\n          \"$ref\": \"#/definitions/Types.InstanceOrArray\",\n          \"description\": \"A pointer(s) to your GraphQL schema. This schema will be the base schema for all your outputs.\\nYou can use one of the following:\\n\\n- URL pointing to a GraphQL endpoint\\n- Path to a local `.json` file\\n- Path to a local `.graphql` file\\n- Glob expression pointing to multiple `.graphql` files\\n- Path to a local code file (for example: `.js`) that exports `GraphQLSchema` object\\n- Inline string containing GraphQL SDL schema definition\\n\\nYou can specify either a single schema, or multiple, and GraphQL Code Generator will merge the schemas into a single schema.\\n\\nFor more details: https://graphql-code-generator.com/docs/config-reference/schema-field\"\n        },\n        \"require\": {\n          \"$ref\": \"#/definitions/Types.RequireExtension\",\n          \"description\": \"A path to a file which defines custom Node.JS require() handlers for custom file extensions.\\nThis is essential if the code generator has to go through files which require other files in an unsupported format (by default).\\n\\nFor more details: https://graphql-code-generator.com/docs/config-reference/require-field\\nSee more information about require.extensions: https://gist.github.com/jamestalmage/df922691475cff66c7e6.\\n\\nNote: values that specified in your .yml file will get loaded after loading the config .yml file.\"\n        },\n        \"customFetch\": {\n          \"description\": \"Specify a Node module name, a custom file, or a function, to be used instead of a standard `fetch`.\",\n          \"anyOf\": [\n            {\n              \"$ref\": \"#/definitions/Types.CustomSchemaFetcher\",\n              \"description\": \"A function to use for fetching the schema.\"\n            },\n            { \"type\": \"string\" }\n          ]\n        },\n        \"documents\": {\n          \"$ref\": \"#/definitions/Types.InstanceOrArray_1\",\n          \"description\": \"A pointer(s) to your GraphQL documents: query, mutation, subscription and fragment. These documents will be loaded into for all your output files.\\nYou can use one of the following:\\n\\n- Path to a local `.graphql` file\\n- Path to a code file (for example: `.js` or `.tsx`) containing GraphQL operation strings.\\n- Glob expression pointing to multiple `.graphql` files\\n- Glob expression pointing to multiple code files\\n- Inline string containing GraphQL SDL operation definition\\n\\nYou can specify either a single file, or multiple.\\n\\nFor more details: https://graphql-code-generator.com/docs/config-reference/documents-field\"\n        },\n        \"config\": {\n          \"type\": \"object\",\n          \"additionalProperties\": true,\n          \"description\": \"Configuration object containing key => value that will be passed to the plugins.\\nSpecifying configuration in this level of your configuration file will pass it to all plugins, in all outputs.\\n\\nThe options may vary depends on what plugins you are using.\\n\\nFor more details: https://graphql-code-generator.com/docs/config-reference/config-field\"\n        },\n        \"generates\": {\n          \"description\": \"A map where the key represents an output path for the generated code and the value represents a set of options which are relevant for that specific file.\\n\\nFor more details: https://graphql-code-generator.com/docs/config-reference/codegen-config\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"anyOf\": [\n              { \"type\": \"array\", \"items\": { \"$ref\": \"#/definitions/Types.ConfiguredPlugin\" } },\n              { \"$ref\": \"#/definitions/Types.ConfiguredOutput\" }\n            ]\n          }\n        },\n        \"overwrite\": {\n          \"description\": \"A flag to overwrite files if they already exist when generating code (`true` by default).\\n\\nFor more details: https://graphql-code-generator.com/docs/config-reference/codegen-config\",\n          \"type\": \"boolean\"\n        },\n        \"watch\": {\n          \"description\": \"A flag to trigger codegen when there are changes in the specified GraphQL schemas.\\n\\nYou can either specify a boolean to turn it on/off or specify an array of glob patterns to add custom files to the watch.\\n\\nFor more details: https://graphql-code-generator.com/docs/getting-started/development-workflow#watch-mode\",\n          \"anyOf\": [{ \"type\": \"array\", \"items\": { \"type\": \"string\" } }, { \"type\": [\"string\", \"boolean\"] }]\n        },\n        \"ignoreNoDocuments\": {\n          \"description\": \"A flag to suppress non-zero exit code when there are no documents to generate.\",\n          \"type\": \"boolean\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"A flag to disable adding `.js` extension to the output file. Default: `true`.\",\n          \"type\": \"boolean\"\n        },\n        \"importExtension\": {\n          \"description\": \"Append this extension to all imports.\\nUseful for ESM environments that require file extensions in import statements.\",\n          \"anyOf\": [\n            { \"type\": \"array\", \"items\": { \"type\": \"string\" } },\n            { \"enum\": [\"\"], \"type\": \"string\" }\n          ]\n        },\n        \"silent\": { \"description\": \"A flag to suppress printing errors when they occur.\", \"type\": \"boolean\" },\n        \"verbose\": { \"description\": \"A flag to output more detailed information about tasks\", \"type\": \"boolean\" },\n        \"debug\": { \"description\": \"A flag to output debug logs\", \"type\": \"boolean\" },\n        \"errorsOnly\": { \"description\": \"A flag to print only errors.\", \"type\": \"boolean\" },\n        \"pluginLoader\": {\n          \"$ref\": \"#/definitions/Types.PackageLoaderFn\",\n          \"description\": \"If you are using the programmatic API in a browser environment, you can override this configuration to load your plugins in a way different than require.\"\n        },\n        \"pluginContext\": {\n          \"description\": \"Additional context passed to plugins\",\n          \"type\": \"object\",\n          \"additionalProperties\": {}\n        },\n        \"pluckConfig\": {\n          \"description\": \"Allows you to override the configuration for `@graphql-tools/graphql-tag-pluck`, the tool that extracts your GraphQL operations from your code files.\\n\\nFor more details: https://graphql-code-generator.com/docs/config-reference/documents-field#graphql-tag-pluck\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"modules\": {\n              \"$ref\": \"#/definitions/Array\",\n              \"description\": \"An array of package name and identifier that will be used to track down your gql usages and imports. Use this if your code files imports gql from another library or you have a custom gql tag. identifier is the named export, so don't provide it if the tag function is imported as default.\"\n            },\n            \"gqlMagicComment\": {\n              \"description\": \"Configures the magic GraphQL comments to look for. The default is `GraphQL`.\",\n              \"type\": \"string\"\n            },\n            \"globalIdentifier\": {\n              \"description\": \"Overrides the name of the default GraphQL name identifier.\",\n              \"type\": \"string\"\n            },\n            \"globalGqlIdentifierName\": {\n              \"description\": \"Allows to use a global identifier instead of a module import.\",\n              \"anyOf\": [{ \"type\": \"array\", \"items\": { \"type\": \"string\" } }, { \"type\": \"string\" }]\n            }\n          }\n        },\n        \"hooks\": {\n          \"$ref\": \"#/definitions/Partial\",\n          \"description\": \"Specifies scripts to run when events are happening in the codegen core.\\nHooks defined on that level will effect all output files.\\n\\nFor more details: https://graphql-code-generator.com/docs/config-reference/lifecycle-hooks\"\n        },\n        \"noSilentErrors\": {\n          \"description\": \"Alows to raise errors if any matched files are not valid GraphQL. Default: false.\",\n          \"type\": \"boolean\"\n        },\n        \"allowPartialOutputs\": {\n          \"description\": \"If `true`, write to files whichever `generates` block succeeds. If `false`, one failed `generates` means no output is written to files. Default: false\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"FlutterFreezedPluginConfig\": {\n      \"description\": \"configure the `flutter-freezed` plugin\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"camelCasedEnums\": {\n          \"type\": \"{(boolean | DartIdentifierCasing)}\",\n          \"description\": \"Setting this option to `true` will camelCase enum values as required by Dart's recommended linter.\\n\\nIf set to false, the original casing as specified in the Graphql Schema is used\\n\\nYou can also transform the casing by specifying your preferred casing for Enum values.\\n\\nAvailable options are: `'snake_case'`, `'camelCase'` and `'PascalCase'`\\n\\nFor consistency, this option applies the same configuration to all Enum Types in the GraphQL Schema\\nDefault value: \\\"true\\\"\"\n        },\n        \"copyWith\": {\n          \"type\": \"{(boolean | TypeNamePattern)}\",\n          \"description\": \"The [`freezed`](https://pub.dev/packages/freezed) library has this option enabled by default.\\nUse this option to enable/disable this option completely.\\n\\nThe plugin by default generates immutable Freezed models using the `@freezed` decorator.\\n\\nIf this option is configured, the plugin will generate immutable Freezed models using the `@Freezed(copyWith: value)` instead.\\n\\nSetting a boolean value will enable/disable this option globally for every GraphQL Type\\nbut you can also set this option to `true` for one or more GraphQL Types using a `TypeNamePattern`.\\nDefault value: \\\"undefined\\\"\"\n        },\n        \"customScalars\": {\n          \"type\": \"{(Record<string, string>)}\",\n          \"description\": \"The `key` is the GraphQL Scalar Type and the `value` is the equivalent Dart Type\\n\\nThe plugin automatically handles built-in GraphQL Scalar Types so only specify the custom Scalars in your Graphql Schema.\\nDefault value: \\\"[object Object]\\\"\"\n        },\n        \"defaultValues\": {\n          \"type\": \"{([pattern: FieldNamePattern, value: string, appliesOn: AppliesOnParameters[]][])}\",\n          \"description\": \"This will annotate the generated parameter with a `@Default(value: defaultValue)` decorator.\\n\\nThe default value will be interpolated into the `@Default(value: ${value})` decorator so\\nUse backticks for the value element so that you can use quotation marks for string values.\\nE.g: `\\\"I'm a string default value\\\"` but `Episode.jedi` is not a string value.\\n\\nUse the `appliesOn` to specify where this option should be applied on\\nDefault value: \\\"undefined\\\"\"\n        },\n        \"deprecated\": {\n          \"type\": \"{([pattern: Pattern, appliesOn: (AppliesOnFactory | AppliesOnParameters)[]][])}\",\n          \"description\": \"Using a TypeNamePattern, you can mark an entire factory constructor for one or more GraphQL types as deprecated.\\n\\nLikewise, using a FieldNamePattern, you can mark one or more fields as deprecated\\n\\nSince the first element in the tuple has a type signature of `Pattern`,\\nyou can use either TypeNamePattern or FieldNamePattern or use both\\nby composing them with `Pattern.compose(...)`\\n\\nUse the `appliesOn` to specify which block this option should be applied on\\nDefault value: \\\"undefined\\\"\"\n        },\n        \"equal\": {\n          \"type\": \"{(boolean | TypeNamePattern)}\",\n          \"description\": \"The [`freezed`](https://pub.dev/packages/freezed) library has this option enabled by default.\\nUse this option to enable/disable this option completely.\\n\\nThe plugin by default generates immutable Freezed models using the `@freezed` decorator.\\n\\nIf this option is configured, the plugin will generate immutable Freezed models using the `@Freezed(equal: value)` instead.\\n\\nSetting a boolean value will enable/disable this option globally for every GraphQL Type\\nbut you can also set this option to `true` for one or more GraphQL Types using a `TypeNamePattern`.\\nDefault value: \\\"undefined\\\"\"\n        },\n        \"escapeDartKeywords\": {\n          \"type\": \"{(boolean | [pattern: Pattern, prefix?: string, suffix?: string, appliesOn?: AppliesOn[]][])}\",\n          \"description\": \"Wraps the fields names that are valid Dart keywords with the prefix and suffix given\\nDefault value: \\\"true\\\"\"\n        },\n        \"final\": {\n          \"type\": \"{([pattern: FieldNamePattern, appliesOn: AppliesOnParameters[]][])}\",\n          \"description\": \"This will mark the specified parameters as final\\nDefault value: \\\"undefined\\\"\"\n        },\n        \"ignoreTypes\": {\n          \"type\": \"{(TypeNamePattern)}\",\n          \"description\": \"names of GraphQL types to ignore when generating Freezed classes\\nDefault value: \\\"undefined\\\"\"\n        },\n        \"immutable\": {\n          \"type\": \"{(boolean | TypeNamePattern)}\",\n          \"description\": \"The [`freezed`](https://pub.dev/packages/freezed) library  by default generates immutable models decorated with the `@freezed` decorator.\\nThis option if set to `false` the plugin will generate mutable Freezed models using the `@unfreezed` decorator instead.\\n\\nSetting a boolean value will enable/disable this option globally for every GraphQL Type\\nbut you can also set this option to `true` for one or more GraphQL Types using a `TypeNamePattern`.\\nDefault value: \\\"undefined\\\"\"\n        },\n        \"makeCollectionsUnmodifiable\": {\n          \"type\": \"{(boolean | TypeNamePattern)}\",\n          \"description\": \"allows collections(lists/maps) to be modified even if class is immutable\\nDefault value: \\\"undefined\\\"\"\n        },\n        \"mergeTypes\": {\n          \"type\": \"{(Record<string, TypeName[]>)}\",\n          \"description\": \"maps over the value(array of typeNames) and transform each as a named factory constructor inside a class generated for the key(target GraphQL Object Type).\\nDefault value: \\\"undefined\\\"\"\n        },\n        \"mutableInputs\": {\n          \"description\": \"since inputs will be used to collect data, it makes sense to make them mutable with Freezed's `@unfreezed` decorator.\\n\\nThis overrides(in order words: has a higher precedence than) the `immutable` config value `ONLY` for GraphQL `input types`.\\nDefault value: \\\"true\\\"\",\n          \"anyOf\": [{ \"$ref\": \"#/definitions/TypeNamePattern\" }, { \"type\": \"boolean\" }]\n        },\n        \"privateEmptyConstructor\": {\n          \"description\": \"if true, defines a private empty constructor to allow getter and methods to work on the class\\nDefault value: \\\"true\\\"\",\n          \"anyOf\": [{ \"$ref\": \"#/definitions/TypeNamePattern\" }, { \"type\": \"boolean\" }]\n        },\n        \"unionClass\": {\n          \"description\": \"customize the key to be used for fromJson with multiple constructors\\nDefault value: \\\"undefined\\\"\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"array\",\n            \"items\": [\n              { \"$ref\": \"#/definitions/TypeNamePattern\" },\n              { \"type\": \"string\" },\n              { \"$ref\": \"#/definitions/UnionValueCase\" },\n              {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"array\",\n                  \"items\": [{ \"$ref\": \"#/definitions/TypeName\" }, { \"type\": \"string\" }],\n                  \"minItems\": 2,\n                  \"maxItems\": 2\n                }\n              }\n            ],\n            \"minItems\": 1,\n            \"maxItems\": 4\n          }\n        }\n      }\n    },\n    \"ReactQueryRawPluginConfig\": {\n      \"description\": \"This plugin generates `React-Query` Hooks with TypeScript typings.\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\\n\\n> **If you are using the `react-query` package instead of the `@tanstack/react-query` package in your project, please set the `legacyMode` option to `true`.**\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"fetcher\": {\n          \"description\": \"Customize the fetcher you wish to use in the generated file. React-Query is agnostic to the data-fetching layer, so you should provide it, or use a custom one.\\n\\nThe following options are available to use:\\n\\n- 'fetch' - requires you to specify endpoint and headers on each call, and uses `fetch` to do the actual http call.\\n- `{ endpoint: string, fetchParams: RequestInit }`: hardcode your endpoint and fetch options into the generated output, using the environment `fetch` method. You can also use `process.env.MY_VAR` as endpoint or header value.\\n- `file#identifier` - You can use custom fetcher method that should implement the exported `ReactQueryFetcher` interface. Example: `./my-fetcher#myCustomFetcher`.\\n- `graphql-request`: Will generate each hook with `client` argument, where you should pass your own `GraphQLClient` (created from `graphql-request`).\",\n          \"anyOf\": [\n            { \"$ref\": \"#/definitions/HardcodedFetch\" },\n            { \"type\": \"object\", \"properties\": { \"func\": { \"type\": \"string\" }, \"isReactHook\": { \"type\": \"boolean\" } } },\n            { \"type\": \"string\" }\n          ]\n        },\n        \"exposeDocument\": {\n          \"description\": \"For each generate query hook adds `document` field with a\\ncorresponding GraphQL query. Useful for `queryClient.fetchQuery`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"exposeQueryKeys\": {\n          \"description\": \"For each generate query hook adds getKey(variables: QueryVariables) function. Useful for cache updates. If addInfiniteQuery is true, it will also add a getKey function to each infinite query.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"exposeMutationKeys\": {\n          \"description\": \"For each generate mutation hook adds getKey() function. Useful for call outside of functional component.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"exposeFetcher\": {\n          \"description\": \"For each generate query hook adds `fetcher` field with a corresponding GraphQL query using the fetcher.\\nIt is useful for `queryClient.fetchQuery` and `queryClient.prefetchQuery`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"errorType\": {\n          \"description\": \"Changes the default \\\"TError\\\" generic type.\\nDefault value: \\\"unknown\\\"\",\n          \"type\": \"string\"\n        },\n        \"addInfiniteQuery\": {\n          \"description\": \"Adds an Infinite Query along side the standard one\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"legacyMode\": {\n          \"description\": \"If false, it will work with `@tanstack/react-query`, default value is true.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"documentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL operations variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL operations variables suffix.\\nDefault value: \\\"Document\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL fragments variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL fragments variables suffix.\\nDefault value: \\\"FragmentDoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"pureMagicComment\": {\n          \"description\": \"This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"optimizeDocumentNode\": {\n          \"description\": \"If you are using `documentNode: documentMode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\\nThis will remove all \\\"loc\\\" and \\\"description\\\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"RTKConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"importBaseApiFrom\": {\n          \"description\": \"Define where to import the base api to inject endpoints into\",\n          \"type\": \"string\"\n        },\n        \"importBaseApiAlternateName\": {\n          \"description\": \"Change the import name of the baseApi from default 'api'\\nDefault value: \\\"'api'\\\"\",\n          \"type\": \"string\"\n        },\n        \"exportHooks\": {\n          \"description\": \"Whether to export React Hooks from the generated api. Enable only when using the `\\\"@reduxjs/toolkit/query/react\\\"` import of `createApi`\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"overrideExisting\": {\n          \"description\": \"Sets the `overrideExisting` option, for example to allow for hot module reloading when running graphql-codegen in watch mode.\\nWill directly be injected as code.\\nDefault value: \\\"undefined\\\"\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"RawGenericSdkPluginConfig\": {\n      \"description\": \"This plugin generate a generic SDK (without any Requester implemented), allow you to easily customize the way you fetch your data, without loosing the strongly-typed integration.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"usingObservableFrom\": {\n          \"description\": \"usingObservableFrom: `import Observable from 'zen-observable'`\\nOR\\nusingObservableFrom: `import { Observable } from 'rxjs'`\",\n          \"type\": \"string\"\n        },\n        \"rawRequest\": {\n          \"description\": \"By default the `request` method return the `data` or `errors` key from the response. If you need to access the `extensions` key you can use the `rawRequest` method.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"noGraphQLTag\": {\n          \"description\": \"Deprecated. Changes the documentMode to `documentNode`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"gqlImport\": {\n          \"description\": \"Customize from which module will `gql` be imported from.\\nThis is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\\nDefault value: \\\"graphql-tag#gql\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentNodeImport\": {\n          \"description\": \"Customize from which module will `DocumentNode` be imported from.\\nThis is useful if you want to use modules other than `graphql`, e.g. `@graphql-typed-document-node`.\\nDefault value: \\\"graphql#DocumentNode\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL operations variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL operations variables suffix.\\nDefault value: \\\"Document\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL fragments variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL fragments variables suffix.\\nDefault value: \\\"FragmentDoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentMode\": {\n          \"$ref\": \"#/definitions/DocumentMode\",\n          \"description\": \"Declares how DocumentNode are created:\\n\\n- `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\\n- `documentNode`: document nodes will be generated as objects when we generate the templates.\\n- `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\\n- `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\\n\\nNote that some plugins (like `typescript-graphql-request`) also supports `string` for this parameter.\\nDefault value: \\\"graphQLTag\\\"\"\n        },\n        \"optimizeDocumentNode\": {\n          \"description\": \"If you are using `documentNode: documentMode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\\nThis will remove all \\\"loc\\\" and \\\"description\\\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importOperationTypesFrom\": {\n          \"description\": \"This config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\\nThis is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"importDocumentNodeExternallyFrom\": {\n          \"description\": \"This config should be used if `documentMode` is `external`. This has 2 usage:\\n\\n- any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\\n- 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"pureMagicComment\": {\n          \"description\": \"This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"ApolloClientHelpersConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"requireKeyFields\": {\n          \"type\": \"boolean\",\n          \"description\": \"Remove optional sign from all `keyFields` fields.\\nDefault value: \\\"false\\\"\"\n        },\n        \"requirePoliciesForAllTypes\": {\n          \"type\": \"boolean\",\n          \"description\": \"Remove optional sign from all generated keys of the root TypePolicy.\\nDefault value: \\\"false\\\"\"\n        }\n      }\n    },\n    \"AddPluginConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"placement\": {\n          \"description\": \"Allow you to choose where to add the content.\\nDefault value: \\\"prepend\\\"\",\n          \"enum\": [\"append\", \"content\", \"prepend\"],\n          \"type\": \"string\"\n        },\n        \"content\": {\n          \"description\": \"The actual content you wish to add, either a string or array of strings.\\nYou can also specify a path to a local file and the content if it will be loaded by codegen.\",\n          \"anyOf\": [{ \"type\": \"array\", \"items\": { \"type\": \"string\" } }, { \"type\": \"string\" }]\n        }\n      }\n    },\n    \"TimePluginConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"format\": {\n          \"description\": \"Customize the Moment format of the output time.\\nDefault value: \\\"YYYY-MM-DDTHH:mm:ssZ\\\"\",\n          \"type\": \"string\"\n        },\n        \"message\": {\n          \"description\": \"Customize the comment message\\nDefault value: \\\"'Generated on'\\\"\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"TypeScriptPluginConfig\": {\n      \"description\": \"This plugin generates the base TypeScript types, based on your GraphQL schema.\\n\\nThe types generated by this plugin are simple, and refers to the exact structure of your schema, and it's used as the base types for other plugins (such as `typescript-operations` / `typescript-resolvers`)\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"avoidOptionals\": {\n          \"description\": \"This will cause the generator to avoid using TypeScript optionals (`?`) on types,\\nso the following definition: `type A { myField: String }` will output `myField: Maybe<string>`\\ninstead of `myField?: Maybe<string>`.\\nDefault value: \\\"false\\\"\",\n          \"anyOf\": [{ \"$ref\": \"#/definitions/AvoidOptionalsConfig\" }, { \"type\": \"boolean\" }]\n        },\n        \"constEnums\": {\n          \"description\": \"Will prefix every generated `enum` with `const`, you can read more about const enums here: https://www.typescriptlang.org/docs/handbook/enums.html.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"enumsAsTypes\": {\n          \"description\": \"Generates enum as TypeScript string union `type` instead of an `enum`. Useful if you wish to generate `.d.ts` declaration file instead of `.ts`, or if you want to avoid using TypeScript enums due to bundle size concerns\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"numericEnums\": {\n          \"description\": \"Controls whether to preserve typescript enum values as numbers\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"futureProofEnums\": {\n          \"description\": \"This option controls whether or not a catch-all entry is added to enum type definitions for values that may be added in the future.\\nThis is useful if you are using `relay`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"futureProofUnions\": {\n          \"description\": \"This option controls whether or not a catch-all entry is added to union type definitions for values that may be added in the future.\\nThis is useful if you are using `relay`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"enumsAsConst\": {\n          \"description\": \"Generates enum as TypeScript `const assertions` instead of `enum`. This can even be used to enable enum-like patterns in plain JavaScript code if you choose not to use TypeScript’s enum construct.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"onlyEnums\": {\n          \"description\": \"This will cause the generator to emit types for enums only.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"onlyOperationTypes\": {\n          \"description\": \"This will cause the generator to emit types for operations only (basically only enums and scalars).\\nInteracts well with `preResolveTypes: true`\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"immutableTypes\": {\n          \"description\": \"Generates immutable types by adding `readonly` to properties and uses `ReadonlyArray`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"maybeValue\": {\n          \"description\": \"Allow to override the type value of `Maybe`.\\nDefault value: \\\"T | null\\\"\",\n          \"type\": \"string\"\n        },\n        \"inputMaybeValue\": {\n          \"description\": \"Allow to override the type value of `Maybe` for input types and arguments.\\nThis is useful in case you want to differentiate between the wrapper of input and output types.\\nBy default, this type just refers to `Maybe` type, but you can override its definition.\\nDefault value: \\\"Maybe<T>\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set to `true` in order to generate output without `export` modifier.\\nThis is useful if you are generating `.d.ts` file and want it to be globally available.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"disableDescriptions\": {\n          \"description\": \"Set the value to `true` in order to disable all description generation.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useImplementingTypes\": {\n          \"description\": \"When a GraphQL interface is used for a field, this flag will use the implementing types, instead of the interface itself.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"wrapEntireFieldDefinitions\": {\n          \"type\": \"boolean\",\n          \"description\": \"Set to `true` in order to wrap field definitions with `EntireFieldWrapper`.\\nThis is useful to allow return types such as Promises and functions for fields.\\nDiffers from `wrapFieldDefinitions` in that this wraps the entire field definition if i.e. the field is an Array, while\\n`wrapFieldDefinitions` will wrap every single value inside the array.\\nDefault value: \\\"false\\\"\"\n        },\n        \"entireFieldWrapperValue\": {\n          \"type\": \"string\",\n          \"description\": \"Allow to override the type value of `EntireFieldWrapper`. This wrapper applies outside of Array and Maybe\\nunlike `fieldWrapperValue`, that will wrap the inner type.\\nDefault value: \\\"T | Promise<T> | (() => T | Promise<T>)\\\"\"\n        },\n        \"allowEnumStringTypes\": { \"description\": \"Allow using enum string values directly.\", \"type\": \"boolean\" },\n        \"addUnderscoreToArgsType\": {\n          \"description\": \"Adds `_` to generated `Args` types in order to avoid duplicate identifiers.\",\n          \"type\": \"boolean\"\n        },\n        \"enumValues\": {\n          \"$ref\": \"#/definitions/EnumValuesMap\",\n          \"description\": \"Overrides the default value of enum values declared in your GraphQL schema.\\nYou can also map the entire enum to an external type by providing a string that of `module#type`.\"\n        },\n        \"declarationKind\": {\n          \"description\": \"Overrides the default output for various GraphQL elements.\",\n          \"anyOf\": [\n            { \"$ref\": \"#/definitions/DeclarationKindConfig\" },\n            { \"enum\": [\"abstract class\", \"class\", \"interface\", \"type\"], \"type\": \"string\" }\n          ]\n        },\n        \"enumPrefix\": {\n          \"description\": \"Allow you to disable prefixing for generated enums, works in combination with `typesPrefix`.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"enumSuffix\": {\n          \"description\": \"Allow you to disable suffixing for generated enums, works in combination with `typesSuffix`.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"fieldWrapperValue\": {\n          \"description\": \"Allow you to add wrapper for field type, use T as the generic value. Make sure to set `wrapFieldDefinitions` to `true` in order to make this flag work.\\nDefault value: \\\"T\\\"\",\n          \"type\": \"string\"\n        },\n        \"wrapFieldDefinitions\": {\n          \"description\": \"Set to `true` in order to wrap field definitions with `FieldWrapper`.\\nThis is useful to allow return types such as Promises and functions.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"ignoreEnumValuesFromSchema\": {\n          \"description\": \"This will cause the generator to ignore enum values defined in GraphQLSchema\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"directiveArgumentAndInputFieldMappings\": {\n          \"$ref\": \"#/definitions/DirectiveArgumentAndInputFieldMappings\",\n          \"description\": \"Replaces a GraphQL scalar with a custom type based on the applied directive on an argument or input field.\\n\\nYou can use both `module#type` and `module#namespace#type` syntax.\\nWill NOT work with introspected schemas since directives are not exported.\\nOnly works with directives on ARGUMENT_DEFINITION or INPUT_FIELD_DEFINITION.\\n\\n**WARNING:** Using this option does only change the type definitions.\\n\\nFor actually ensuring that a type is correct at runtime you will have to use schema transforms (e.g. with [@graphql-tools/utils mapSchema](https://graphql-tools.com/docs/schema-directives)) that apply those rules!\\nOtherwise, you might end up with a runtime type mismatch which could cause unnoticed bugs or runtime errors.\\n\\nPlease use this configuration option with care!\"\n        },\n        \"directiveArgumentAndInputFieldMappingTypeSuffix\": {\n          \"description\": \"Adds a suffix to the imported names to prevent name clashes.\",\n          \"type\": \"string\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap_1\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention_1\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\n\\\"mask\\\" transforms the types for use with fragment masking. Useful when masked types are needed when not using the \\\"client\\\" preset e.g. such as combining it with Apollo Client's data masking feature.\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importExtension\": {\n          \"description\": \"Append this extension to all imports.\\nUseful for ESM environments that require file extensions in import statements.\",\n          \"anyOf\": [\n            { \"type\": \"array\", \"items\": { \"type\": \"string\" } },\n            { \"enum\": [\"\"], \"type\": \"string\" }\n          ]\n        },\n        \"extractAllFieldsToTypes\": {\n          \"description\": \"Extract all field types to their own types, instead of inlining them.\\nThis helps to reduce type duplication, and makes type errors more readable.\\nIt can also significantly reduce the size of the generated code, the generation time,\\nand the typechecking time.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"printFieldsOnNewLines\": {\n          \"description\": \"If you prefer to have each field in generated types printed on a new line, set this to true.\\nThis can be useful for improving readability of the resulting types,\\nwithout resorting to running tools like Prettier on the output.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"includeExternalFragments\": {\n          \"description\": \"Whether to include external fragments in the generated code. External fragments are not defined\\nin the same location as the operation definition.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"TypeScriptDocumentsPluginConfig\": {\n      \"description\": \"This plugin generates TypeScript types based on your GraphQLSchema _and_ your GraphQL operations and fragments.\\nIt generates types for your GraphQL documents: Query, Mutation, Subscription and Fragment.\\n\\nNote: In most configurations, this plugin requires you to use `typescript as well, because it depends on its base types.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"arrayInputCoercion\": {\n          \"description\": \"The [GraphQL spec](https://spec.graphql.org/draft/#sel-FAHjBJFCAACE_Gh7d)\\nallows arrays and a single primitive value for list input. This allows to\\ndeactivate that behavior to only accept arrays instead of single values. If\\nset to `false`, the definition: `query foo(bar: [Int!]!): Foo` will output\\n`bar: Array<Int>` instead of `bar: Array<Int> | Int` for the variable part.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"avoidOptionals\": {\n          \"description\": \"This will cause the generator to avoid using TypeScript optionals (`?`) on types,\\nso the following definition: `type A { myField: String }` will output `myField: Maybe<string>`\\ninstead of `myField?: Maybe<string>`.\\nDefault value: \\\"false\\\"\",\n          \"anyOf\": [{ \"$ref\": \"#/definitions/AvoidOptionalsConfig\" }, { \"type\": \"boolean\" }]\n        },\n        \"immutableTypes\": {\n          \"description\": \"Generates immutable types by adding `readonly` to properties and uses `ReadonlyArray`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"flattenGeneratedTypes\": {\n          \"description\": \"Flatten fragment spread and inline fragments into a simple selection set before generating.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"flattenGeneratedTypesIncludeFragments\": {\n          \"description\": \"Include all fragments types when flattenGeneratedTypes is enabled.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"noExport\": {\n          \"description\": \"Set to `true` in order to generate output without `export` modifier.\\nThis is useful if you are generating `.d.ts` file and want it to be globally available.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"globalNamespace\": { \"type\": \"boolean\" },\n        \"addOperationExport\": {\n          \"type\": \"boolean\",\n          \"description\": \"Add const export of the operation name to output file. Pay attention that the file should be `d.ts`.\\nYou can combine it with `near-operation-file preset` and therefore the types will be generated along with graphql file. Then you need to set extension in `presetConfig` to be `.gql.d.ts` and by that you can import `gql` file in `ts` files.\\nIt will allow you to get everything with one import:\\n\\n```ts\\nimport { GetClient, GetClientQuery, GetClientQueryVariables } from './GetClient.gql.js'\\n```\\nDefault value: \\\"false\\\"\"\n        },\n        \"maybeValue\": {\n          \"description\": \"Allow to override the type value of `Maybe`.\\nDefault value: \\\"T | null\\\"\",\n          \"type\": \"string\"\n        },\n        \"allowUndefinedQueryVariables\": {\n          \"description\": \"Adds undefined as a possible type for query variables\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nullability\": {\n          \"description\": \"Options related to handling nullability\",\n          \"type\": \"object\",\n          \"properties\": { \"errorHandlingClient\": { \"type\": \"boolean\" } }\n        },\n        \"preResolveTypes\": {\n          \"description\": \"Uses primitive types where possible.\\nSet to `false` in order to use `Pick` and take use the types generated by `typescript` plugin.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"skipTypeNameForRoot\": {\n          \"description\": \"Avoid adding `__typename` for root types. This is ignored when a selection explicitly specifies `__typename`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"exportFragmentSpreadSubTypes\": {\n          \"description\": \"If set to true, it will export the sub-types created in order to make it easier to access fields declared under fragment spread.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"mergeFragmentTypes\": {\n          \"description\": \"If set to true, merge equal fragment interfaces.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"customDirectives\": {\n          \"$ref\": \"#/definitions/CustomDirectivesConfig\",\n          \"description\": \"Configures behavior for use with custom directives from\\nvarious GraphQL libraries.\"\n        },\n        \"addUnderscoreToArgsType\": {\n          \"description\": \"Adds `_` to generated `Args` types in order to avoid duplicate identifiers.\",\n          \"type\": \"boolean\"\n        },\n        \"enumValues\": {\n          \"$ref\": \"#/definitions/EnumValuesMap\",\n          \"description\": \"Overrides the default value of enum values declared in your GraphQL schema.\\nYou can also map the entire enum to an external type by providing a string that of `module#type`.\"\n        },\n        \"declarationKind\": {\n          \"description\": \"Overrides the default output for various GraphQL elements.\",\n          \"anyOf\": [\n            { \"$ref\": \"#/definitions/DeclarationKindConfig\" },\n            { \"enum\": [\"abstract class\", \"class\", \"interface\", \"type\"], \"type\": \"string\" }\n          ]\n        },\n        \"enumPrefix\": {\n          \"description\": \"Allow you to disable prefixing for generated enums, works in combination with `typesPrefix`.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"enumSuffix\": {\n          \"description\": \"Allow you to disable suffixing for generated enums, works in combination with `typesSuffix`.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"fieldWrapperValue\": {\n          \"description\": \"Allow you to add wrapper for field type, use T as the generic value. Make sure to set `wrapFieldDefinitions` to `true` in order to make this flag work.\\nDefault value: \\\"T\\\"\",\n          \"type\": \"string\"\n        },\n        \"wrapFieldDefinitions\": {\n          \"description\": \"Set to `true` in order to wrap field definitions with `FieldWrapper`.\\nThis is useful to allow return types such as Promises and functions.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"onlyEnums\": {\n          \"description\": \"This will cause the generator to emit types for enums only\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"onlyOperationTypes\": {\n          \"description\": \"This will cause the generator to emit types for operations only (basically only enums and scalars)\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"ignoreEnumValuesFromSchema\": {\n          \"description\": \"This will cause the generator to ignore enum values defined in GraphQLSchema\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"wrapEntireFieldDefinitions\": {\n          \"type\": \"boolean\",\n          \"description\": \"Set to `true` in order to wrap field definitions with `EntireFieldWrapper`.\\nThis is useful to allow return types such as Promises and functions for fields.\\nDiffers from `wrapFieldDefinitions` in that this wraps the entire field definition if i.e. the field is an Array, while\\n`wrapFieldDefinitions` will wrap every single value inside the array.\\nDefault value: \\\"true\\\"\"\n        },\n        \"entireFieldWrapperValue\": {\n          \"type\": \"string\",\n          \"description\": \"Allow to override the type value of `EntireFieldWrapper`. This wrapper applies outside of Array and Maybe\\nunlike `fieldWrapperValue`, that will wrap the inner type.\\nDefault value: \\\"T | Promise<T> | (() => T | Promise<T>)\\\"\"\n        },\n        \"directiveArgumentAndInputFieldMappings\": {\n          \"$ref\": \"#/definitions/DirectiveArgumentAndInputFieldMappings\",\n          \"description\": \"Replaces a GraphQL scalar with a custom type based on the applied directive on an argument or input field.\\n\\nYou can use both `module#type` and `module#namespace#type` syntax.\\nWill NOT work with introspected schemas since directives are not exported.\\nOnly works with directives on ARGUMENT_DEFINITION or INPUT_FIELD_DEFINITION.\\n\\n**WARNING:** Using this option does only change the type definitions.\\n\\nFor actually ensuring that a type is correct at runtime you will have to use schema transforms (e.g. with [@graphql-tools/utils mapSchema](https://graphql-tools.com/docs/schema-directives)) that apply those rules!\\nOtherwise, you might end up with a runtime type mismatch which could cause unnoticed bugs or runtime errors.\\n\\nPlease use this configuration option with care!\"\n        },\n        \"directiveArgumentAndInputFieldMappingTypeSuffix\": {\n          \"description\": \"Adds a suffix to the imported names to prevent name clashes.\",\n          \"type\": \"string\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap_1\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention_1\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\n\\\"mask\\\" transforms the types for use with fragment masking. Useful when masked types are needed when not using the \\\"client\\\" preset e.g. such as combining it with Apollo Client's data masking feature.\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importExtension\": {\n          \"description\": \"Append this extension to all imports.\\nUseful for ESM environments that require file extensions in import statements.\",\n          \"anyOf\": [\n            { \"type\": \"array\", \"items\": { \"type\": \"string\" } },\n            { \"enum\": [\"\"], \"type\": \"string\" }\n          ]\n        },\n        \"extractAllFieldsToTypes\": {\n          \"description\": \"Extract all field types to their own types, instead of inlining them.\\nThis helps to reduce type duplication, and makes type errors more readable.\\nIt can also significantly reduce the size of the generated code, the generation time,\\nand the typechecking time.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"printFieldsOnNewLines\": {\n          \"description\": \"If you prefer to have each field in generated types printed on a new line, set this to true.\\nThis can be useful for improving readability of the resulting types,\\nwithout resorting to running tools like Prettier on the output.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"includeExternalFragments\": {\n          \"description\": \"Whether to include external fragments in the generated code. External fragments are not defined\\nin the same location as the operation definition.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"CSharpResolversPluginRawConfig\": {\n      \"description\": \"This plugin generates C# `class` identifier for your schema types.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"enumValues\": {\n          \"$ref\": \"#/definitions/EnumValuesMap_1\",\n          \"description\": \"Overrides the default value of enum values declared in your GraphQL schema.\"\n        },\n        \"namespaceName\": {\n          \"description\": \"Allow you to customize the namespace name.\\nDefault value: \\\"GraphQLCodeGen\\\"\",\n          \"type\": \"string\"\n        },\n        \"className\": {\n          \"description\": \"Allow you to customize the parent class name.\\nDefault value: \\\"Types\\\"\",\n          \"type\": \"string\"\n        },\n        \"listType\": {\n          \"description\": \"Allow you to customize the list type\\nDefault value: \\\"IEnumerable\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitRecords\": {\n          \"description\": \"Emit C# 9.0+ records instead of classes\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"emitJsonAttributes\": {\n          \"description\": \"Should JSON attributes be emitted for produced types and properties ot not\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"jsonAttributesSource\": {\n          \"$ref\": \"#/definitions/JsonAttributesSource\",\n          \"description\": \"Library that should be used to emit JSON attributes. Ignored when `emitJsonAttributes` is `false` or not specified\\nDefault value: \\\"Newtonsoft.Json\\\"\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap_2\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention_2\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"CSharpOperationsRawPluginConfig\": {\n      \"description\": \"This plugin generates C# `class` based on your GraphQL operations.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"namespaceName\": {\n          \"description\": \"Allow you to customize the namespace name.\\nDefault value: \\\"GraphQLCodeGen\\\"\",\n          \"type\": \"string\"\n        },\n        \"namedClient\": { \"description\": \"Defined the global value of `namedClient`.\", \"type\": \"string\" },\n        \"querySuffix\": {\n          \"description\": \"Allows to define a custom suffix for query operations.\\nDefault value: \\\"GQL\\\"\",\n          \"type\": \"string\"\n        },\n        \"mutationSuffix\": {\n          \"description\": \"Allows to define a custom suffix for mutation operations.\\nDefault value: \\\"GQL\\\"\",\n          \"type\": \"string\"\n        },\n        \"subscriptionSuffix\": {\n          \"description\": \"Allows to define a custom suffix for Subscription operations.\\nDefault value: \\\"GQL\\\"\",\n          \"type\": \"string\"\n        },\n        \"typesafeOperation\": {\n          \"description\": \"Allows to generate operation methods with class definitions for request/response parameters\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"noGraphQLTag\": {\n          \"description\": \"Deprecated. Changes the documentMode to `documentNode`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"gqlImport\": {\n          \"description\": \"Customize from which module will `gql` be imported from.\\nThis is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\\nDefault value: \\\"graphql-tag#gql\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentNodeImport\": {\n          \"description\": \"Customize from which module will `DocumentNode` be imported from.\\nThis is useful if you want to use modules other than `graphql`, e.g. `@graphql-typed-document-node`.\\nDefault value: \\\"graphql#DocumentNode\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL operations variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL operations variables suffix.\\nDefault value: \\\"Document\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL fragments variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL fragments variables suffix.\\nDefault value: \\\"FragmentDoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentMode\": {\n          \"$ref\": \"#/definitions/DocumentMode_1\",\n          \"description\": \"Declares how DocumentNode are created:\\n\\n- `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\\n- `documentNode`: document nodes will be generated as objects when we generate the templates.\\n- `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\\n- `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\\n\\nNote that some plugins (like `typescript-graphql-request`) also supports `string` for this parameter.\\nDefault value: \\\"graphQLTag\\\"\"\n        },\n        \"optimizeDocumentNode\": {\n          \"description\": \"If you are using `documentNode: documentMode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\\nThis will remove all \\\"loc\\\" and \\\"description\\\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importOperationTypesFrom\": {\n          \"description\": \"This config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\\nThis is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"importDocumentNodeExternallyFrom\": {\n          \"description\": \"This config should be used if `documentMode` is `external`. This has 2 usage:\\n\\n- any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\\n- 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"pureMagicComment\": {\n          \"description\": \"This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap_2\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention_2\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"SchemaASTConfig\": {\n      \"description\": \"This plugin prints the merged schema as string. If multiple schemas are provided, they will be merged and printed as one schema.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"includeDirectives\": {\n          \"description\": \"Include directives to Schema output.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"includeIntrospectionTypes\": {\n          \"description\": \"Include introspection types to Schema output.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"commentDescriptions\": {\n          \"description\": \"Set to true in order to print description as comments (using `#` instead of `\\\"\\\"\\\"`)\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"sort\": { \"description\": \"Set to false to disable sorting\\nDefault value: \\\"true\\\"\", \"type\": \"boolean\" },\n        \"federation\": { \"type\": \"boolean\" }\n      }\n    },\n    \"TypeGraphQLPluginConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"decoratorName\": {\n          \"$ref\": \"#/definitions/Partial_1\",\n          \"description\": \"allow overriding of TypeGraphQL decorator types\\nDefault value: \\\"{ type: 'ObjectType', interface: 'InterfaceType', arguments: 'ArgsType', field: 'Field', input: 'InputType' }\\\"\"\n        },\n        \"decorateTypes\": {\n          \"description\": \"Specifies the objects that will have TypeGraphQL decorators prepended to them, by name. Non-matching types will still be output, but without decorators. If not set, all types will be decorated.\",\n          \"type\": \"array\",\n          \"items\": { \"type\": \"string\" }\n        },\n        \"avoidOptionals\": {\n          \"description\": \"This will cause the generator to avoid using TypeScript optionals (`?`) on types,\\nso the following definition: `type A { myField: String }` will output `myField: Maybe<string>`\\ninstead of `myField?: Maybe<string>`.\\nDefault value: \\\"false\\\"\",\n          \"anyOf\": [{ \"$ref\": \"#/definitions/AvoidOptionalsConfig_1\" }, { \"type\": \"boolean\" }]\n        },\n        \"constEnums\": {\n          \"description\": \"Will prefix every generated `enum` with `const`, you can read more about const enums here: https://www.typescriptlang.org/docs/handbook/enums.html.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"enumsAsTypes\": {\n          \"description\": \"Generates enum as TypeScript string union `type` instead of an `enum`. Useful if you wish to generate `.d.ts` declaration file instead of `.ts`, or if you want to avoid using TypeScript enums due to bundle size concerns\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"numericEnums\": {\n          \"description\": \"Controls whether to preserve typescript enum values as numbers\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"futureProofEnums\": {\n          \"description\": \"This option controls whether or not a catch-all entry is added to enum type definitions for values that may be added in the future.\\nThis is useful if you are using `relay`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"futureProofUnions\": {\n          \"description\": \"This option controls whether or not a catch-all entry is added to union type definitions for values that may be added in the future.\\nThis is useful if you are using `relay`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"enumsAsConst\": {\n          \"description\": \"Generates enum as TypeScript `const assertions` instead of `enum`. This can even be used to enable enum-like patterns in plain JavaScript code if you choose not to use TypeScript’s enum construct.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"onlyEnums\": {\n          \"description\": \"This will cause the generator to emit types for enums only.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"onlyOperationTypes\": {\n          \"description\": \"This will cause the generator to emit types for operations only (basically only enums and scalars).\\nInteracts well with `preResolveTypes: true`\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"immutableTypes\": {\n          \"description\": \"Generates immutable types by adding `readonly` to properties and uses `ReadonlyArray`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"maybeValue\": {\n          \"description\": \"Allow to override the type value of `Maybe`.\\nDefault value: \\\"T | null\\\"\",\n          \"type\": \"string\"\n        },\n        \"inputMaybeValue\": {\n          \"description\": \"Allow to override the type value of `Maybe` for input types and arguments.\\nThis is useful in case you want to differentiate between the wrapper of input and output types.\\nBy default, this type just refers to `Maybe` type, but you can override its definition.\\nDefault value: \\\"Maybe<T>\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set to `true` in order to generate output without `export` modifier.\\nThis is useful if you are generating `.d.ts` file and want it to be globally available.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"disableDescriptions\": {\n          \"description\": \"Set the value to `true` in order to disable all description generation.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useImplementingTypes\": {\n          \"description\": \"When a GraphQL interface is used for a field, this flag will use the implementing types, instead of the interface itself.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"wrapEntireFieldDefinitions\": {\n          \"type\": \"boolean\",\n          \"description\": \"Set to `true` in order to wrap field definitions with `EntireFieldWrapper`.\\nThis is useful to allow return types such as Promises and functions for fields.\\nDiffers from `wrapFieldDefinitions` in that this wraps the entire field definition if i.e. the field is an Array, while\\n`wrapFieldDefinitions` will wrap every single value inside the array.\\nDefault value: \\\"false\\\"\"\n        },\n        \"entireFieldWrapperValue\": {\n          \"type\": \"string\",\n          \"description\": \"Allow to override the type value of `EntireFieldWrapper`. This wrapper applies outside of Array and Maybe\\nunlike `fieldWrapperValue`, that will wrap the inner type.\\nDefault value: \\\"T | Promise<T> | (() => T | Promise<T>)\\\"\"\n        },\n        \"allowEnumStringTypes\": { \"description\": \"Allow using enum string values directly.\", \"type\": \"boolean\" },\n        \"addUnderscoreToArgsType\": {\n          \"description\": \"Adds `_` to generated `Args` types in order to avoid duplicate identifiers.\",\n          \"type\": \"boolean\"\n        },\n        \"enumValues\": {\n          \"$ref\": \"#/definitions/EnumValuesMap_1\",\n          \"description\": \"Overrides the default value of enum values declared in your GraphQL schema.\\nYou can also map the entire enum to an external type by providing a string that of `module#type`.\"\n        },\n        \"declarationKind\": {\n          \"description\": \"Overrides the default output for various GraphQL elements.\",\n          \"anyOf\": [\n            { \"$ref\": \"#/definitions/DeclarationKindConfig_1\" },\n            { \"enum\": [\"abstract class\", \"class\", \"interface\", \"type\"], \"type\": \"string\" }\n          ]\n        },\n        \"enumPrefix\": {\n          \"description\": \"Allow you to disable prefixing for generated enums, works in combination with `typesPrefix`.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"fieldWrapperValue\": {\n          \"description\": \"Allow you to add wrapper for field type, use T as the generic value. Make sure to set `wrapFieldDefinitions` to `true` in order to make this flag work.\\nDefault value: \\\"T\\\"\",\n          \"type\": \"string\"\n        },\n        \"wrapFieldDefinitions\": {\n          \"description\": \"Set to `true` in order to wrap field definitions with `FieldWrapper`.\\nThis is useful to allow return types such as Promises and functions.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"ignoreEnumValuesFromSchema\": {\n          \"description\": \"This will cause the generator to ignore enum values defined in GraphQLSchema\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"directiveArgumentAndInputFieldMappings\": {\n          \"$ref\": \"#/definitions/DirectiveArgumentAndInputFieldMappings_1\",\n          \"description\": \"Replaces a GraphQL scalar with a custom type based on the applied directive on an argument or input field.\\n\\nYou can use both `module#type` and `module#namespace#type` syntax.\\nWill NOT work with introspected schemas since directives are not exported.\\nOnly works with directives on ARGUMENT_DEFINITION or INPUT_FIELD_DEFINITION.\\n\\n**WARNING:** Using this option does only change the type definitions.\\n\\nFor actually ensuring that a type is correct at runtime you will have to use schema transforms (e.g. with [@graphql-tools/utils mapSchema](https://graphql-tools.com/docs/schema-directives)) that apply those rules!\\nOtherwise, you might end up with a runtime type mismatch which could cause unnoticed bugs or runtime errors.\\n\\nPlease use this configuration option with care!\"\n        },\n        \"directiveArgumentAndInputFieldMappingTypeSuffix\": {\n          \"description\": \"Adds a suffix to the imported names to prevent name clashes.\",\n          \"type\": \"string\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap_2\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention_2\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"TypeScriptFilesModulesPluginConfig\": {\n      \"description\": \"This plugin generates TypeScript typings for `.graphql` files containing GraphQL documents, which later on can be consumed using [`graphql-tag/loader`](https://github.com/apollographql/graphql-tag#webpack-preprocessing-with-graphql-tagloader) or use `string` types if you will use the operations as raw strings, and get type-check and type-safety for your imports. This means that any time you import objects from `.graphql` files, your IDE will provide auto-complete.\\n\\nThis plugin also handles `.graphql` files containing multiple GraphQL documents, and name the imports according to the operation name.\\n\\n> ⚠ Fragments are not generated with named imports, only as default imports, due to `graphql-tag/loader` behavior.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"modulePathPrefix\": {\n          \"description\": \"Allows specifying a module definition path prefix to provide distinction\\nbetween generated types.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"relativeToCwd\": {\n          \"description\": \"By default, only the filename is being used to generate TS module declarations. Setting this to `true` will generate it with a full path based on the CWD.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"prefix\": {\n          \"description\": \"By default, a wildcard is being added as prefix, you can change that to a custom prefix\\nDefault value: \\\"*\\\\/\\\"\",\n          \"type\": \"string\"\n        },\n        \"type\": {\n          \"description\": \"By default, the named exports will have a type `DocumentNode`. Change this to \\\"string\\\" if you only use raw strings.\\nDefault value: \\\"DocumentNode\\\"\",\n          \"enum\": [\"DocumentNode\", \"string\"],\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"NamedOperationsObjectPluginConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"identifierName\": {\n          \"description\": \"Allow you to customize the name of the exported identifier\\nDefault value: \\\"namedOperations\\\"\",\n          \"type\": \"string\"\n        },\n        \"useConsts\": {\n          \"description\": \"Will generate a const string instead of regular string.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"RawGraphQLRequestPluginConfig\": {\n      \"description\": \"This plugin generates [`graphql-request`](https://npmjs.com/package/graphql-request) ready-to-use SDK, which is fully-typed.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"rawRequest\": {\n          \"description\": \"By default, the `request` method return the `data` or `errors` key from the response. If you need to access the `extensions` key you can use the `rawRequest` method.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"extensionsType\": {\n          \"description\": \"Allows you to override the type for extensions when `rawRequest` is enabled.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"noGraphQLTag\": {\n          \"description\": \"Deprecated. Changes the documentMode to `documentNode`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"gqlImport\": {\n          \"description\": \"Customize from which module will `gql` be imported from.\\nThis is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\\nDefault value: \\\"graphql-tag#gql\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentNodeImport\": {\n          \"description\": \"Customize from which module will `DocumentNode` be imported from.\\nThis is useful if you want to use modules other than `graphql`, e.g. `@graphql-typed-document-node`.\\nDefault value: \\\"graphql#DocumentNode\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL operations variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL operations variables suffix.\\nDefault value: \\\"Document\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL fragments variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL fragments variables suffix.\\nDefault value: \\\"FragmentDoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentMode\": {\n          \"$ref\": \"#/definitions/DocumentMode\",\n          \"description\": \"Declares how DocumentNode are created:\\n\\n- `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\\n- `documentNode`: document nodes will be generated as objects when we generate the templates.\\n- `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\\n- `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\\n\\nNote that some plugins (like `typescript-graphql-request`) also supports `string` for this parameter.\\nDefault value: \\\"graphQLTag\\\"\"\n        },\n        \"optimizeDocumentNode\": {\n          \"description\": \"If you are using `documentNode: documentMode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\\nThis will remove all \\\"loc\\\" and \\\"description\\\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importOperationTypesFrom\": {\n          \"description\": \"This config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\\nThis is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"importDocumentNodeExternallyFrom\": {\n          \"description\": \"This config should be used if `documentMode` is `external`. This has 2 usage:\\n\\n- any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\\n- 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"pureMagicComment\": {\n          \"description\": \"This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"TypeScriptMongoPluginConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"dbTypeSuffix\": {\n          \"description\": \"Customize the suffix for the generated GraphQL `type`s.\\nDefault value: \\\"DbObject\\\"\",\n          \"type\": \"string\"\n        },\n        \"dbInterfaceSuffix\": {\n          \"description\": \"Customize the suffix for the generated GraphQL `interface`s.\\nDefault value: \\\"DbObject\\\"\",\n          \"type\": \"string\"\n        },\n        \"objectIdType\": {\n          \"description\": \"Customize the type of `_id` fields. You can either specify a type name, or specify `module#type`.\\nDefault value: \\\"mongodb#ObjectId\\\"\",\n          \"type\": \"string\"\n        },\n        \"idFieldName\": {\n          \"description\": \"Customize the name of the id field generated after using `@id` directive over a GraphQL field.\\nDefault value: \\\"_id\\\"\",\n          \"type\": \"string\"\n        },\n        \"enumsAsString\": {\n          \"description\": \"Replaces generated `enum` values with `string`.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"avoidOptionals\": {\n          \"description\": \"This will cause the generator to avoid using TypeScript optionals (`?`),\\nso the following definition: `type A { myField: String }` will output `myField: Maybe<string>`\\ninstead of `myField?: Maybe<string>`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"TypeScriptResolversPluginConfig\": {\n      \"description\": \"This plugin generates TypeScript signature for `resolve` functions of your GraphQL API.\\nYou can use this plugin to generate simple resolvers signature based on your GraphQL types, or you can change its behavior be providing custom model types (mappers).\\n\\nYou can find a blog post explaining the usage of this plugin here: https://the-guild.dev/blog/better-type-safety-for-resolvers-with-graphql-codegen\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"useIndexSignature\": {\n          \"description\": \"Adds an index signature to any generates resolver.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"noSchemaStitching\": {\n          \"description\": \"Disables/Enables Schema Stitching support.\\nBy default, the resolver signature does not include the support for schema-stitching.\\nSet to `false` to enable that.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"wrapFieldDefinitions\": {\n          \"description\": \"Set to `true` in order to wrap field definitions with `FieldWrapper`.\\nThis is useful to allow return types such as Promises and functions. Needed for\\ncompatibility with `federation: true` when\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"customResolveInfo\": {\n          \"description\": \"You can provide your custom GraphQLResolveInfo instead of the default one from graphql-js\\nDefault value: \\\"graphql#GraphQLResolveInfo\\\"\",\n          \"type\": \"string\"\n        },\n        \"customResolverFn\": {\n          \"description\": \"You can provide your custom ResolveFn instead the default. It has to be a type that uses the generics `<TResult, TParent, TContext, TArgs>`\\nDefault value: \\\"(parent: TParent, args: TArgs, context: TContext, info: GraphQLResolveInfo) => Promise<TResult> | TResult\\\"\",\n          \"type\": \"string\"\n        },\n        \"directiveResolverMappings\": {\n          \"$ref\": \"#/definitions/Record\",\n          \"description\": \"Map the usage of a directive into using a specific resolver.\"\n        },\n        \"allowParentTypeOverride\": {\n          \"description\": \"Allow you to override the `ParentType` generic in each resolver, by avoid enforcing the base type of the generated generic type.\\n\\nThis will generate `ParentType = Type` instead of `ParentType extends Type = Type` in each resolver.\",\n          \"type\": \"boolean\"\n        },\n        \"optionalInfoArgument\": {\n          \"description\": \"Sets `info` argument of resolver function to be optional field. Useful for testing.\",\n          \"type\": \"boolean\"\n        },\n        \"makeResolverTypeCallable\": {\n          \"description\": \"Set to `true` in order to allow the Resolver type to be callable\",\n          \"type\": \"boolean\"\n        },\n        \"addUnderscoreToArgsType\": {\n          \"description\": \"Adds `_` to generated `Args` types in order to avoid duplicate identifiers.\",\n          \"type\": \"boolean\"\n        },\n        \"contextType\": {\n          \"description\": \"Use this configuration to set a custom type for your `context`, and it will\\naffect all the resolvers, without the need to override it using generics each time.\\nIf you wish to use an external type and import it from another file, you can use `add` plugin\\nand add the required `import` statement, or you can use a `module#type` syntax.\",\n          \"type\": \"string\"\n        },\n        \"fieldContextTypes\": {\n          \"$ref\": \"#/definitions/Array_1\",\n          \"description\": \"Use this to set a custom type for a specific field `context`.\\nIt will only affect the targeted resolvers.\\nYou can either use `Field.Path#ContextTypeName` or `Field.Path#ExternalFileName#ContextTypeName`\"\n        },\n        \"rootValueType\": {\n          \"description\": \"Use this configuration to set a custom type for the `rootValue`, and it will\\naffect resolvers of all root types (Query, Mutation and Subscription), without the need to override it using generics each time.\\nIf you wish to use an external type and import it from another file, you can use `add` plugin\\nand add the required `import` statement, or you can use both `module#type` or `module#namespace#type` syntax.\",\n          \"type\": \"string\"\n        },\n        \"directiveContextTypes\": {\n          \"$ref\": \"#/definitions/Array_1\",\n          \"description\": \"Use this to set a custom type for a specific field `context` decorated by a directive.\\nIt will only affect the targeted resolvers.\\nYou can either use `Field.Path#ContextTypeName` or `Field.Path#ExternalFileName#ContextTypeName`\\n\\nContextTypeName should by a generic Type that take the context or field context type as only type parameter.\"\n        },\n        \"mapperTypeSuffix\": {\n          \"description\": \"Adds a suffix to the imported names to prevent name clashes.\",\n          \"type\": \"string\"\n        },\n        \"mappers\": {\n          \"description\": \"Replaces a GraphQL type usage with a custom type, allowing you to return custom object from\\nyour resolvers.\\nYou can use both `module#type` and `module#namespace#type` syntax.\",\n          \"type\": \"object\",\n          \"additionalProperties\": { \"type\": \"string\" }\n        },\n        \"defaultMapper\": {\n          \"description\": \"Allow you to set the default mapper when it's not being override by `mappers` or generics.\\nYou can specify a type name, or specify a string in `module#type` or `module#namespace#type` format.\\nThe default value of mappers is the TypeScript type generated by `typescript` package.\",\n          \"type\": \"string\"\n        },\n        \"avoidOptionals\": {\n          \"description\": \"This will cause the generator to avoid using optionals (`?`),\\nso all field resolvers must be implemented in order to avoid compilation errors.\\nDefault value: \\\"false\\\"\",\n          \"anyOf\": [{ \"$ref\": \"#/definitions/AvoidOptionalsConfig\" }, { \"type\": \"boolean\" }]\n        },\n        \"showUnusedMappers\": {\n          \"description\": \"Warns about unused mappers.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"enumValues\": {\n          \"$ref\": \"#/definitions/EnumValuesMap\",\n          \"description\": \"Overrides the default value of enum values declared in your GraphQL schema, supported\\nin this plugin because of the need for integration with `typescript` package.\\nSee documentation under `typescript` plugin for more information and examples.\"\n        },\n        \"resolverTypeWrapperSignature\": {\n          \"description\": \"Allow you to override `resolverTypeWrapper` definition.\\nDefault value: \\\"Promise<T> | T\\\"\",\n          \"type\": \"string\"\n        },\n        \"federation\": { \"description\": \"Supports Apollo Federation\\nDefault value: \\\"false\\\"\", \"type\": \"boolean\" },\n        \"enumPrefix\": {\n          \"description\": \"Allow you to disable prefixing for generated enums, works in combination with `typesPrefix`.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"enumSuffix\": {\n          \"description\": \"Allow you to disable suffixing for generated enums, works in combination with `typesSuffix`.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"customDirectives\": {\n          \"description\": \"Configures behavior for custom directives from various GraphQL libraries.\",\n          \"type\": \"object\",\n          \"properties\": { \"semanticNonNull\": { \"type\": \"boolean\" } }\n        },\n        \"optionalResolveType\": {\n          \"description\": \"Sets the `__resolveType` field as optional field.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"immutableTypes\": {\n          \"description\": \"Generates immutable types by adding `readonly` to properties and uses `ReadonlyArray`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"namespacedImportName\": {\n          \"description\": \"Prefixes all GraphQL related generated types with that value, as namespaces import.\\nYou can use this feature to allow separation of plugins to different files.\\nDefault value: \\\"''\\\"\",\n          \"type\": \"string\"\n        },\n        \"resolverTypeSuffix\": {\n          \"description\": \"Suffix we add to each generated type resolver.\\nDefault value: \\\"Resolvers\\\"\",\n          \"type\": \"string\"\n        },\n        \"allResolversTypeName\": {\n          \"description\": \"The type name to use when exporting all resolvers signature as unified type.\\nDefault value: \\\"Resolvers\\\"\",\n          \"type\": \"string\"\n        },\n        \"internalResolversPrefix\": {\n          \"type\": \"string\",\n          \"description\": \"Defines the prefix value used for `__resolveType` and `__isTypeOf` resolvers.\\nIf you are using `mercurius-js`, please set this field to empty string for better compatibility.\\nDefault value: \\\"'__'\\\"\"\n        },\n        \"resolversNonOptionalTypename\": {\n          \"description\": \"Makes `__typename` of resolver mappings non-optional without affecting the base types.\\nDefault value: \\\"false\\\"\",\n          \"anyOf\": [{ \"$ref\": \"#/definitions/ResolversNonOptionalTypenameConfig\" }, { \"type\": \"boolean\" }]\n        },\n        \"avoidCheckingAbstractTypesRecursively\": {\n          \"type\": \"boolean\",\n          \"description\": \"If true, recursively goes through all object type's fields, checks if they have abstract types and generates expected types correctly.\\nThis may not work for cases where provided default mapper types are also nested e.g. `defaultMapper: DeepPartial<{T}>` or `defaultMapper: Partial<{T}>`.\\nDefault value: \\\"false\\\"\"\n        },\n        \"addInterfaceFieldResolverTypes\": {\n          \"description\": \"If true, add field resolver types to Interfaces.\\nBy default, GraphQL Interfaces do not trigger any field resolvers,\\nmeaning every implementing type must implement the same resolver for the shared fields.\\n\\nSome tools provide a way to change the default behaviour by making GraphQL Objects inherit\\nmissing resolvers from their Interface types. In these cases, it is fine to turn this option to true.\\n\\nFor example, if you are using `@graphql-tools/schema#makeExecutableSchema` with `inheritResolversFromInterfaces: true`,\\nyou can make `addInterfaceFieldResolverTypes: true` as well\\nhttps://the-guild.dev/graphql/tools/docs/generate-schema#makeexecutableschema\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap_1\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention_1\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\n\\\"mask\\\" transforms the types for use with fragment masking. Useful when masked types are needed when not using the \\\"client\\\" preset e.g. such as combining it with Apollo Client's data masking feature.\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importExtension\": {\n          \"description\": \"Append this extension to all imports.\\nUseful for ESM environments that require file extensions in import statements.\",\n          \"anyOf\": [\n            { \"type\": \"array\", \"items\": { \"type\": \"string\" } },\n            { \"enum\": [\"\"], \"type\": \"string\" }\n          ]\n        },\n        \"extractAllFieldsToTypes\": {\n          \"description\": \"Extract all field types to their own types, instead of inlining them.\\nThis helps to reduce type duplication, and makes type errors more readable.\\nIt can also significantly reduce the size of the generated code, the generation time,\\nand the typechecking time.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"printFieldsOnNewLines\": {\n          \"description\": \"If you prefer to have each field in generated types printed on a new line, set this to true.\\nThis can be useful for improving readability of the resulting types,\\nwithout resorting to running tools like Prettier on the output.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"includeExternalFragments\": {\n          \"description\": \"Whether to include external fragments in the generated code. External fragments are not defined\\nin the same location as the operation definition.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"ApolloAngularRawPluginConfig\": {\n      \"description\": \"This plugin generates Apollo services (`Query`, `Mutation` and `Subscription`) with TypeScript typings.\\n\\nIt will generate a strongly typed Angular service for every defined query, mutation or subscription. The generated Angular services are ready to inject and use within your Angular component.\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\\n\\nTo shed some more light regards this template, it's recommended to go through this article: https://apollo-angular.com/docs/get-started, and to read the Code Generation with Apollo Angular: https://the-guild.dev/blog/apollo-angular-12\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"apolloAngularVersion\": {\n          \"description\": \"Version of `apollo-angular` package\\nDefault value: \\\"2\\\"\",\n          \"type\": \"number\"\n        },\n        \"ngModule\": {\n          \"description\": \"Allows to define `ngModule` as part of the plugin's config so it's globally available.\",\n          \"type\": \"string\"\n        },\n        \"namedClient\": { \"description\": \"Defined the global value of `namedClient`.\", \"type\": \"string\" },\n        \"serviceName\": { \"description\": \"Defined the global value of `serviceName`.\", \"type\": \"string\" },\n        \"serviceProvidedInRoot\": {\n          \"description\": \"Defined the global value of `serviceProvidedInRoot`.\",\n          \"type\": \"boolean\"\n        },\n        \"serviceProvidedIn\": { \"description\": \"Define the Injector of the SDK class.\", \"type\": \"string\" },\n        \"sdkClass\": {\n          \"description\": \"Set to `true` in order to generate a SDK service class that uses all generated services.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"querySuffix\": {\n          \"description\": \"Allows to define a custom suffix for query operations.\\nDefault value: \\\"GQL\\\"\",\n          \"type\": \"string\"\n        },\n        \"mutationSuffix\": {\n          \"description\": \"Allows to define a custom suffix for mutation operations.\\nDefault value: \\\"GQL\\\"\",\n          \"type\": \"string\"\n        },\n        \"subscriptionSuffix\": {\n          \"description\": \"Allows to define a custom suffix for Subscription operations.\\nDefault value: \\\"GQL\\\"\",\n          \"type\": \"string\"\n        },\n        \"apolloAngularPackage\": {\n          \"description\": \"Allows to define a custom Apollo-Angular package to import types from.\\nDefault value: \\\"'apollo-angular'\\\"\",\n          \"type\": \"string\"\n        },\n        \"additionalDI\": {\n          \"description\": \"Add additional dependency injections for generated services\\nDefault value: \\\"\\\"\",\n          \"type\": \"array\",\n          \"items\": { \"type\": \"string\" }\n        },\n        \"addExplicitOverride\": {\n          \"description\": \"Add `override` modifier to make the generated code compatible with the `noImplicitOverride` option of Typescript v4.3+.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"noGraphQLTag\": {\n          \"description\": \"Deprecated. Changes the documentMode to `documentNode`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"gqlImport\": {\n          \"description\": \"Customize from which module will `gql` be imported from.\\nThis is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\\nDefault value: \\\"graphql-tag#gql\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentNodeImport\": {\n          \"description\": \"Customize from which module will `DocumentNode` be imported from.\\nThis is useful if you want to use modules other than `graphql`, e.g. `@graphql-typed-document-node`.\\nDefault value: \\\"graphql#DocumentNode\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL operations variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL operations variables suffix.\\nDefault value: \\\"Document\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL fragments variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL fragments variables suffix.\\nDefault value: \\\"FragmentDoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentMode\": {\n          \"$ref\": \"#/definitions/DocumentMode\",\n          \"description\": \"Declares how DocumentNode are created:\\n\\n- `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\\n- `documentNode`: document nodes will be generated as objects when we generate the templates.\\n- `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\\n- `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\\n\\nNote that some plugins (like `typescript-graphql-request`) also supports `string` for this parameter.\\nDefault value: \\\"graphQLTag\\\"\"\n        },\n        \"optimizeDocumentNode\": {\n          \"description\": \"If you are using `documentNode: documentMode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\\nThis will remove all \\\"loc\\\" and \\\"description\\\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importOperationTypesFrom\": {\n          \"description\": \"This config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\\nThis is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"importDocumentNodeExternallyFrom\": {\n          \"description\": \"This config should be used if `documentMode` is `external`. This has 2 usage:\\n\\n- any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\\n- 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"pureMagicComment\": {\n          \"description\": \"This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"NhostPluginConfig\": {\n      \"description\": \"This plugin generates the Typescript schema that enables queries and mutations to be typed in the Nhost SDK.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap_3\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        }\n      }\n    },\n    \"UrqlRawPluginConfig\": {\n      \"description\": \"This plugin generates `urql` (https://github.com/FormidableLabs/urql) components and HOC with TypeScript typings.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"withComponent\": {\n          \"description\": \"Customized the output by enabling/disabling the generated Component.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"withHooks\": {\n          \"description\": \"Customized the output by enabling/disabling the generated React Hooks.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"urqlImportFrom\": {\n          \"description\": \"You can specify module that exports components `Query`, `Mutation`, `Subscription` and HOCs\\nThis is useful for further abstraction of some common tasks (e.g. error handling).\\nFilepath relative to generated file can be also specified.\\nDefault value: \\\"urql\\\"\",\n          \"type\": \"string\"\n        },\n        \"noGraphQLTag\": {\n          \"description\": \"Deprecated. Changes the documentMode to `documentNode`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"gqlImport\": {\n          \"description\": \"Customize from which module will `gql` be imported from.\\nThis is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\\nDefault value: \\\"graphql-tag#gql\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentNodeImport\": {\n          \"description\": \"Customize from which module will `DocumentNode` be imported from.\\nThis is useful if you want to use modules other than `graphql`, e.g. `@graphql-typed-document-node`.\\nDefault value: \\\"graphql#DocumentNode\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL operations variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL operations variables suffix.\\nDefault value: \\\"Document\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL fragments variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL fragments variables suffix.\\nDefault value: \\\"FragmentDoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentMode\": {\n          \"$ref\": \"#/definitions/DocumentMode\",\n          \"description\": \"Declares how DocumentNode are created:\\n\\n- `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\\n- `documentNode`: document nodes will be generated as objects when we generate the templates.\\n- `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\\n- `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\\n\\nNote that some plugins (like `typescript-graphql-request`) also supports `string` for this parameter.\\nDefault value: \\\"graphQLTag\\\"\"\n        },\n        \"optimizeDocumentNode\": {\n          \"description\": \"If you are using `documentNode: documentMode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\\nThis will remove all \\\"loc\\\" and \\\"description\\\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importOperationTypesFrom\": {\n          \"description\": \"This config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\\nThis is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"importDocumentNodeExternallyFrom\": {\n          \"description\": \"This config should be used if `documentMode` is `external`. This has 2 usage:\\n\\n- any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\\n- 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"pureMagicComment\": {\n          \"description\": \"This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"ReactApolloRawPluginConfig\": {\n      \"description\": \"This plugin generates React Apollo components and HOC with TypeScript typings.\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"withComponent\": {\n          \"description\": \"Customize the output by enabling/disabling the generated Component (deprecated since Apollo-Client v3). For more details: https://apollographql.com/docs/react/api/react/components\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"withHOC\": {\n          \"description\": \"Customize the output by enabling/disabling the HOC (deprecated since Apollo-Client v3). For more details: https://apollographql.com/docs/react/api/react/hoc\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"withHooks\": {\n          \"description\": \"Customized the output by enabling/disabling the generated React Hooks. For more details: https://apollographql.com/docs/react/api/react/hooks\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"withMutationFn\": {\n          \"description\": \"Customized the output by enabling/disabling the generated mutation function signature.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"withRefetchFn\": {\n          \"description\": \"Enable generating a function to be used with refetchQueries\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"apolloReactCommonImportFrom\": {\n          \"description\": \"Customize the package where apollo-react common lib is loaded from.\\nDefault value: \\\"@apollo/react-common\\\"\",\n          \"type\": \"string\"\n        },\n        \"apolloReactComponentsImportFrom\": {\n          \"description\": \"Customize the package where apollo-react component lib is loaded from.\\nDefault value: \\\"@apollo/react-components\\\"\",\n          \"type\": \"string\"\n        },\n        \"apolloReactHocImportFrom\": {\n          \"description\": \"Customize the package where apollo-react HOC lib is loaded from.\\nDefault value: \\\"@apollo/react-hoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"apolloReactHooksImportFrom\": {\n          \"description\": \"Customize the package where apollo-react hooks lib is loaded from.\\nDefault value: \\\"@apollo/react-hooks\\\"\",\n          \"type\": \"string\"\n        },\n        \"componentSuffix\": {\n          \"description\": \"You can specify a suffix that gets attached to the name of the generated component.\\nDefault value: \\\"Component\\\"\",\n          \"type\": \"string\"\n        },\n        \"reactApolloVersion\": {\n          \"description\": \"Sets the version of react-apollo.\\nIf you are using the old (deprecated) package of `react-apollo`, please set this configuration to `2`.\\nIf you are using Apollo-Client v3, please set this to `3`.\\nDefault value: \\\"3\\\"\",\n          \"enum\": [2, 3],\n          \"type\": \"number\"\n        },\n        \"withResultType\": {\n          \"description\": \"Customized the output by enabling/disabling the generated result type.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"withMutationOptionsType\": {\n          \"description\": \"Customized the output by enabling/disabling the generated mutation option type.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"addDocBlocks\": {\n          \"description\": \"Allows you to enable/disable the generation of docblocks in generated code.\\nSome IDE's (like VSCode) add extra inline information with docblocks, you can disable this feature if your preferred IDE does not.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultBaseOptions\": { \"type\": \"object\", \"additionalProperties\": { \"type\": \"string\" } },\n        \"hooksSuffix\": { \"type\": \"string\" },\n        \"noGraphQLTag\": {\n          \"description\": \"Deprecated. Changes the documentMode to `documentNode`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"gqlImport\": {\n          \"description\": \"Customize from which module will `gql` be imported from.\\nThis is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\\nDefault value: \\\"graphql-tag#gql\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentNodeImport\": {\n          \"description\": \"Customize from which module will `DocumentNode` be imported from.\\nThis is useful if you want to use modules other than `graphql`, e.g. `@graphql-typed-document-node`.\\nDefault value: \\\"graphql#DocumentNode\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL operations variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL operations variables suffix.\\nDefault value: \\\"Document\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL fragments variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL fragments variables suffix.\\nDefault value: \\\"FragmentDoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentMode\": {\n          \"$ref\": \"#/definitions/DocumentMode\",\n          \"description\": \"Declares how DocumentNode are created:\\n\\n- `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\\n- `documentNode`: document nodes will be generated as objects when we generate the templates.\\n- `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\\n- `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\\n\\nNote that some plugins (like `typescript-graphql-request`) also supports `string` for this parameter.\\nDefault value: \\\"graphQLTag\\\"\"\n        },\n        \"optimizeDocumentNode\": {\n          \"description\": \"If you are using `documentNode: documentMode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\\nThis will remove all \\\"loc\\\" and \\\"description\\\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importOperationTypesFrom\": {\n          \"description\": \"This config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\\nThis is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"importDocumentNodeExternallyFrom\": {\n          \"description\": \"This config should be used if `documentMode` is `external`. This has 2 usage:\\n\\n- any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\\n- 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"pureMagicComment\": {\n          \"description\": \"This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"VueApolloRawPluginConfig\": {\n      \"description\": \"This plugin generates\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"withCompositionFunctions\": {\n          \"description\": \"Customized the output by enabling/disabling the generated Vue composition functions.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"vueApolloComposableImportFrom\": { \"type\": \"string\", \"description\": \"\\nDefault value: \\\"\\\"\" },\n        \"vueCompositionApiImportFrom\": { \"type\": \"string\", \"description\": \"\\nDefault value: \\\"\\\"\" },\n        \"addDocBlocks\": {\n          \"description\": \"Allows you to enable/disable the generation of docblocks in generated code.\\nSome IDE's (like VSCode) add extra inline information with docblocks, you can disable this feature if your preferred IDE does not.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"noGraphQLTag\": {\n          \"description\": \"Deprecated. Changes the documentMode to `documentNode`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"gqlImport\": {\n          \"description\": \"Customize from which module will `gql` be imported from.\\nThis is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\\nDefault value: \\\"graphql-tag#gql\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentNodeImport\": {\n          \"description\": \"Customize from which module will `DocumentNode` be imported from.\\nThis is useful if you want to use modules other than `graphql`, e.g. `@graphql-typed-document-node`.\\nDefault value: \\\"graphql#DocumentNode\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL operations variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL operations variables suffix.\\nDefault value: \\\"Document\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL fragments variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL fragments variables suffix.\\nDefault value: \\\"FragmentDoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentMode\": {\n          \"$ref\": \"#/definitions/DocumentMode\",\n          \"description\": \"Declares how DocumentNode are created:\\n\\n- `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\\n- `documentNode`: document nodes will be generated as objects when we generate the templates.\\n- `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\\n- `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\\n\\nNote that some plugins (like `typescript-graphql-request`) also supports `string` for this parameter.\\nDefault value: \\\"graphQLTag\\\"\"\n        },\n        \"optimizeDocumentNode\": {\n          \"description\": \"If you are using `documentNode: documentMode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\\nThis will remove all \\\"loc\\\" and \\\"description\\\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importOperationTypesFrom\": {\n          \"description\": \"This config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\\nThis is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"importDocumentNodeExternallyFrom\": {\n          \"description\": \"This config should be used if `documentMode` is `external`. This has 2 usage:\\n\\n- any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\\n- 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"pureMagicComment\": {\n          \"description\": \"This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"VueApolloSmartOpsRawPluginConfig\": {\n      \"description\": \"This plugin generates Vue Apollo Smart Query, Smart Subscription and mutation operation functions with\\nTypeScript typings.\\n\\nThis plugin relies on some helper functions and types from the `vue-apollo-smart-ops` package. That package also adds\\nsome optional functionality for improved error handling in Vue Apollo operations which can be configured in the\\ngenerated code from this plugin.\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` -\\nand thus shares a similar configuration.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"withSmartOperationFunctions\": {\n          \"description\": \"Customize the output by enabling/disabling the generated Vue Apollo Smart Operations functions.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"vueApolloOperationFunctionsImportFrom\": {\n          \"description\": \"The `typescript-vue-apollo-smart-ops` plugin requires three functions that are used to define your\\nquery, subscription and mutation operation functions:\\n\\n- `createMutationFunction`\\n- `createSmartQueryOptionsFunction`\\n- `createSmartSubscriptionOptionsFunction`\\n\\nBy default, these functions are provided by the `vue-apollo-smart-ops` package, but you can substitute\\nyour own import path if you want to replace them with other implementations.\\nDefault value: \\\"vue-apollo-smart-ops\\\"\",\n          \"type\": \"string\"\n        },\n        \"vueApolloErrorType\": {\n          \"description\": \"The operation functions generated by `typescript-vue-apollo-smart-ops` include some functionality for\\nerror handling. This configuration parameter allows you to customise the name of the error type that\\nwill be used. The default is to use `ApolloError` from the `apollo-client` package.\\nDefault value: \\\"ApolloError\\\"\",\n          \"type\": \"string\"\n        },\n        \"vueApolloErrorTypeImportFrom\": {\n          \"description\": \"The operation functions generated by `typescript-vue-apollo-smart-ops` include some functionality for\\nerror handling. This configuration parameter allows you to customise the package where the error type\\nwill be imported from. The default is to use `ApolloError` from the `apollo-client` package.\\nDefault value: \\\"vue-apollo-smart-ops\\\"\",\n          \"type\": \"string\"\n        },\n        \"vueApolloErrorHandlerFunction\": {\n          \"description\": \"The operation functions generated by `typescript-vue-apollo-smart-ops` include some functionality for\\nerror handling. You may supply an error handler function that will be called when an error occurs in\\na query, subscription or mutation operation. This function should implement the\\n`ApolloOperationErrorHandlerFunction` interface from `vue-apollo-smart-ops` package. You can\\nhave a custom handler in your app that shows a notification to the user, for example. If unspecified,\\nthis functionality will be disabled and errors handled (or not) by Vue Apollo in the normal way.\\nDefault value: \\\"undefined\\\"\",\n          \"type\": \"string\"\n        },\n        \"vueApolloErrorHandlerFunctionImportFrom\": {\n          \"description\": \"The import path where `vueApolloErrorHandlerFunction` should be imported from. Can be a package name\\nor a local file path (anything that works in an import statement).\\nDefault value: \\\"undefined\\\"\",\n          \"type\": \"string\"\n        },\n        \"vueAppType\": {\n          \"description\": \"The operation functions generated by `typescript-vue-apollo-smart-ops` include some functionality for\\nerror handling. When an error occurs, the Vue app instance is passed to the error handler. You can\\ncustomise the expected type of the app object. For example, a Nuxt.js app might use `NuxtApp` from\\n`@nuxt/types/app` instead. When unspecified, the default type is `Vue` from `vue/types/vue`.\\nDefault value: \\\"undefined\\\"\",\n          \"type\": \"string\"\n        },\n        \"vueAppTypeImportFrom\": {\n          \"description\": \"The import path where `vueAppType` should be imported from. Can be a package name or a local file path\\n(anything that works in an import statement).\\nDefault value: \\\"undefined\\\"\",\n          \"type\": \"string\"\n        },\n        \"addDocBlocks\": {\n          \"description\": \"Allows you to enable/disable the generation of docblocks in generated code.\\nSome IDE's (like VSCode) add extra inline information with docblocks, you can disable this feature if\\nyour preferred IDE does not.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"noGraphQLTag\": {\n          \"description\": \"Deprecated. Changes the documentMode to `documentNode`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"gqlImport\": {\n          \"description\": \"Customize from which module will `gql` be imported from.\\nThis is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\\nDefault value: \\\"graphql-tag#gql\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentNodeImport\": {\n          \"description\": \"Customize from which module will `DocumentNode` be imported from.\\nThis is useful if you want to use modules other than `graphql`, e.g. `@graphql-typed-document-node`.\\nDefault value: \\\"graphql#DocumentNode\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL operations variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL operations variables suffix.\\nDefault value: \\\"Document\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL fragments variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL fragments variables suffix.\\nDefault value: \\\"FragmentDoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentMode\": {\n          \"$ref\": \"#/definitions/DocumentMode\",\n          \"description\": \"Declares how DocumentNode are created:\\n\\n- `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\\n- `documentNode`: document nodes will be generated as objects when we generate the templates.\\n- `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\\n- `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\\n\\nNote that some plugins (like `typescript-graphql-request`) also supports `string` for this parameter.\\nDefault value: \\\"graphQLTag\\\"\"\n        },\n        \"optimizeDocumentNode\": {\n          \"description\": \"If you are using `documentNode: documentMode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\\nThis will remove all \\\"loc\\\" and \\\"description\\\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importOperationTypesFrom\": {\n          \"description\": \"This config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\\nThis is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"importDocumentNodeExternallyFrom\": {\n          \"description\": \"This config should be used if `documentMode` is `external`. This has 2 usage:\\n\\n- any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\\n- 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"pureMagicComment\": {\n          \"description\": \"This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"VueUrqlRawPluginConfig\": {\n      \"description\": \"This plugin generates `urql` (https://github.com/FormidableLabs/urql) composition functions with TypeScript typings.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"withComposition\": {\n          \"description\": \"Customized the output by enabling/disabling the generated Vue Composition functions.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"urqlImportFrom\": {\n          \"description\": \"You can specify module that exports components `Query`, `Mutation`, `Subscription`\\nThis is useful for further abstraction of some common tasks (e.g. error handling).\\nFilepath relative to generated file can be also specified.\\nDefault value: \\\"urql\\\"\",\n          \"type\": \"string\"\n        },\n        \"noGraphQLTag\": {\n          \"description\": \"Deprecated. Changes the documentMode to `documentNode`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"gqlImport\": {\n          \"description\": \"Customize from which module will `gql` be imported from.\\nThis is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\\nDefault value: \\\"graphql-tag#gql\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentNodeImport\": {\n          \"description\": \"Customize from which module will `DocumentNode` be imported from.\\nThis is useful if you want to use modules other than `graphql`, e.g. `@graphql-typed-document-node`.\\nDefault value: \\\"graphql#DocumentNode\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL operations variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL operations variables suffix.\\nDefault value: \\\"Document\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL fragments variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL fragments variables suffix.\\nDefault value: \\\"FragmentDoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentMode\": {\n          \"$ref\": \"#/definitions/DocumentMode\",\n          \"description\": \"Declares how DocumentNode are created:\\n\\n- `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\\n- `documentNode`: document nodes will be generated as objects when we generate the templates.\\n- `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\\n- `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\\n\\nNote that some plugins (like `typescript-graphql-request`) also supports `string` for this parameter.\\nDefault value: \\\"graphQLTag\\\"\"\n        },\n        \"optimizeDocumentNode\": {\n          \"description\": \"If you are using `documentNode: documentMode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\\nThis will remove all \\\"loc\\\" and \\\"description\\\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importOperationTypesFrom\": {\n          \"description\": \"This config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\\nThis is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"importDocumentNodeExternallyFrom\": {\n          \"description\": \"This config should be used if `documentMode` is `external`. This has 2 usage:\\n\\n- any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\\n- 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"pureMagicComment\": {\n          \"description\": \"This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"StencilApolloRawPluginConfig\": {\n      \"description\": \"This plugin generates Stencil Apollo functional components typings\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"componentType\": {\n          \"$ref\": \"#/definitions/StencilComponentType\",\n          \"description\": \"Customize the output of the plugin - you can choose to generate a Component class or a function component.\\nDefault value: \\\"functional\\\"\"\n        },\n        \"noGraphQLTag\": {\n          \"description\": \"Deprecated. Changes the documentMode to `documentNode`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"gqlImport\": {\n          \"description\": \"Customize from which module will `gql` be imported from.\\nThis is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\\nDefault value: \\\"graphql-tag#gql\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentNodeImport\": {\n          \"description\": \"Customize from which module will `DocumentNode` be imported from.\\nThis is useful if you want to use modules other than `graphql`, e.g. `@graphql-typed-document-node`.\\nDefault value: \\\"graphql#DocumentNode\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL operations variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL operations variables suffix.\\nDefault value: \\\"Document\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL fragments variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL fragments variables suffix.\\nDefault value: \\\"FragmentDoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentMode\": {\n          \"$ref\": \"#/definitions/DocumentMode\",\n          \"description\": \"Declares how DocumentNode are created:\\n\\n- `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\\n- `documentNode`: document nodes will be generated as objects when we generate the templates.\\n- `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\\n- `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\\n\\nNote that some plugins (like `typescript-graphql-request`) also supports `string` for this parameter.\\nDefault value: \\\"graphQLTag\\\"\"\n        },\n        \"optimizeDocumentNode\": {\n          \"description\": \"If you are using `documentNode: documentMode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\\nThis will remove all \\\"loc\\\" and \\\"description\\\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importOperationTypesFrom\": {\n          \"description\": \"This config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\\nThis is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"importDocumentNodeExternallyFrom\": {\n          \"description\": \"This config should be used if `documentMode` is `external`. This has 2 usage:\\n\\n- any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\\n- 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"pureMagicComment\": {\n          \"description\": \"This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"TypeScriptDocumentNodesRawPluginConfig\": {\n      \"description\": \"This plugin generates TypeScript source `.ts` file from GraphQL files `.graphql`.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention_1\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"namePrefix\": { \"description\": \"Adds prefix to the name\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"nameSuffix\": { \"description\": \"Adds suffix to the name\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"fragmentPrefix\": {\n          \"description\": \"Adds prefix to the fragment variable\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentSuffix\": {\n          \"description\": \"Adds suffix to the fragment variable\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"gqlImport\": {\n          \"description\": \"Customize from which module will `gql` be imported from.\\nThis is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\\nDefault value: \\\"graphql-tag#gql\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentNodeImport\": {\n          \"description\": \"Customize from which module will `DocumentNode` be imported from.\\nThis is useful if you want to use modules other than `graphql`, e.g. `@graphql-typed-document-node`.\\nDefault value: \\\"graphql#DocumentNode\\\"\",\n          \"type\": \"string\"\n        },\n        \"noExport\": {\n          \"description\": \"Set this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL operations variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL operations variables suffix.\\nDefault value: \\\"Document\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariablePrefix\": {\n          \"description\": \"Changes the GraphQL fragments variables prefix.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"fragmentVariableSuffix\": {\n          \"description\": \"Changes the GraphQL fragments variables suffix.\\nDefault value: \\\"FragmentDoc\\\"\",\n          \"type\": \"string\"\n        },\n        \"documentMode\": {\n          \"$ref\": \"#/definitions/DocumentMode_2\",\n          \"description\": \"Declares how DocumentNode are created:\\n\\n- `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\\n- `documentNode`: document nodes will be generated as objects when we generate the templates.\\n- `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\\n- `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\\n\\nNote that some plugins (like `typescript-graphql-request`) also supports `string` for this parameter.\\nDefault value: \\\"graphQLTag\\\"\"\n        },\n        \"optimizeDocumentNode\": {\n          \"description\": \"If you are using `documentMode: documentNode | documentNodeImportFragments`, you can set this to `true` to apply document optimizations for your GraphQL document.\\nThis will remove all \\\"loc\\\" and \\\"description\\\" fields from the compiled document, and will remove all empty arrays (such as `directives`, `arguments` and `variableDefinitions`).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importOperationTypesFrom\": {\n          \"description\": \"This config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\\nThis is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"importDocumentNodeExternallyFrom\": {\n          \"description\": \"This config should be used if `documentMode` is `external`. This has 2 usage:\\n\\n- any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\\n- 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"pureMagicComment\": {\n          \"description\": \"This config adds PURE magic comment to the static variables to enforce treeshaking for your bundler.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap_1\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\n\\\"mask\\\" transforms the types for use with fragment masking. Useful when masked types are needed when not using the \\\"client\\\" preset e.g. such as combining it with Apollo Client's data masking feature.\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"importExtension\": {\n          \"description\": \"Append this extension to all imports.\\nUseful for ESM environments that require file extensions in import statements.\",\n          \"anyOf\": [\n            { \"type\": \"array\", \"items\": { \"type\": \"string\" } },\n            { \"enum\": [\"\"], \"type\": \"string\" }\n          ]\n        },\n        \"extractAllFieldsToTypes\": {\n          \"description\": \"Extract all field types to their own types, instead of inlining them.\\nThis helps to reduce type duplication, and makes type errors more readable.\\nIt can also significantly reduce the size of the generated code, the generation time,\\nand the typechecking time.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"printFieldsOnNewLines\": {\n          \"description\": \"If you prefer to have each field in generated types printed on a new line, set this to true.\\nThis can be useful for improving readability of the resulting types,\\nwithout resorting to running tools like Prettier on the output.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"includeExternalFragments\": {\n          \"description\": \"Whether to include external fragments in the generated code. External fragments are not defined\\nin the same location as the operation definition.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"MSWConfig\": {\n      \"description\": \"This plugin generates `msw` (https://github.com/mswjs/msw) mock handlers with TypeScript typings.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"link\": {\n          \"description\": \"GraphQL endpoint to use when working with multiple backends.\",\n          \"type\": \"object\",\n          \"properties\": {\n            \"endpoint\": { \"type\": \"string\" },\n            \"name\": { \"type\": \"string\" },\n            \"withSuffix\": { \"type\": \"boolean\" }\n          }\n        }\n      }\n    },\n    \"JavaApolloAndroidPluginConfig\": {\n      \"description\": \"This plugin and presets creates generated mappers and parsers for a complete type-safe GraphQL requests, for developers that uses Apollo Android runtime.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"package\": {\n          \"description\": \"Customize the Java package name for the generated operations. The default package name will be generated according to the output file path.\",\n          \"type\": \"string\"\n        },\n        \"typePackage\": {\n          \"description\": \"Customize the Java package name for the types generated based on input types.\",\n          \"type\": \"string\"\n        },\n        \"fragmentPackage\": {\n          \"description\": \"Customize the Java package name for the fragments generated classes.\",\n          \"type\": \"string\"\n        },\n        \"fileType\": { \"$ref\": \"#/definitions/FileType\" },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"JavaResolversPluginRawConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"package\": {\n          \"description\": \"Customize the Java package name. The default package name will be generated according to the output file path.\",\n          \"type\": \"string\"\n        },\n        \"mappers\": {\n          \"description\": \"Allow you to replace specific GraphQL types with your custom model classes. This is useful when you want to make sure your resolvers returns the correct class.\\nThe default value is the values set by `defaultMapper` configuration.\\nYou can use a direct path to the package, or use `package#class` syntax to have it imported.\",\n          \"type\": \"object\",\n          \"additionalProperties\": { \"type\": \"string\" }\n        },\n        \"defaultMapper\": {\n          \"description\": \"Sets the default mapper value in case it's not specified by `mappers`.\\nYou can use a direct path to the package, or use `package#class` syntax to have it imported.\\nThe default mapper is Java's `Object`.\\nDefault value: \\\"Object\\\"\",\n          \"type\": \"string\"\n        },\n        \"className\": {\n          \"description\": \"Allow you to customize the parent class name.\\nDefault value: \\\"Resolvers\\\"\",\n          \"type\": \"string\"\n        },\n        \"listType\": {\n          \"description\": \"Allow you to customize the list type.\\nDefault value: \\\"Iterable\\\"\",\n          \"type\": \"string\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"KotlinResolversPluginRawConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"package\": {\n          \"description\": \"Customize the Java package name. The default package name will be generated according to the output file path.\",\n          \"type\": \"string\"\n        },\n        \"enumValues\": {\n          \"$ref\": \"#/definitions/EnumValuesMap_2\",\n          \"description\": \"Overrides the default value of enum values declared in your GraphQL schema.\"\n        },\n        \"listType\": {\n          \"description\": \"Allow you to customize the list type\\nDefault value: \\\"Iterable\\\"\",\n          \"type\": \"string\"\n        },\n        \"withTypes\": {\n          \"description\": \"Allow you to enable generation for the types\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitJvmStatic\": {\n          \"description\": \"Allow you to omit JvmStatic annotation\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"FlowPluginConfig\": {\n      \"description\": \"This plugin generates Flow types based on your `GraphQLSchema`.\\n\\nIt generates types for your entire schema: types, input types, enum, interface, scalar and union.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"useFlowExactObjects\": {\n          \"description\": \"Generates Flow types as Exact types.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useFlowReadOnlyTypes\": {\n          \"description\": \"Generates read-only Flow types\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"addUnderscoreToArgsType\": {\n          \"description\": \"Adds `_` to generated `Args` types in order to avoid duplicate identifiers.\",\n          \"type\": \"boolean\"\n        },\n        \"enumValues\": {\n          \"$ref\": \"#/definitions/EnumValuesMap_2\",\n          \"description\": \"Overrides the default value of enum values declared in your GraphQL schema.\\nYou can also map the entire enum to an external type by providing a string that of `module#type`.\"\n        },\n        \"declarationKind\": {\n          \"description\": \"Overrides the default output for various GraphQL elements.\",\n          \"anyOf\": [\n            { \"$ref\": \"#/definitions/DeclarationKindConfig_2\" },\n            { \"enum\": [\"abstract class\", \"class\", \"interface\", \"type\"], \"type\": \"string\" }\n          ]\n        },\n        \"enumPrefix\": {\n          \"description\": \"Allow you to disable prefixing for generated enums, works in combination with `typesPrefix`.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"fieldWrapperValue\": {\n          \"description\": \"Allow you to add wrapper for field type, use T as the generic value. Make sure to set `wrapFieldDefinitions` to `true` in order to make this flag work.\\nDefault value: \\\"T\\\"\",\n          \"type\": \"string\"\n        },\n        \"wrapFieldDefinitions\": {\n          \"description\": \"Set to `true` in order to wrap field definitions with `FieldWrapper`.\\nThis is useful to allow return types such as Promises and functions.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"onlyEnums\": {\n          \"description\": \"This will cause the generator to emit types for enums only\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"onlyOperationTypes\": {\n          \"description\": \"This will cause the generator to emit types for operations only (basically only enums and scalars)\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"ignoreEnumValuesFromSchema\": {\n          \"description\": \"This will cause the generator to ignore enum values defined in GraphQLSchema\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"wrapEntireFieldDefinitions\": {\n          \"type\": \"boolean\",\n          \"description\": \"Set to `true` in order to wrap field definitions with `EntireFieldWrapper`.\\nThis is useful to allow return types such as Promises and functions for fields.\\nDiffers from `wrapFieldDefinitions` in that this wraps the entire field definition if i.e. the field is an Array, while\\n`wrapFieldDefinitions` will wrap every single value inside the array.\\nDefault value: \\\"true\\\"\"\n        },\n        \"entireFieldWrapperValue\": {\n          \"type\": \"string\",\n          \"description\": \"Allow to override the type value of `EntireFieldWrapper`. This wrapper applies outside of Array and Maybe\\nunlike `fieldWrapperValue`, that will wrap the inner type.\\nDefault value: \\\"T | Promise<T> | (() => T | Promise<T>)\\\"\"\n        },\n        \"directiveArgumentAndInputFieldMappings\": {\n          \"$ref\": \"#/definitions/DirectiveArgumentAndInputFieldMappings_2\",\n          \"description\": \"Replaces a GraphQL scalar with a custom type based on the applied directive on an argument or input field.\\n\\nYou can use both `module#type` and `module#namespace#type` syntax.\\nWill NOT work with introspected schemas since directives are not exported.\\nOnly works with directives on ARGUMENT_DEFINITION or INPUT_FIELD_DEFINITION.\\n\\n**WARNING:** Using this option does only change the type definitions.\\n\\nFor actually ensuring that a type is correct at runtime you will have to use schema transforms (e.g. with [@graphql-tools/utils mapSchema](https://graphql-tools.com/docs/schema-directives)) that apply those rules!\\nOtherwise, you might end up with a runtime type mismatch which could cause unnoticed bugs or runtime errors.\\n\\nPlease use this configuration option with care!\"\n        },\n        \"directiveArgumentAndInputFieldMappingTypeSuffix\": {\n          \"description\": \"Adds a suffix to the imported names to prevent name clashes.\",\n          \"type\": \"string\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"FlowResolversPluginConfig\": {\n      \"description\": \"This plugin generates resolvers signature based on your `GraphQLSchema`.\\n\\nIt generates types for your entire schema: types, input types, enum, interface, scalar and union.\\n\\nThis plugin requires you to use `@graphql-codegen/flow` as well, because it depends on it's types.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"addUnderscoreToArgsType\": {\n          \"description\": \"Adds `_` to generated `Args` types in order to avoid duplicate identifiers.\",\n          \"type\": \"boolean\"\n        },\n        \"contextType\": {\n          \"description\": \"Use this configuration to set a custom type for your `context`, and it will\\naffect all the resolvers, without the need to override it using generics each time.\\nIf you wish to use an external type and import it from another file, you can use `add` plugin\\nand add the required `import` statement, or you can use a `module#type` syntax.\",\n          \"type\": \"string\"\n        },\n        \"fieldContextTypes\": {\n          \"$ref\": \"#/definitions/Array_1\",\n          \"description\": \"Use this to set a custom type for a specific field `context`.\\nIt will only affect the targeted resolvers.\\nYou can either use `Field.Path#ContextTypeName` or `Field.Path#ExternalFileName#ContextTypeName`\"\n        },\n        \"rootValueType\": {\n          \"description\": \"Use this configuration to set a custom type for the `rootValue`, and it will\\naffect resolvers of all root types (Query, Mutation and Subscription), without the need to override it using generics each time.\\nIf you wish to use an external type and import it from another file, you can use `add` plugin\\nand add the required `import` statement, or you can use both `module#type` or `module#namespace#type` syntax.\",\n          \"type\": \"string\"\n        },\n        \"directiveContextTypes\": {\n          \"$ref\": \"#/definitions/Array_1\",\n          \"description\": \"Use this to set a custom type for a specific field `context` decorated by a directive.\\nIt will only affect the targeted resolvers.\\nYou can either use `Field.Path#ContextTypeName` or `Field.Path#ExternalFileName#ContextTypeName`\\n\\nContextTypeName should by a generic Type that take the context or field context type as only type parameter.\"\n        },\n        \"mapperTypeSuffix\": {\n          \"description\": \"Adds a suffix to the imported names to prevent name clashes.\",\n          \"type\": \"string\"\n        },\n        \"mappers\": {\n          \"description\": \"Replaces a GraphQL type usage with a custom type, allowing you to return custom object from\\nyour resolvers.\\nYou can use both `module#type` and `module#namespace#type` syntax.\",\n          \"type\": \"object\",\n          \"additionalProperties\": { \"type\": \"string\" }\n        },\n        \"defaultMapper\": {\n          \"description\": \"Allow you to set the default mapper when it's not being override by `mappers` or generics.\\nYou can specify a type name, or specify a string in `module#type` or `module#namespace#type` format.\\nThe default value of mappers is the TypeScript type generated by `typescript` package.\",\n          \"type\": \"string\"\n        },\n        \"avoidOptionals\": {\n          \"description\": \"This will cause the generator to avoid using optionals (`?`),\\nso all field resolvers must be implemented in order to avoid compilation errors.\\nDefault value: \\\"false\\\"\",\n          \"anyOf\": [{ \"$ref\": \"#/definitions/AvoidOptionalsConfig_2\" }, { \"type\": \"boolean\" }]\n        },\n        \"showUnusedMappers\": {\n          \"description\": \"Warns about unused mappers.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"enumValues\": {\n          \"$ref\": \"#/definitions/EnumValuesMap_2\",\n          \"description\": \"Overrides the default value of enum values declared in your GraphQL schema, supported\\nin this plugin because of the need for integration with `typescript` package.\\nSee documentation under `typescript` plugin for more information and examples.\"\n        },\n        \"resolverTypeWrapperSignature\": {\n          \"description\": \"Allow you to override `resolverTypeWrapper` definition.\\nDefault value: \\\"Promise<T> | T\\\"\",\n          \"type\": \"string\"\n        },\n        \"federation\": { \"description\": \"Supports Apollo Federation\\nDefault value: \\\"false\\\"\", \"type\": \"boolean\" },\n        \"enumPrefix\": {\n          \"description\": \"Allow you to disable prefixing for generated enums, works in combination with `typesPrefix`.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"optionalResolveType\": {\n          \"description\": \"Sets the `__resolveType` field as optional field.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"immutableTypes\": {\n          \"description\": \"Generates immutable types by adding `readonly` to properties and uses `ReadonlyArray`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"namespacedImportName\": {\n          \"description\": \"Prefixes all GraphQL related generated types with that value, as namespaces import.\\nYou can use this feature to allow separation of plugins to different files.\\nDefault value: \\\"''\\\"\",\n          \"type\": \"string\"\n        },\n        \"resolverTypeSuffix\": {\n          \"description\": \"Suffix we add to each generated type resolver.\\nDefault value: \\\"Resolvers\\\"\",\n          \"type\": \"string\"\n        },\n        \"allResolversTypeName\": {\n          \"description\": \"The type name to use when exporting all resolvers signature as unified type.\\nDefault value: \\\"Resolvers\\\"\",\n          \"type\": \"string\"\n        },\n        \"internalResolversPrefix\": {\n          \"type\": \"string\",\n          \"description\": \"Defines the prefix value used for `__resolveType` and `__isTypeOf` resolvers.\\nIf you are using `mercurius-js`, please set this field to empty string for better compatibility.\\nDefault value: \\\"'__'\\\"\"\n        },\n        \"onlyResolveTypeForInterfaces\": {\n          \"type\": \"boolean\",\n          \"description\": \"Turning this flag to `true` will generate resolver signature that has only `resolveType` for interfaces, forcing developers to write inherited type resolvers in the type itself.\\nDefault value: \\\"false\\\"\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"FlowDocumentsPluginConfig\": {\n      \"description\": \"This plugin generates Flow types based on your `GraphQLSchema` and your GraphQL operations and fragments.\\n\\nIt generates types for your GraphQL documents: Query, Mutation, Subscription and Fragment.\\n\\nThis plugin requires you to use `@graphql-codegen/flow` as well, because it depends on its types.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"useFlowExactObjects\": {\n          \"description\": \"Generates Flow types as Exact types.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useFlowReadOnlyTypes\": {\n          \"description\": \"Generates read-only Flow types\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"flattenGeneratedTypes\": {\n          \"description\": \"Flatten fragment spread and inline fragments into a simple selection set before generating.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"preResolveTypes\": {\n          \"description\": \"Uses primitive types where possible.\\nSet to `false` in order to use `Pick` and take use the types generated by `typescript` plugin.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"skipTypeNameForRoot\": {\n          \"description\": \"Avoid adding `__typename` for root types. This is ignored when a selection explicitly specifies `__typename`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"globalNamespace\": {\n          \"description\": \"Puts all generated code under `global` namespace. Useful for Stencil integration.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"operationResultSuffix\": {\n          \"description\": \"Adds a suffix to generated operation result type names\\nDefault value: \\\"\\\"\",\n          \"type\": \"string\"\n        },\n        \"dedupeOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"omitOperationSuffix\": {\n          \"description\": \"Set this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"exportFragmentSpreadSubTypes\": {\n          \"description\": \"If set to true, it will export the sub-types created in order to make it easier to access fields declared under fragment spread.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"If set to true, it will enable support for parsing variables on fragments.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"mergeFragmentTypes\": {\n          \"description\": \"If set to true, merge equal fragment interfaces.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"addUnderscoreToArgsType\": {\n          \"description\": \"Adds `_` to generated `Args` types in order to avoid duplicate identifiers.\",\n          \"type\": \"boolean\"\n        },\n        \"enumValues\": {\n          \"$ref\": \"#/definitions/EnumValuesMap_2\",\n          \"description\": \"Overrides the default value of enum values declared in your GraphQL schema.\\nYou can also map the entire enum to an external type by providing a string that of `module#type`.\"\n        },\n        \"declarationKind\": {\n          \"description\": \"Overrides the default output for various GraphQL elements.\",\n          \"anyOf\": [\n            { \"$ref\": \"#/definitions/DeclarationKindConfig_2\" },\n            { \"enum\": [\"abstract class\", \"class\", \"interface\", \"type\"], \"type\": \"string\" }\n          ]\n        },\n        \"enumPrefix\": {\n          \"description\": \"Allow you to disable prefixing for generated enums, works in combination with `typesPrefix`.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"fieldWrapperValue\": {\n          \"description\": \"Allow you to add wrapper for field type, use T as the generic value. Make sure to set `wrapFieldDefinitions` to `true` in order to make this flag work.\\nDefault value: \\\"T\\\"\",\n          \"type\": \"string\"\n        },\n        \"wrapFieldDefinitions\": {\n          \"description\": \"Set to `true` in order to wrap field definitions with `FieldWrapper`.\\nThis is useful to allow return types such as Promises and functions.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"onlyEnums\": {\n          \"description\": \"This will cause the generator to emit types for enums only\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"onlyOperationTypes\": {\n          \"description\": \"This will cause the generator to emit types for operations only (basically only enums and scalars)\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"ignoreEnumValuesFromSchema\": {\n          \"description\": \"This will cause the generator to ignore enum values defined in GraphQLSchema\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"wrapEntireFieldDefinitions\": {\n          \"type\": \"boolean\",\n          \"description\": \"Set to `true` in order to wrap field definitions with `EntireFieldWrapper`.\\nThis is useful to allow return types such as Promises and functions for fields.\\nDiffers from `wrapFieldDefinitions` in that this wraps the entire field definition if i.e. the field is an Array, while\\n`wrapFieldDefinitions` will wrap every single value inside the array.\\nDefault value: \\\"true\\\"\"\n        },\n        \"entireFieldWrapperValue\": {\n          \"type\": \"string\",\n          \"description\": \"Allow to override the type value of `EntireFieldWrapper`. This wrapper applies outside of Array and Maybe\\nunlike `fieldWrapperValue`, that will wrap the inner type.\\nDefault value: \\\"T | Promise<T> | (() => T | Promise<T>)\\\"\"\n        },\n        \"directiveArgumentAndInputFieldMappings\": {\n          \"$ref\": \"#/definitions/DirectiveArgumentAndInputFieldMappings_2\",\n          \"description\": \"Replaces a GraphQL scalar with a custom type based on the applied directive on an argument or input field.\\n\\nYou can use both `module#type` and `module#namespace#type` syntax.\\nWill NOT work with introspected schemas since directives are not exported.\\nOnly works with directives on ARGUMENT_DEFINITION or INPUT_FIELD_DEFINITION.\\n\\n**WARNING:** Using this option does only change the type definitions.\\n\\nFor actually ensuring that a type is correct at runtime you will have to use schema transforms (e.g. with [@graphql-tools/utils mapSchema](https://graphql-tools.com/docs/schema-directives)) that apply those rules!\\nOtherwise, you might end up with a runtime type mismatch which could cause unnoticed bugs or runtime errors.\\n\\nPlease use this configuration option with care!\"\n        },\n        \"directiveArgumentAndInputFieldMappingTypeSuffix\": {\n          \"description\": \"Adds a suffix to the imported names to prevent name clashes.\",\n          \"type\": \"string\"\n        },\n        \"strictScalars\": {\n          \"description\": \"Makes scalars strict.\\n\\nIf scalars are found in the schema that are not defined in `scalars`\\nan error will be thrown during codegen.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"defaultScalarType\": {\n          \"description\": \"Allows you to override the type that unknown scalars will have.\\nDefault value: \\\"any\\\"\",\n          \"type\": \"string\"\n        },\n        \"scalars\": {\n          \"$ref\": \"#/definitions/ScalarsMap\",\n          \"description\": \"Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\"\n        },\n        \"namingConvention\": {\n          \"$ref\": \"#/definitions/NamingConvention\",\n          \"description\": \"Allow you to override the naming convention of the output.\\nYou can either override all namings, or specify an object with specific custom naming convention per output.\\nThe format of the converter must be a valid `module#method`.\\nAllowed values for specific output are: `typeNames`, `enumValues`.\\nYou can also use \\\"keep\\\" to keep all GraphQL names as-is.\\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\\nwhich is to preserve underscores.\\n\\nAvailable case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`\\n[See more](https://github.com/btxtiger/change-case-all)\\nDefault value: \\\"change-case-all#pascalCase\\\"\"\n        },\n        \"typesPrefix\": { \"description\": \"Prefixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"typesSuffix\": { \"description\": \"Suffixes all the generated types.\\nDefault value: \\\"\\\"\", \"type\": \"string\" },\n        \"skipTypename\": {\n          \"description\": \"Does not add `__typename` to the generated types, unless it was specified in the selection set.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"nonOptionalTypename\": {\n          \"description\": \"Automatically adds `__typename` field to the generated types, even when they are not specified\\nin the selection set, and makes it non-optional\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"dedupeFragments\": {\n          \"description\": \"Removes fragment duplicates for reducing data transfer.\\nIt is done by removing sub-fragments imports from fragment definition\\nInstead - all of them are imported to the Operation node.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"inlineFragmentTypes\": {\n          \"description\": \"Whether fragment types should be inlined into other operations.\\n\\\"inline\\\" is the default behavior and will perform deep inlining fragment types within operation type definitions.\\n\\\"combine\\\" is the previous behavior that uses fragment type references without inlining the types (and might cause issues with deeply nested fragment that uses list types).\\nDefault value: \\\"inline\\\"\",\n          \"type\": \"string\"\n        },\n        \"emitLegacyCommonJSImports\": {\n          \"description\": \"Emit legacy common js imports.\\nDefault it will be `true` this way it ensure that generated code works with [non-compliant bundlers](https://github.com/dotansimha/graphql-code-generator/issues/8065).\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"IntrospectionPluginConfig\": {\n      \"description\": \"This plugin generates a GraphQL introspection file based on your GraphQL schema.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"minify\": {\n          \"description\": \"Set to `true` in order to minify the JSON output.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"descriptions\": {\n          \"description\": \"Whether to include descriptions in the introspection result.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"specifiedByUrl\": {\n          \"description\": \"Whether to include `specifiedByUrl` in the introspection result.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"directiveIsRepeatable\": {\n          \"description\": \"Whether to include `isRepeatable` flag on directives.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"schemaDescription\": {\n          \"description\": \"Whether to include `description` field on schema.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"federation\": { \"type\": \"boolean\" }\n      }\n    },\n    \"FragmentMatcherConfig\": {\n      \"description\": \"This plugin generates an introspection file but only with Interfaces and Unions, based on your GraphQLSchema.\\n\\nIf you are using `apollo-client` and your schema contains `interface` or `union` declaration, it's recommended to use Apollo's Fragment Matcher and the result generated by the plugin.\\n\\nYou can read more about it in [`apollo-client` documentation](https://apollographql.com/docs/react/data/fragments/#fragments-on-unions-and-interfaces).\\n\\nFragment Matcher plugin accepts a TypeScript / JavaScript or a JSON file as an output _(`.ts, .tsx, .js, .jsx, .json`)_.\\n\\nBoth in TypeScript and JavaScript a default export is being used.\\n\\n> The output is based on the output you choose for the output file name.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"module\": {\n          \"description\": \"Compatible only with JSON extension, allow you to choose the export type, either `module.exports` or `export default`. Allowed values are: `commonjs`, `es2015`.\\nDefault value: \\\"es2015\\\"\",\n          \"enum\": [\"commonjs\", \"es2015\"],\n          \"type\": \"string\"\n        },\n        \"apolloClientVersion\": {\n          \"description\": \"Compatible only with TS/TSX/JS/JSX extensions, allow you to generate output based on your Apollo-Client version. Valid values are: `2`, `3`.\\nDefault value: \\\"3\\\"\",\n          \"enum\": [2, 3],\n          \"type\": \"number\"\n        },\n        \"useExplicitTyping\": {\n          \"description\": \"Create an explicit type based on your schema. This can help IDEs autofill your fragment matcher. This is mostly useful if you do more with your fragment matcher than just pass it to an Apollo-Client.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"federation\": { \"type\": \"boolean\" },\n        \"deterministic\": {\n          \"description\": \"When enabled sorts the fragment types lexicographically. This is useful for deterministic output.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"UrqlIntrospectionConfig\": {\n      \"description\": \"This plugin generates an introspection file for Schema Awareness feature of Urql Cache Exchange\\n\\nYou can read more about it in `urql` documentation: https://formidable.com/open-source/urql/docs/graphcache/schema-awareness.\\n\\nUrql Introspection plugin accepts a TypeScript / JavaScript or a JSON file as an output _(`.ts, .tsx, .js, .jsx, .json`)_.\\n\\nBoth in TypeScript and JavaScript a default export is being used.\\n\\n> The output is based on the output you choose for the output file name.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"module\": {\n          \"description\": \"Compatible only with JSON extension, allow you to choose the export type, either `module.exports` or `export default`. Allowed values are: `commonjs`, `es2015`.\\nDefault value: \\\"es2015\\\"\",\n          \"enum\": [\"commonjs\", \"es2015\"],\n          \"type\": \"string\"\n        },\n        \"useTypeImports\": {\n          \"type\": \"boolean\",\n          \"description\": \"Will use `import type {}` rather than `import {}` when importing only types. This gives\\ncompatibility with TypeScript's \\\"importsNotUsedAsValues\\\": \\\"error\\\" option\\nDefault value: \\\"false\\\"\"\n        },\n        \"includeScalars\": {\n          \"type\": \"boolean\",\n          \"description\": \"Includes scalar names (instead of an `Any` replacement) in the output when enabled.\\nDefault value: \\\"false\\\"\"\n        },\n        \"includeEnums\": {\n          \"type\": \"boolean\",\n          \"description\": \"Includes enums (instead of an `Any` replacement) in the output when enabled.\\nDefault value: \\\"false\\\"\"\n        },\n        \"includeInputs\": {\n          \"type\": \"boolean\",\n          \"description\": \"Includes all input objects (instead of an `Any` replacement) in the output when enabled.\\nDefault value: \\\"false\\\"\"\n        },\n        \"includeDirectives\": {\n          \"type\": \"boolean\",\n          \"description\": \"Includes all directives in the output when enabled.\\nDefault value: \\\"false\\\"\"\n        }\n      }\n    },\n    \"HasuraAllowListPluginConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"collectionName\": {\n          \"description\": \"Choose the collection name to be generated. Defaults to allowed-queries\\nDefault value: \\\"allowed-queries\\\"\",\n          \"type\": \"string\"\n        },\n        \"configVersion\": {\n          \"description\": \"Target metadata config version. Supported versions are 2 and 3.\\nThis is mostly for future proofing, currently has no impact as both versions use the same format.\\nThe default value _will change_ in the future if/when newer config versions are released.\\nDefault value: \\\"3\\\"\",\n          \"enum\": [2, 3],\n          \"type\": \"number\"\n        },\n        \"globalFragments\": {\n          \"description\": \"Whether to source fragments per-document, or globally. If set, will enforce fragment name uniqueness\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"ModulesConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"baseTypesPath\": {\n          \"type\": \"string\",\n          \"description\": \"Required, should point to the base schema types file.\\nThe key of the output is used a base path for this file.\"\n        },\n        \"importBaseTypesFrom\": {\n          \"type\": \"string\",\n          \"description\": \"Overrides the package import for the base types. Use this if you are within a monorepo, and you wish\\nto import the base types directly from a different package, and not from a relative path.\"\n        },\n        \"cwd\": {\n          \"type\": \"string\",\n          \"description\": \"Optional, override the `cwd` of the execution. We are using `cwd` to figure out the imports between files. Use this if your execution path is not your project root directory.\\nDefault value: \\\"process.cwd()\\\"\"\n        },\n        \"importTypesNamespace\": {\n          \"type\": \"string\",\n          \"description\": \"Optional, override the name of the import namespace used to import from the `baseTypesPath` file.\\nDefault value: \\\"Types\\\"\"\n        },\n        \"filename\": { \"type\": \"string\", \"description\": \"Required, sets the file name for the generated files.\" },\n        \"encapsulateModuleTypes\": {\n          \"type\": \"string\",\n          \"description\": \"Configure how to encapsulate the module types, to avoid confusion.\\n\\n`namespace` (default): will wrap all types in a TypeScript namespace, using the module name.\\n`prefix`: will prefix all types from a specific module with the module name.\\n`none`: will skip encapsulation, and generate type as-is.\\nDefault value: \\\"namespace\\\"\"\n        },\n        \"requireRootResolvers\": {\n          \"type\": \"boolean\",\n          \"description\": \"Generate resolvers of root types (Query, Mutation and Subscription) as non-optional.\\nDefault value: \\\"false\\\"\"\n        },\n        \"useGraphQLModules\": {\n          \"type\": \"boolean\",\n          \"description\": \"By default, the generated types will generate some code specific to `graphql-modules` library.\\n\\nIf you are not using GraphQL-Modules, you can disable this feature by setting this to `false`.\\nDefault value: \\\"true\\\"\"\n        }\n      }\n    },\n    \"NearOperationFileConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"baseTypesPath\": {\n          \"description\": \"Required, should point to the base schema types file.\\nThe key of the output is used a the base path for this file.\\n\\nIf you wish to use an NPM package or a local workspace package, make sure to prefix the package name with `~`.\",\n          \"type\": \"string\"\n        },\n        \"importAllFragmentsFrom\": {\n          \"description\": \"Overrides all external fragments import types by using a specific file path or a package name.\\n\\nIf you wish to use an NPM package or a local workspace package, make sure to prefix the package name with `~`.\",\n          \"anyOf\": [{ \"$ref\": \"#/definitions/FragmentImportFromFn\" }, { \"type\": \"string\" }]\n        },\n        \"fileName\": {\n          \"description\": \"Optional, sets a specific file name for the generated files. Use this to override the generated file name when generating files for example based on multiple .graphql files in separate directories.\",\n          \"type\": \"string\"\n        },\n        \"extension\": {\n          \"description\": \"Optional, sets the extension for the generated files. Use this to override the extension if you are using plugins that requires a different type of extensions (such as `typescript-react-apollo`)\\nDefault value: \\\".generated.ts\\\"\",\n          \"type\": \"string\"\n        },\n        \"cwd\": {\n          \"description\": \"Optional, override the `cwd` of the execution. We are using `cwd` to figure out the imports between files. Use this if your execution path is not your project root directory.\\nDefault value: \\\"process.cwd()\\\"\",\n          \"type\": \"string\"\n        },\n        \"folder\": {\n          \"description\": \"Optional, defines a folder, (Relative to the source files) where the generated files will be created.\\nDefault value: \\\"''\\\"\",\n          \"type\": \"string\"\n        },\n        \"importTypesNamespace\": {\n          \"description\": \"Optional, override the name of the import namespace used to import from the `baseTypesPath` file.\\nDefault value: \\\"Types\\\"\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ImportTypesConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"typesPath\": {\n          \"description\": \"Required, should point to the base schema types file.\\nThe key of the output is used a the base path for this file.\",\n          \"type\": \"string\"\n        },\n        \"importTypesNamespace\": {\n          \"description\": \"Optional, override the name of the import namespace used to import from the `baseTypesPath` file.\\nDefault value: \\\"Types\\\"\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Types.InstanceOrArray\": {\n      \"anyOf\": [\n        { \"$ref\": \"#/definitions/Types.SchemaWithLoader\" },\n        { \"$ref\": \"#/definitions/Types.SchemaFromCodeFile\" },\n        { \"$ref\": \"#/definitions/Types.UrlSchemaWithOptions\" },\n        { \"$ref\": \"#/definitions/Types.LocalSchemaPathWithOptions\" },\n        { \"$ref\": \"#/definitions/Types.ApolloEngineSchemaOptions\" },\n        { \"$ref\": \"#/definitions/Types.GitHubSchemaOptions\" },\n        { \"type\": \"array\", \"items\": { \"$ref\": \"#/definitions/Types.Schema\" } },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"Types.SchemaWithLoader\": {\n      \"type\": \"object\",\n      \"additionalProperties\": { \"$ref\": \"#/definitions/Types.SchemaWithLoaderOptions\" }\n    },\n    \"Types.SchemaWithLoaderOptions\": {\n      \"additionalProperties\": false,\n      \"description\": \"Loads schema using a pointer, with a custom loader (code file).\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"loader\": {\n          \"description\": \"Specify a path to a custom code file (local or module) that will handle the schema loading.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Types.SchemaFromCodeFile\": {\n      \"type\": \"object\",\n      \"additionalProperties\": { \"$ref\": \"#/definitions/Types.SchemaFromCodeFileOptions\" }\n    },\n    \"Types.SchemaFromCodeFileOptions\": {\n      \"additionalProperties\": false,\n      \"description\": \"Loads schema using a pointer, without using `require` while looking for schemas in code files.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"noRequire\": {\n          \"description\": \"Set this to `true` in order to tell codegen not to try to `require` files in order to find schema/docs\",\n          \"type\": \"boolean\"\n        },\n        \"noPluck\": {\n          \"description\": \"Set this to `true` in order to tell codegen not to try to extract GraphQL AST strings schema/docs\",\n          \"type\": \"boolean\"\n        },\n        \"assumeValid\": {\n          \"description\": \"Set this to `true` in order to tell codegen to skip documents validation.\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"Types.UrlSchemaWithOptions\": {\n      \"type\": \"object\",\n      \"additionalProperties\": { \"$ref\": \"#/definitions/Types.UrlSchemaOptions\" }\n    },\n    \"Types.UrlSchemaOptions\": {\n      \"additionalProperties\": false,\n      \"description\": \"Loads a schema from remote endpoint, with custom http options.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"headers\": {\n          \"description\": \"HTTP headers you wish to add to the HTTP request sent by codegen to fetch your GraphQL remote schema.\",\n          \"type\": \"object\",\n          \"additionalProperties\": { \"type\": \"string\" }\n        },\n        \"customFetch\": {\n          \"description\": \"Specify a Node module name, a custom file, or a function, to be used instead of a standard `fetch`.\",\n          \"anyOf\": [\n            {\n              \"$ref\": \"#/definitions/Types.CustomSchemaFetcher\",\n              \"description\": \"A function to use for fetching the schema.\"\n            },\n            { \"type\": \"string\" }\n          ]\n        },\n        \"method\": { \"description\": \"HTTP Method to use, either POST (default) or GET.\", \"type\": \"string\" },\n        \"handleAsSDL\": {\n          \"description\": \"Handling the response as SDL will allow you to load schema from remote server that doesn't return a JSON introspection.\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"__type\": { \"description\": \"A function to use for fetching the schema.\", \"type\": \"object\" },\n    \"Types.CustomSchemaFetcher\": { \"$ref\": \"#/definitions/__type\" },\n    \"Types.LocalSchemaPathWithOptions\": {\n      \"type\": \"object\",\n      \"additionalProperties\": { \"$ref\": \"#/definitions/Types.LocalSchemaPathOptions\" }\n    },\n    \"Types.LocalSchemaPathOptions\": {\n      \"additionalProperties\": false,\n      \"description\": \"Loads a schema a local file or files, with customized options for parsing/loading.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"skipGraphQLImport\": {\n          \"description\": \"Skips checks for graphql-import syntax and loads the file as-is, without imports support.\\nDefault value: \\\"true\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"commentDescriptions\": {\n          \"description\": \"Converts all GraphQL comments (`#` sign) to descriptions during the parse phase, to make it available\\nfor plugins later.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"assumeValidSDL\": {\n          \"description\": \"Set to true to assume the SDL is valid.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"noLocation\": {\n          \"description\": \"By default, the parser creates AST nodes that know the location\\nin the source that they correspond to. This configuration flag\\ndisables that behavior for performance or testing.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"allowLegacySDLEmptyFields\": {\n          \"description\": \"If enabled, the parser will parse empty fields sets in the Schema\\nDefinition Language. Otherwise, the parser will follow the current\\nspecification.\\n\\nThis option is provided to ease adoption of the final SDL specification\\nand will be removed in v16.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"allowLegacySDLImplementsInterfaces\": {\n          \"description\": \"If enabled, the parser will parse implemented interfaces with no `&`\\ncharacter between each interface. Otherwise, the parser will follow the\\ncurrent specification.\\n\\nThis option is provided to ease adoption of the final SDL specification\\nand will be removed in v16.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        },\n        \"experimentalFragmentVariables\": {\n          \"description\": \"EXPERIMENTAL:\\n\\nIf enabled, the parser will understand and parse variable definitions\\ncontained in a fragment definition. They'll be represented in the\\n`variableDefinitions` field of the FragmentDefinitionNode.\\n\\nThe syntax is identical to normal, query-defined variables. For example:\\n\\n  fragment A($var: Boolean = false) on T  {\\n    ...\\n  }\\n\\nNote: this feature is experimental and may change or be removed in the\\nfuture.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"Types.ApolloEngineSchemaOptions\": {\n      \"type\": \"object\",\n      \"properties\": { \"apollo-engine\": { \"$ref\": \"#/definitions/ApolloEngineOptions\" } }\n    },\n    \"ApolloEngineOptions\": {\n      \"description\": \"Additional options for loading from Apollo Engine\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"engine\": {\n          \"type\": \"object\",\n          \"properties\": { \"endpoint\": { \"type\": \"string\" }, \"apiKey\": { \"type\": \"string\" } }\n        },\n        \"graph\": { \"type\": \"string\" },\n        \"variant\": { \"type\": \"string\" },\n        \"headers\": { \"$ref\": \"#/definitions/Record\" },\n        \"noLocation\": { \"type\": \"boolean\" },\n        \"allowLegacySDLEmptyFields\": { \"type\": \"boolean\" },\n        \"allowLegacySDLImplementsInterfaces\": { \"type\": \"boolean\" },\n        \"experimentalFragmentVariables\": { \"type\": \"boolean\" },\n        \"commentDescriptions\": {\n          \"description\": \"Set to `true` in order to convert all GraphQL comments (marked with # sign) to descriptions (\\\"\\\"\\\")\\nGraphQL has built-in support for transforming descriptions to comments (with `print`), but not while\\nparsing. Turning the flag on will support the other way as well (`parse`)\",\n          \"type\": \"boolean\"\n        },\n        \"assumeValidSDL\": {\n          \"description\": \"Set to true to assume the SDL is valid.\\n\\nDefault: false\",\n          \"type\": \"boolean\"\n        },\n        \"assumeValid\": {\n          \"description\": \"When building a schema from a GraphQL service's introspection result, it\\nmight be safe to assume the schema is valid. Set to true to assume the\\nproduced schema is valid.\\n\\nDefault: false\",\n          \"type\": \"boolean\"\n        },\n        \"cwd\": { \"type\": \"string\" },\n        \"ignore\": { \"anyOf\": [{ \"type\": \"array\", \"items\": { \"type\": \"string\" } }, { \"type\": \"string\" }] },\n        \"includeSources\": { \"type\": \"boolean\" }\n      }\n    },\n    \"__type_1\": { \"type\": \"object\" },\n    \"Record\": { \"$ref\": \"#/definitions/__type_1\" },\n    \"Types.GitHubSchemaOptions\": {\n      \"type\": \"object\",\n      \"additionalProperties\": { \"type\": \"object\", \"properties\": { \"token\": { \"type\": \"string\" } } }\n    },\n    \"Types.Schema\": {\n      \"description\": \"A URL to your GraphQL endpoint, a local path to `.graphql` file, a glob pattern to your GraphQL schema files, or a JavaScript file that exports the schema to generate code from. This can also be an array which specifies multiple schemas to generate code from. You can read more about the supported formats [here](schema-field#available-formats).\",\n      \"anyOf\": [\n        { \"$ref\": \"#/definitions/Types.SchemaWithLoader\" },\n        { \"$ref\": \"#/definitions/Types.SchemaFromCodeFile\" },\n        { \"$ref\": \"#/definitions/Types.UrlSchemaWithOptions\" },\n        { \"$ref\": \"#/definitions/Types.LocalSchemaPathWithOptions\" },\n        { \"$ref\": \"#/definitions/Types.ApolloEngineSchemaOptions\" },\n        { \"$ref\": \"#/definitions/Types.GitHubSchemaOptions\" },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"Types.RequireExtension\": { \"anyOf\": [{ \"type\": \"array\", \"items\": { \"type\": \"string\" } }, { \"type\": \"string\" }] },\n    \"Types.InstanceOrArray_1\": {\n      \"anyOf\": [\n        { \"$ref\": \"#/definitions/Types.CustomDocumentLoader\" },\n        { \"type\": \"array\", \"items\": { \"$ref\": \"#/definitions/Types.OperationDocument\" } },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"Types.CustomDocumentLoader\": {\n      \"type\": \"object\",\n      \"additionalProperties\": { \"$ref\": \"#/definitions/Types.CustomDocumentLoaderOptions\" }\n    },\n    \"Types.CustomDocumentLoaderOptions\": {\n      \"additionalProperties\": false,\n      \"description\": \"Specify a path to a custom loader for your GraphQL documents.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"loader\": {\n          \"description\": \"Specify a path to a custom code file (local or module) that will handle the documents loading.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Types.OperationDocument\": {\n      \"anyOf\": [{ \"$ref\": \"#/definitions/Types.CustomDocumentLoader\" }, { \"type\": \"string\" }]\n    },\n    \"Types.ConfiguredPlugin\": {\n      \"type\": \"object\",\n      \"additionalProperties\": { \"type\": \"object\", \"additionalProperties\": { \"$ref\": \"#/definitions/T\" } },\n      \"properties\": {\n        \"flutter-freezed\": { \"$ref\": \"#/definitions/FlutterFreezedPluginConfig\" },\n        \"typescript-react-query\": { \"$ref\": \"#/definitions/ReactQueryRawPluginConfig\" },\n        \"typescript-rtk-query\": { \"$ref\": \"#/definitions/RTKConfig\" },\n        \"typescript-generic-sdk\": { \"$ref\": \"#/definitions/RawGenericSdkPluginConfig\" },\n        \"typescript-apollo-client-helpers\": { \"$ref\": \"#/definitions/ApolloClientHelpersConfig\" },\n        \"add\": { \"$ref\": \"#/definitions/AddPluginConfig\" },\n        \"time\": { \"$ref\": \"#/definitions/TimePluginConfig\" },\n        \"typescript\": { \"$ref\": \"#/definitions/TypeScriptPluginConfig\" },\n        \"typescript-operations\": { \"$ref\": \"#/definitions/TypeScriptDocumentsPluginConfig\" },\n        \"c-sharp\": { \"$ref\": \"#/definitions/CSharpResolversPluginRawConfig\" },\n        \"c-sharp-operations\": { \"$ref\": \"#/definitions/CSharpOperationsRawPluginConfig\" },\n        \"schema-ast\": { \"$ref\": \"#/definitions/SchemaASTConfig\" },\n        \"typescript-type-graphql\": { \"$ref\": \"#/definitions/TypeGraphQLPluginConfig\" },\n        \"typescript-graphql-files-modules\": { \"$ref\": \"#/definitions/TypeScriptFilesModulesPluginConfig\" },\n        \"named-operations-object\": { \"$ref\": \"#/definitions/NamedOperationsObjectPluginConfig\" },\n        \"typescript-graphql-request\": { \"$ref\": \"#/definitions/RawGraphQLRequestPluginConfig\" },\n        \"typescript-mongodb\": { \"$ref\": \"#/definitions/TypeScriptMongoPluginConfig\" },\n        \"typescript-resolvers\": { \"$ref\": \"#/definitions/TypeScriptResolversPluginConfig\" },\n        \"typescript-apollo-angular\": { \"$ref\": \"#/definitions/ApolloAngularRawPluginConfig\" },\n        \"typescript-nhost\": { \"$ref\": \"#/definitions/NhostPluginConfig\" },\n        \"typescript-urql\": { \"$ref\": \"#/definitions/UrqlRawPluginConfig\" },\n        \"typescript-react-apollo\": { \"$ref\": \"#/definitions/ReactApolloRawPluginConfig\" },\n        \"typescript-vue-apollo\": { \"$ref\": \"#/definitions/VueApolloRawPluginConfig\" },\n        \"typescript-vue-apollo-smart-ops\": { \"$ref\": \"#/definitions/VueApolloSmartOpsRawPluginConfig\" },\n        \"typescript-vue-urql\": { \"$ref\": \"#/definitions/VueUrqlRawPluginConfig\" },\n        \"typescript-stencil-apollo\": { \"$ref\": \"#/definitions/StencilApolloRawPluginConfig\" },\n        \"typescript-document-nodes\": { \"$ref\": \"#/definitions/TypeScriptDocumentNodesRawPluginConfig\" },\n        \"typescript-msw\": { \"$ref\": \"#/definitions/MSWConfig\" },\n        \"java-apollo-android\": { \"$ref\": \"#/definitions/JavaApolloAndroidPluginConfig\" },\n        \"java-resolvers\": { \"$ref\": \"#/definitions/JavaResolversPluginRawConfig\" },\n        \"java\": { \"$ref\": \"#/definitions/JavaResolversPluginRawConfig\" },\n        \"kotlin\": { \"$ref\": \"#/definitions/KotlinResolversPluginRawConfig\" },\n        \"flow\": { \"$ref\": \"#/definitions/FlowPluginConfig\" },\n        \"flow-resolvers\": { \"$ref\": \"#/definitions/FlowResolversPluginConfig\" },\n        \"flow-operations\": { \"$ref\": \"#/definitions/FlowDocumentsPluginConfig\" },\n        \"introspection\": { \"$ref\": \"#/definitions/IntrospectionPluginConfig\" },\n        \"fragment-matcher\": { \"$ref\": \"#/definitions/FragmentMatcherConfig\" },\n        \"urql-introspection\": { \"$ref\": \"#/definitions/UrqlIntrospectionConfig\" },\n        \"hasura-allow-list\": { \"$ref\": \"#/definitions/HasuraAllowListPluginConfig\" }\n      }\n    },\n    \"T\": { \"type\": \"object\" },\n    \"Types.ConfiguredOutput\": {\n      \"additionalProperties\": false,\n      \"type\": \"object\",\n      \"properties\": {\n        \"plugins\": {\n          \"type\": \"array\",\n          \"items\": { \"$ref\": \"#/definitions/GeneratedPluginsMap\" },\n          \"description\": \"List of plugins to apply to this current output file.\\n\\nYou can either specify plugins from the community using the NPM package name (after you installed it in your project), or you can use a path to a local file for custom plugins.\\n\\nYou can find a list of available plugins here: https://the-guild.dev/graphql/codegen/docs/plugins/index\\nNeed a custom plugin? read this: https://the-guild.dev/graphql/codegen/docs/custom-codegen/index\"\n        },\n        \"preset\": {\n          \"description\": \"If your setup uses Preset to have a more dynamic setup and output, set the name of your preset here.\\n\\nPresets are a way to have more than one file output, for example: https://the-guild.dev/graphql/codegen/docs/presets/near-operation-file\\n\\nYou can either specify a preset from the community using the NPM package name (after you installed it in your project), or you can use a path to a local file for a custom preset.\\n\\nList of available presets: https://graphql-code-generator.com/docs/presets/presets-index\",\n          \"anyOf\": [\n            { \"$ref\": \"#/definitions/Types.OutputPreset\" },\n            {\n              \"enum\": [\n                \"client\",\n                \"client-preset\",\n                \"gql-tag-operations\",\n                \"gql-tag-operations-preset\",\n                \"graphql-modules\",\n                \"graphql-modules-preset\",\n                \"import-types\",\n                \"import-types-preset\",\n                \"near-operation-file\",\n                \"near-operation-file-preset\"\n              ],\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"presetConfig\": {\n          \"description\": \"If your setup uses Preset to have a more dynamic setup and output, set the configuration object of your preset here.\\n\\nList of available presets: https://graphql-code-generator.com/docs/presets/presets-index\",\n          \"type\": \"object\",\n          \"additionalProperties\": {}\n        },\n        \"overwrite\": {\n          \"description\": \"A flag to overwrite files if they already exist when generating code (`true` by default).\\n\\nFor more details: https://graphql-code-generator.com/docs/config-reference/codegen-config\",\n          \"type\": \"boolean\"\n        },\n        \"documents\": {\n          \"$ref\": \"#/definitions/Types.InstanceOrArray_1\",\n          \"description\": \"A pointer(s) to your GraphQL documents: query, mutation, subscription and fragment. These documents will be loaded into for all your output files.\\nYou can use one of the following:\\n\\n- Path to a local `.graphql` file\\n- Path to a code file (for example: `.js` or `.tsx`) containing GraphQL operation strings.\\n- Glob expression pointing to multiple `.graphql` files\\n- Glob expression pointing to multiple code files\\n- Inline string containing GraphQL SDL operation definition\\n\\nYou can specify either a single file, or multiple.\\n\\nFor more details: https://graphql-code-generator.com/docs/config-reference/documents-field\"\n        },\n        \"schema\": {\n          \"$ref\": \"#/definitions/Types.InstanceOrArray\",\n          \"description\": \"A pointer(s) to your GraphQL schema. This schema will be available only for this specific `generates` record.\\nYou can use one of the following:\\n\\n- URL pointing to a GraphQL endpoint\\n- Path to a local `.json` file\\n- Path to a local `.graphql` file\\n- Glob expression pointing to multiple `.graphql` files\\n- Path to a local code file (for example: `.js`) that exports `GraphQLSchema` object\\n- Inline string containing GraphQL SDL schema definition\\n\\nYou can specify either a single schema, or multiple, and GraphQL Code Generator will merge the schemas into a single schema.\\n\\nFor more details: https://graphql-code-generator.com/docs/config-reference/schema-field\"\n        },\n        \"config\": { \"additionalProperties\": true },\n        \"hooks\": {\n          \"$ref\": \"#/definitions/Partial\",\n          \"description\": \"Specifies scripts to run when events are happening in the codegen core.\\nHooks defined on that level will effect only the current output files.\\n\\nFor more details: https://graphql-code-generator.com/docs/config-reference/lifecycle-hooks\"\n        },\n        \"documentTransforms\": {\n          \"description\": \"DocumentTransform changes documents before executing plugins.\",\n          \"type\": \"array\",\n          \"items\": { \"$ref\": \"#/definitions/Types.OutputDocumentTransform<object>\" }\n        },\n        \"watchPattern\": {\n          \"description\": \": Additional file pattern to watch when using watch mode\",\n          \"anyOf\": [{ \"type\": \"array\", \"items\": { \"type\": \"string\" } }, { \"type\": \"string\" }]\n        }\n      },\n      \"allOf\": [\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"flutter-freezed\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/FlutterFreezedPluginConfig\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-react-query\" } } }\n          },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/ReactQueryRawPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-rtk-query\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/RTKConfig\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-generic-sdk\" } } }\n          },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/RawGenericSdkPluginConfig\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": {\n              \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-apollo-client-helpers\" } }\n            }\n          },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/ApolloClientHelpersConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"add\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/AddPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"time\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/TimePluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/TypeScriptPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-operations\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/TypeScriptDocumentsPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"c-sharp\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/CSharpResolversPluginRawConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"c-sharp-operations\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/CSharpOperationsRawPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"schema-ast\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/SchemaASTConfig\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-type-graphql\" } } }\n          },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/TypeGraphQLPluginConfig\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": {\n              \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-graphql-files-modules\" } }\n            }\n          },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/TypeScriptFilesModulesPluginConfig\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"named-operations-object\" } } }\n          },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/NamedOperationsObjectPluginConfig\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-graphql-request\" } } }\n          },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/RawGraphQLRequestPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-mongodb\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/TypeScriptMongoPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-resolvers\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/TypeScriptResolversPluginConfig\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-apollo-angular\" } } }\n          },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/ApolloAngularRawPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-nhost\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/NhostPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-urql\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/UrqlRawPluginConfig\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-react-apollo\" } } }\n          },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/ReactApolloRawPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-vue-apollo\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/VueApolloRawPluginConfig\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": {\n              \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-vue-apollo-smart-ops\" } }\n            }\n          },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/VueApolloSmartOpsRawPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-vue-urql\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/VueUrqlRawPluginConfig\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-stencil-apollo\" } } }\n          },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/StencilApolloRawPluginConfig\" } } }\n        },\n        {\n          \"if\": {\n            \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-document-nodes\" } } }\n          },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/TypeScriptDocumentNodesRawPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"typescript-msw\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/MSWConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"java-apollo-android\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/JavaApolloAndroidPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"java-resolvers\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/JavaResolversPluginRawConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"java\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/JavaResolversPluginRawConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"kotlin\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/KotlinResolversPluginRawConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"flow\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/FlowPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"flow-resolvers\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/FlowResolversPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"flow-operations\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/FlowDocumentsPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"introspection\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/IntrospectionPluginConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"fragment-matcher\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/FragmentMatcherConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"urql-introspection\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/UrqlIntrospectionConfig\" } } }\n        },\n        {\n          \"if\": { \"properties\": { \"plugins\": { \"contains\": { \"type\": \"string\", \"const\": \"hasura-allow-list\" } } } },\n          \"then\": { \"properties\": { \"config\": { \"$ref\": \"#/definitions/HasuraAllowListPluginConfig\" } } }\n        }\n      ]\n    },\n    \"__type_2\": {\n      \"type\": \"object\",\n      \"properties\": { \"buildGeneratesSection\": { \"type\": \"object\" }, \"prepareDocuments\": { \"type\": \"object\" } }\n    },\n    \"Types.OutputPreset\": { \"$ref\": \"#/definitions/__type_2\" },\n    \"__type_3\": { \"type\": \"object\", \"additionalProperties\": { \"$ref\": \"#/definitions/T\" } },\n    \"Types.PluginConfig\": { \"$ref\": \"#/definitions/__type_3\" },\n    \"__type_4\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"afterStart\": {\n          \"$ref\": \"#/definitions/Types.LifeCycleHookValue\",\n          \"description\": \"Triggered with no arguments when the codegen starts (after the `codegen.yml` has beed parsed).\\n\\nSpecify a shell command to run.\"\n        },\n        \"beforeDone\": {\n          \"$ref\": \"#/definitions/Types.LifeCycleHookValue\",\n          \"description\": \"Triggered with no arguments, right before the codegen closes, or when watch mode is stopped.\\n\\nSpecify a shell command to run.\"\n        },\n        \"onWatchTriggered\": {\n          \"$ref\": \"#/definitions/Types.LifeCycleHookValue\",\n          \"description\": \"Triggered every time a file changes when using watch mode.\\nTriggered with two arguments: the type of the event (for example, `changed`) and the path of the file.\"\n        },\n        \"onError\": {\n          \"$ref\": \"#/definitions/Types.LifeCycleHookValue\",\n          \"description\": \"Triggered in case of a general error in the codegen. The argument is a string containing the error.\"\n        },\n        \"afterOneFileWrite\": {\n          \"$ref\": \"#/definitions/Types.LifeCycleHookValue\",\n          \"description\": \"Triggered after a file is written to the file-system. Executed with the path for the file.\\nIf the content of the file hasn't changed since last execution - this hooks won't be triggered.\\n\\n> This is a very useful hook, you can use it for integration with Prettier or other linters.\"\n        },\n        \"afterAllFileWrite\": {\n          \"$ref\": \"#/definitions/Types.LifeCycleHookValue\",\n          \"description\": \"Executed after writing all the files to the file-system.\\nTriggered with multiple arguments - paths for all files.\"\n        },\n        \"beforeOneFileWrite\": {\n          \"$ref\": \"#/definitions/Types.LifeCycleAlterHookValue\",\n          \"description\": \"Triggered before a file is written to the file-system.\\nExecuted with the path and content for the file.\\n\\nReturning a string will override the content of the file.\\n\\nIf the content of the file hasn't changed since last execution - this hooks won't be triggered.\"\n        },\n        \"beforeAllFileWrite\": {\n          \"$ref\": \"#/definitions/Types.LifeCycleHookValue\",\n          \"description\": \"Executed after the codegen has done creating the output and before writing the files to the file-system.\\n\\nTriggered with multiple arguments - paths for all relevant files.\\n\\n> Not all the files will be actually written to the file-system, because this is triggered before checking if the file has changed since last execution.\"\n        }\n      }\n    },\n    \"Types.LifeCycleHookValue\": {\n      \"anyOf\": [\n        { \"$ref\": \"#/definitions/Types.HookFunction\" },\n        {\n          \"type\": \"array\",\n          \"items\": { \"anyOf\": [{ \"$ref\": \"#/definitions/Types.HookFunction\" }, { \"type\": \"string\" }] }\n        },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"__type_5\": { \"type\": \"object\" },\n    \"Types.HookFunction\": { \"$ref\": \"#/definitions/__type_5\" },\n    \"Types.LifeCycleAlterHookValue\": {\n      \"anyOf\": [\n        { \"$ref\": \"#/definitions/Types.HookFunction\" },\n        { \"$ref\": \"#/definitions/Types.HookAlterFunction\" },\n        {\n          \"type\": \"array\",\n          \"items\": {\n            \"anyOf\": [\n              { \"$ref\": \"#/definitions/Types.HookFunction\" },\n              { \"$ref\": \"#/definitions/Types.HookAlterFunction\" },\n              { \"type\": \"string\" }\n            ]\n          }\n        },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"__type_6\": { \"type\": \"object\" },\n    \"Types.HookAlterFunction\": { \"$ref\": \"#/definitions/__type_6\" },\n    \"Partial\": { \"$ref\": \"#/definitions/__type_4\" },\n    \"Types.OutputDocumentTransform<object>\": {\n      \"anyOf\": [\n        { \"$ref\": \"#/definitions/Types.DocumentTransformObject\" },\n        { \"$ref\": \"#/definitions/Types.DocumentTransformFileConfig\" },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"__type_7\": {\n      \"type\": \"object\",\n      \"properties\": { \"transform\": { \"$ref\": \"#/definitions/Types.DocumentTransformFunction\" } }\n    },\n    \"__type_8\": { \"type\": \"object\" },\n    \"Types.DocumentTransformFunction\": { \"$ref\": \"#/definitions/__type_8\" },\n    \"Types.DocumentTransformObject\": { \"$ref\": \"#/definitions/__type_7\" },\n    \"__type_9\": { \"type\": \"object\", \"additionalProperties\": { \"$ref\": \"#/definitions/T_1\" } },\n    \"T_1\": { \"type\": \"object\" },\n    \"Types.DocumentTransformFileConfig\": { \"$ref\": \"#/definitions/__type_9\" },\n    \"__type_10\": { \"type\": \"object\" },\n    \"Types.PackageLoaderFn\": { \"$ref\": \"#/definitions/__type_10\" },\n    \"Array\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": { \"description\": \"the name of the NPM package name you wish to look for\", \"type\": \"string\" },\n          \"identifier\": { \"description\": \"the tag identifier name you wish to look for\", \"type\": \"string\" }\n        }\n      }\n    },\n    \"TypeNamePattern\": {\n      \"description\": \"A compact string of patterns used in the config for granular configuration of Graphql Types.\\n\\nThe string can contain one or more patterns, each pattern ends with a semi-colon (`;`).\\n\\nTo apply an option to all Graphql Types or all fields, use the allTypeNames (`@*TypeNames`) tokens.\\n\\nWherever you use the allTypeNames token, know very well that you can make some exceptions. After all, to every rule, there is an exception.\\n\\nA **square bracket** (`[]`) is used to specify what should be included and a **negated square bracket** (`-[]`) is used to specify what should be excluded.\\n\\nManually typing out a pattern may be prone to typos resulting in invalid patterns therefore the [`TypeNamePattern`]() class exposes some builder methods to be used in the plugin config file.\\n\\n## Available Builder Methods and the patterns they make\\n```ts\\nconst Droid = TypeName.fromString('Droid');\\nconst Starship = TypeName.fromString('Starship');\\nconst Human = TypeName.fromString('Human');\\nconst Movie = TypeName.fromString('Movie');\\n\\n\\n// Configuring specific Graphql Types\\nconst pattern = TypeNamePattern.forTypeNames([Droid, Starship]);\\nconsole.log(pattern); // \\\"Droid;Starship;\\\"\\n\\n// Configuring all Graphql Types\\nconst pattern = TypeNamePattern.forAllTypeNames();\\nconsole.log(pattern); // \\\"@*TypeNames;\\\"\\n\\n// Configuring all Graphql Types except those specified in the exclusion list of TypeNames\\nconst pattern = TypeNamePattern.forAllTypeNamesExcludeTypeNames([Droid, Starship]);\\nconsole.log(pattern); // \\\"@*TypeNames-[Droid,Starship];\\\"\",\n      \"type\": \"object\",\n      \"properties\": { \"_value\": {}, \"value\": { \"type\": \"string\" } }\n    },\n    \"UnionValueCase\": { \"enum\": [\"FreezedUnionCase.camel\", \"FreezedUnionCase.pascal\"], \"type\": \"string\" },\n    \"TypeName\": {\n      \"description\": \"represents a single valid GraphQL Type Name used in the GraphQL Schema provided\",\n      \"type\": \"object\",\n      \"properties\": { \"_value\": {}, \"value\": { \"type\": \"string\" } }\n    },\n    \"__type_11\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"endpoint\": { \"type\": \"string\" },\n        \"fetchParams\": { \"anyOf\": [{ \"$ref\": \"#/definitions/Record_1\" }, { \"type\": \"string\" }] }\n      }\n    },\n    \"__type_12\": { \"type\": \"object\" },\n    \"Record_1\": { \"$ref\": \"#/definitions/__type_12\" },\n    \"HardcodedFetch\": { \"$ref\": \"#/definitions/__type_11\" },\n    \"NamingConvention\": {\n      \"anyOf\": [\n        { \"$ref\": \"#/definitions/NamingConventionFn\" },\n        { \"$ref\": \"#/definitions/NamingConventionMap\" },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"__type_13\": { \"type\": \"object\" },\n    \"NamingConventionFn\": { \"$ref\": \"#/definitions/__type_13\" },\n    \"NamingConventionMap\": {\n      \"additionalProperties\": false,\n      \"type\": \"object\",\n      \"properties\": {\n        \"enumValues\": { \"anyOf\": [{ \"$ref\": \"#/definitions/NamingConventionFn\" }, { \"type\": \"string\" }] },\n        \"typeNames\": { \"anyOf\": [{ \"$ref\": \"#/definitions/NamingConventionFn\" }, { \"type\": \"string\" }] },\n        \"transformUnderscore\": { \"type\": \"boolean\" }\n      }\n    },\n    \"ScalarsMap\": {\n      \"description\": \"Scalars map or a string, a map between the GraphQL scalar name and the identifier that should be used\",\n      \"anyOf\": [{ \"type\": \"object\", \"additionalProperties\": { \"type\": \"string\" } }, { \"type\": \"string\" }]\n    },\n    \"DocumentMode\": {\n      \"enum\": [\"documentNode\", \"documentNodeImportFragments\", \"external\", \"graphQLTag\", \"string\"],\n      \"type\": \"string\"\n    },\n    \"AvoidOptionalsConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"field\": { \"type\": \"boolean\" },\n        \"object\": { \"type\": \"boolean\" },\n        \"inputValue\": { \"type\": \"boolean\" },\n        \"defaultValue\": { \"type\": \"boolean\" },\n        \"resolvers\": { \"type\": \"boolean\" },\n        \"query\": { \"type\": \"boolean\" },\n        \"mutation\": { \"type\": \"boolean\" },\n        \"subscription\": { \"type\": \"boolean\" }\n      }\n    },\n    \"EnumValuesMap\": {\n      \"description\": \"A raw configuration for enumValues map - can be represented with a single string value for a file path,\\na map between enum name and a file path, or a map between enum name and an object with explicit enum values.\",\n      \"anyOf\": [\n        {\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"anyOf\": [\n              {\n                \"allOf\": [\n                  { \"type\": \"object\", \"additionalProperties\": { \"type\": [\"string\", \"number\"] } },\n                  { \"$ref\": \"#/definitions/AdditionalProps\" }\n                ]\n              },\n              { \"type\": \"string\" }\n            ]\n          }\n        },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"AdditionalProps\": { \"type\": \"object\" },\n    \"DeclarationKindConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"directive\": { \"$ref\": \"#/definitions/DeclarationKind\" },\n        \"scalar\": { \"$ref\": \"#/definitions/DeclarationKind\" },\n        \"input\": { \"$ref\": \"#/definitions/DeclarationKind\" },\n        \"type\": { \"$ref\": \"#/definitions/DeclarationKind\" },\n        \"interface\": { \"$ref\": \"#/definitions/DeclarationKind\" },\n        \"arguments\": { \"$ref\": \"#/definitions/DeclarationKind\" }\n      }\n    },\n    \"DeclarationKind\": { \"enum\": [\"abstract class\", \"class\", \"interface\", \"type\"], \"type\": \"string\" },\n    \"__type_14\": {\n      \"description\": \"A map between the GraphQL directive name and the identifier that should be used\",\n      \"type\": \"object\",\n      \"additionalProperties\": { \"type\": \"string\" }\n    },\n    \"DirectiveArgumentAndInputFieldMappings\": { \"$ref\": \"#/definitions/__type_14\" },\n    \"ScalarsMap_1\": {\n      \"description\": \"Scalars map or a string, a map between the GraphQL scalar name and the identifier that should be used\",\n      \"anyOf\": [\n        {\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"anyOf\": [\n              { \"type\": \"object\", \"properties\": { \"input\": { \"type\": \"string\" }, \"output\": { \"type\": \"string\" } } },\n              { \"type\": \"string\" }\n            ]\n          }\n        },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"NamingConvention_1\": {\n      \"anyOf\": [\n        { \"$ref\": \"#/definitions/NamingConventionFn_1\" },\n        { \"$ref\": \"#/definitions/NamingConventionMap_1\" },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"__type_15\": { \"type\": \"object\" },\n    \"NamingConventionFn_1\": { \"$ref\": \"#/definitions/__type_15\" },\n    \"NamingConventionMap_1\": {\n      \"additionalProperties\": false,\n      \"type\": \"object\",\n      \"properties\": {\n        \"enumValues\": { \"anyOf\": [{ \"$ref\": \"#/definitions/NamingConventionFn_1\" }, { \"type\": \"string\" }] },\n        \"typeNames\": { \"anyOf\": [{ \"$ref\": \"#/definitions/NamingConventionFn_1\" }, { \"type\": \"string\" }] },\n        \"transformUnderscore\": { \"type\": \"boolean\" }\n      }\n    },\n    \"CustomDirectivesConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"apolloUnmask\": {\n          \"description\": \"Adds integration with Apollo Client's `@unmask` directive\\nwhen using Apollo Client's data masking feature. `@unmask` ensures fields\\nmarked by `@unmask` are available in the type definition.\\nDefault value: \\\"false\\\"\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"EnumValuesMap_1\": {\n      \"description\": \"A raw configuration for enumValues map - can be represented with a single string value for a file path,\\na map between enum name and a file path, or a map between enum name and an object with explicit enum values.\",\n      \"anyOf\": [\n        {\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"anyOf\": [\n              {\n                \"allOf\": [\n                  { \"type\": \"object\", \"additionalProperties\": { \"type\": [\"string\", \"number\"] } },\n                  { \"$ref\": \"#/definitions/AdditionalProps_1\" }\n                ]\n              },\n              { \"type\": \"string\" }\n            ]\n          }\n        },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"AdditionalProps_1\": { \"type\": \"object\" },\n    \"JsonAttributesSource\": { \"enum\": [\"Newtonsoft.Json\", \"System.Text.Json\"], \"type\": \"string\" },\n    \"ScalarsMap_2\": {\n      \"description\": \"Scalars map or a string, a map between the GraphQL scalar name and the identifier that should be used\",\n      \"anyOf\": [{ \"type\": \"object\", \"additionalProperties\": { \"type\": \"string\" } }, { \"type\": \"string\" }]\n    },\n    \"NamingConvention_2\": {\n      \"anyOf\": [\n        { \"$ref\": \"#/definitions/NamingConventionFn_2\" },\n        { \"$ref\": \"#/definitions/NamingConventionMap_2\" },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"__type_16\": { \"type\": \"object\" },\n    \"NamingConventionFn_2\": { \"$ref\": \"#/definitions/__type_16\" },\n    \"NamingConventionMap_2\": {\n      \"additionalProperties\": false,\n      \"type\": \"object\",\n      \"properties\": {\n        \"enumValues\": { \"anyOf\": [{ \"$ref\": \"#/definitions/NamingConventionFn_2\" }, { \"type\": \"string\" }] },\n        \"typeNames\": { \"anyOf\": [{ \"$ref\": \"#/definitions/NamingConventionFn_2\" }, { \"type\": \"string\" }] },\n        \"transformUnderscore\": { \"type\": \"boolean\" }\n      }\n    },\n    \"DocumentMode_1\": {\n      \"enum\": [\"documentNode\", \"documentNodeImportFragments\", \"external\", \"graphQLTag\", \"string\"],\n      \"type\": \"string\"\n    },\n    \"__type_17\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": { \"type\": \"string\" },\n        \"interface\": { \"type\": \"string\" },\n        \"field\": { \"type\": \"string\" },\n        \"input\": { \"type\": \"string\" },\n        \"arguments\": { \"type\": \"string\" }\n      }\n    },\n    \"Partial_1\": { \"$ref\": \"#/definitions/__type_17\" },\n    \"AvoidOptionalsConfig_1\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"field\": { \"type\": \"boolean\" },\n        \"object\": { \"type\": \"boolean\" },\n        \"inputValue\": { \"type\": \"boolean\" },\n        \"defaultValue\": { \"type\": \"boolean\" },\n        \"resolvers\": { \"type\": \"boolean\" }\n      }\n    },\n    \"DeclarationKindConfig_1\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"directive\": { \"$ref\": \"#/definitions/DeclarationKind_1\" },\n        \"scalar\": { \"$ref\": \"#/definitions/DeclarationKind_1\" },\n        \"input\": { \"$ref\": \"#/definitions/DeclarationKind_1\" },\n        \"type\": { \"$ref\": \"#/definitions/DeclarationKind_1\" },\n        \"interface\": { \"$ref\": \"#/definitions/DeclarationKind_1\" },\n        \"arguments\": { \"$ref\": \"#/definitions/DeclarationKind_1\" }\n      }\n    },\n    \"DeclarationKind_1\": { \"enum\": [\"abstract class\", \"class\", \"interface\", \"type\"], \"type\": \"string\" },\n    \"__type_18\": {\n      \"description\": \"A map between the GraphQL directive name and the identifier that should be used\",\n      \"type\": \"object\",\n      \"additionalProperties\": { \"type\": \"string\" }\n    },\n    \"DirectiveArgumentAndInputFieldMappings_1\": { \"$ref\": \"#/definitions/__type_18\" },\n    \"Array_1\": { \"type\": \"array\", \"items\": { \"type\": \"string\" } },\n    \"ResolversNonOptionalTypenameConfig\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"unionMember\": { \"type\": \"boolean\" },\n        \"interfaceImplementingType\": { \"type\": \"boolean\" },\n        \"excludeTypes\": { \"type\": \"array\", \"items\": { \"type\": \"string\" } }\n      }\n    },\n    \"ScalarsMap_3\": {\n      \"description\": \"Scalars map or a string, a map between the GraphQL scalar name and the identifier that should be used\",\n      \"anyOf\": [{ \"type\": \"object\", \"additionalProperties\": { \"type\": \"string\" } }, { \"type\": \"string\" }]\n    },\n    \"StencilComponentType\": { \"enum\": [\"class\", \"functional\"], \"type\": \"string\" },\n    \"DocumentMode_2\": {\n      \"enum\": [\"documentNode\", \"documentNodeImportFragments\", \"external\", \"graphQLTag\", \"string\"],\n      \"type\": \"string\"\n    },\n    \"FileType\": { \"enum\": [0, 1, 2, 3], \"type\": \"number\" },\n    \"EnumValuesMap_2\": {\n      \"description\": \"A raw configuration for enumValues map - can be represented with a single string value for a file path,\\na map between enum name and a file path, or a map between enum name and an object with explicit enum values.\",\n      \"anyOf\": [\n        {\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"anyOf\": [\n              {\n                \"allOf\": [\n                  { \"type\": \"object\", \"additionalProperties\": { \"type\": [\"string\", \"number\"] } },\n                  { \"$ref\": \"#/definitions/AdditionalProps_2\" }\n                ]\n              },\n              { \"type\": \"string\" }\n            ]\n          }\n        },\n        { \"type\": \"string\" }\n      ]\n    },\n    \"AdditionalProps_2\": { \"type\": \"object\" },\n    \"DeclarationKindConfig_2\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"directive\": { \"$ref\": \"#/definitions/DeclarationKind_2\" },\n        \"scalar\": { \"$ref\": \"#/definitions/DeclarationKind_2\" },\n        \"input\": { \"$ref\": \"#/definitions/DeclarationKind_2\" },\n        \"type\": { \"$ref\": \"#/definitions/DeclarationKind_2\" },\n        \"interface\": { \"$ref\": \"#/definitions/DeclarationKind_2\" },\n        \"arguments\": { \"$ref\": \"#/definitions/DeclarationKind_2\" }\n      }\n    },\n    \"DeclarationKind_2\": { \"enum\": [\"abstract class\", \"class\", \"interface\", \"type\"], \"type\": \"string\" },\n    \"__type_19\": {\n      \"description\": \"A map between the GraphQL directive name and the identifier that should be used\",\n      \"type\": \"object\",\n      \"additionalProperties\": { \"type\": \"string\" }\n    },\n    \"DirectiveArgumentAndInputFieldMappings_2\": { \"$ref\": \"#/definitions/__type_19\" },\n    \"AvoidOptionalsConfig_2\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"field\": { \"type\": \"boolean\" },\n        \"object\": { \"type\": \"boolean\" },\n        \"inputValue\": { \"type\": \"boolean\" },\n        \"defaultValue\": { \"type\": \"boolean\" },\n        \"resolvers\": { \"type\": \"boolean\" }\n      }\n    },\n    \"__type_20\": { \"type\": \"object\" },\n    \"FragmentImportFromFn\": { \"$ref\": \"#/definitions/__type_20\" },\n    \"GeneratedPluginsMap\": {\n      \"anyOf\": [\n        {\n          \"type\": \"object\",\n          \"additionalProperties\": true,\n          \"properties\": {\n            \"flutter-freezed\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/FlutterFreezedPluginConfig\" },\n            \"@graphql-codegen/flutter-freezed\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/FlutterFreezedPluginConfig\"\n            },\n            \"typescript-react-query\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/ReactQueryRawPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-react-query\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/ReactQueryRawPluginConfig\"\n            },\n            \"typescript-rtk-query\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/RTKConfig\" },\n            \"@graphql-codegen/typescript-rtk-query\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/RTKConfig\"\n            },\n            \"typescript-generic-sdk\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/RawGenericSdkPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-generic-sdk\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/RawGenericSdkPluginConfig\"\n            },\n            \"typescript-apollo-client-helpers\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/ApolloClientHelpersConfig\"\n            },\n            \"@graphql-codegen/typescript-apollo-client-helpers\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/ApolloClientHelpersConfig\"\n            },\n            \"add\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/AddPluginConfig\" },\n            \"@graphql-codegen/add\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/AddPluginConfig\" },\n            \"time\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/TimePluginConfig\" },\n            \"@graphql-codegen/time\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/TimePluginConfig\" },\n            \"typescript\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/TypeScriptPluginConfig\" },\n            \"@graphql-codegen/typescript\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeScriptPluginConfig\"\n            },\n            \"typescript-operations\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeScriptDocumentsPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-operations\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeScriptDocumentsPluginConfig\"\n            },\n            \"c-sharp\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/CSharpResolversPluginRawConfig\" },\n            \"@graphql-codegen/c-sharp\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/CSharpResolversPluginRawConfig\"\n            },\n            \"c-sharp-operations\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/CSharpOperationsRawPluginConfig\"\n            },\n            \"@graphql-codegen/c-sharp-operations\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/CSharpOperationsRawPluginConfig\"\n            },\n            \"schema-ast\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/SchemaASTConfig\" },\n            \"@graphql-codegen/schema-ast\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/SchemaASTConfig\" },\n            \"typescript-type-graphql\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeGraphQLPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-type-graphql\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeGraphQLPluginConfig\"\n            },\n            \"typescript-graphql-files-modules\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeScriptFilesModulesPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-graphql-files-modules\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeScriptFilesModulesPluginConfig\"\n            },\n            \"named-operations-object\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/NamedOperationsObjectPluginConfig\"\n            },\n            \"@graphql-codegen/named-operations-object\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/NamedOperationsObjectPluginConfig\"\n            },\n            \"typescript-graphql-request\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/RawGraphQLRequestPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-graphql-request\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/RawGraphQLRequestPluginConfig\"\n            },\n            \"typescript-mongodb\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeScriptMongoPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-mongodb\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeScriptMongoPluginConfig\"\n            },\n            \"typescript-resolvers\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeScriptResolversPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-resolvers\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeScriptResolversPluginConfig\"\n            },\n            \"typescript-apollo-angular\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/ApolloAngularRawPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-apollo-angular\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/ApolloAngularRawPluginConfig\"\n            },\n            \"typescript-nhost\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/NhostPluginConfig\" },\n            \"@graphql-codegen/typescript-nhost\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/NhostPluginConfig\"\n            },\n            \"typescript-urql\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/UrqlRawPluginConfig\" },\n            \"@graphql-codegen/typescript-urql\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/UrqlRawPluginConfig\"\n            },\n            \"typescript-react-apollo\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/ReactApolloRawPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-react-apollo\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/ReactApolloRawPluginConfig\"\n            },\n            \"typescript-vue-apollo\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/VueApolloRawPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-vue-apollo\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/VueApolloRawPluginConfig\"\n            },\n            \"typescript-vue-apollo-smart-ops\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/VueApolloSmartOpsRawPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-vue-apollo-smart-ops\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/VueApolloSmartOpsRawPluginConfig\"\n            },\n            \"typescript-vue-urql\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/VueUrqlRawPluginConfig\" },\n            \"@graphql-codegen/typescript-vue-urql\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/VueUrqlRawPluginConfig\"\n            },\n            \"typescript-stencil-apollo\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/StencilApolloRawPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-stencil-apollo\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/StencilApolloRawPluginConfig\"\n            },\n            \"typescript-document-nodes\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeScriptDocumentNodesRawPluginConfig\"\n            },\n            \"@graphql-codegen/typescript-document-nodes\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/TypeScriptDocumentNodesRawPluginConfig\"\n            },\n            \"typescript-msw\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/MSWConfig\" },\n            \"@graphql-codegen/typescript-msw\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/MSWConfig\" },\n            \"java-apollo-android\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/JavaApolloAndroidPluginConfig\"\n            },\n            \"@graphql-codegen/java-apollo-android\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/JavaApolloAndroidPluginConfig\"\n            },\n            \"java-resolvers\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/JavaResolversPluginRawConfig\" },\n            \"@graphql-codegen/java-resolvers\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/JavaResolversPluginRawConfig\"\n            },\n            \"java\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/JavaResolversPluginRawConfig\" },\n            \"@graphql-codegen/java\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/JavaResolversPluginRawConfig\"\n            },\n            \"kotlin\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/KotlinResolversPluginRawConfig\" },\n            \"@graphql-codegen/kotlin\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/KotlinResolversPluginRawConfig\"\n            },\n            \"flow\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/FlowPluginConfig\" },\n            \"@graphql-codegen/flow\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/FlowPluginConfig\" },\n            \"flow-resolvers\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/FlowResolversPluginConfig\" },\n            \"@graphql-codegen/flow-resolvers\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/FlowResolversPluginConfig\"\n            },\n            \"flow-operations\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/FlowDocumentsPluginConfig\" },\n            \"@graphql-codegen/flow-operations\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/FlowDocumentsPluginConfig\"\n            },\n            \"introspection\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/IntrospectionPluginConfig\" },\n            \"@graphql-codegen/introspection\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/IntrospectionPluginConfig\"\n            },\n            \"fragment-matcher\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/FragmentMatcherConfig\" },\n            \"@graphql-codegen/fragment-matcher\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/FragmentMatcherConfig\"\n            },\n            \"urql-introspection\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/UrqlIntrospectionConfig\" },\n            \"@graphql-codegen/urql-introspection\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/UrqlIntrospectionConfig\"\n            },\n            \"hasura-allow-list\": { \"additionalProperties\": false, \"$ref\": \"#/definitions/HasuraAllowListPluginConfig\" },\n            \"@graphql-codegen/hasura-allow-list\": {\n              \"additionalProperties\": false,\n              \"$ref\": \"#/definitions/HasuraAllowListPluginConfig\"\n            }\n          }\n        },\n        {\n          \"type\": \"string\",\n          \"oneOf\": [\n            {\n              \"const\": \"flutter-freezed\",\n              \"description\": \"configure the `flutter-freezed` plugin\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/flutter-freezed\\n\\n=> Make sure to include \\\"@graphql-codegen/flutter-freezed\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/flutter-freezed\",\n              \"description\": \"configure the `flutter-freezed` plugin\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/flutter-freezed\\n\\n=> Make sure to include \\\"@graphql-codegen/flutter-freezed\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-react-query\",\n              \"description\": \"This plugin generates `React-Query` Hooks with TypeScript typings.\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\\n\\n> **If you are using the `react-query` package instead of the `@tanstack/react-query` package in your project, please set the `legacyMode` option to `true`.**\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-react-query\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-react-query\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-react-query\",\n              \"description\": \"This plugin generates `React-Query` Hooks with TypeScript typings.\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\\n\\n> **If you are using the `react-query` package instead of the `@tanstack/react-query` package in your project, please set the `legacyMode` option to `true`.**\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-react-query\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-react-query\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-rtk-query\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-rtk-query\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-rtk-query\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-rtk-query\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-rtk-query\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-rtk-query\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-generic-sdk\",\n              \"description\": \"This plugin generate a generic SDK (without any Requester implemented), allow you to easily customize the way you fetch your data, without loosing the strongly-typed integration.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-generic-sdk\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-generic-sdk\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-generic-sdk\",\n              \"description\": \"This plugin generate a generic SDK (without any Requester implemented), allow you to easily customize the way you fetch your data, without loosing the strongly-typed integration.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-generic-sdk\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-generic-sdk\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-apollo-client-helpers\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-apollo-client-helpers\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-apollo-client-helpers\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-apollo-client-helpers\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-apollo-client-helpers\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-apollo-client-helpers\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"add\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/add\\n\\n=> Make sure to include \\\"@graphql-codegen/add\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/add\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/add\\n\\n=> Make sure to include \\\"@graphql-codegen/add\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"time\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/time\\n\\n=> Make sure to include \\\"@graphql-codegen/time\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/time\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/time\\n\\n=> Make sure to include \\\"@graphql-codegen/time\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript\",\n              \"description\": \"This plugin generates the base TypeScript types, based on your GraphQL schema.\\n\\nThe types generated by this plugin are simple, and refers to the exact structure of your schema, and it's used as the base types for other plugins (such as `typescript-operations` / `typescript-resolvers`)\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript\",\n              \"description\": \"This plugin generates the base TypeScript types, based on your GraphQL schema.\\n\\nThe types generated by this plugin are simple, and refers to the exact structure of your schema, and it's used as the base types for other plugins (such as `typescript-operations` / `typescript-resolvers`)\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-operations\",\n              \"description\": \"This plugin generates TypeScript types based on your GraphQLSchema _and_ your GraphQL operations and fragments.\\nIt generates types for your GraphQL documents: Query, Mutation, Subscription and Fragment.\\n\\nNote: In most configurations, this plugin requires you to use `typescript as well, because it depends on its base types.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-operations\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-operations\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-operations\",\n              \"description\": \"This plugin generates TypeScript types based on your GraphQLSchema _and_ your GraphQL operations and fragments.\\nIt generates types for your GraphQL documents: Query, Mutation, Subscription and Fragment.\\n\\nNote: In most configurations, this plugin requires you to use `typescript as well, because it depends on its base types.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-operations\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-operations\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"c-sharp\",\n              \"description\": \"This plugin generates C# `class` identifier for your schema types.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/c-sharp\\n\\n=> Make sure to include \\\"@graphql-codegen/c-sharp\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/c-sharp\",\n              \"description\": \"This plugin generates C# `class` identifier for your schema types.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/c-sharp\\n\\n=> Make sure to include \\\"@graphql-codegen/c-sharp\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"c-sharp-operations\",\n              \"description\": \"This plugin generates C# `class` based on your GraphQL operations.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/c-sharp-operations\\n\\n=> Make sure to include \\\"@graphql-codegen/c-sharp-operations\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/c-sharp-operations\",\n              \"description\": \"This plugin generates C# `class` based on your GraphQL operations.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/c-sharp-operations\\n\\n=> Make sure to include \\\"@graphql-codegen/c-sharp-operations\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"schema-ast\",\n              \"description\": \"This plugin prints the merged schema as string. If multiple schemas are provided, they will be merged and printed as one schema.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/schema-ast\\n\\n=> Make sure to include \\\"@graphql-codegen/schema-ast\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/schema-ast\",\n              \"description\": \"This plugin prints the merged schema as string. If multiple schemas are provided, they will be merged and printed as one schema.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/schema-ast\\n\\n=> Make sure to include \\\"@graphql-codegen/schema-ast\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-type-graphql\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-type-graphql\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-type-graphql\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-type-graphql\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-type-graphql\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-type-graphql\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-graphql-files-modules\",\n              \"description\": \"This plugin generates TypeScript typings for `.graphql` files containing GraphQL documents, which later on can be consumed using [`graphql-tag/loader`](https://github.com/apollographql/graphql-tag#webpack-preprocessing-with-graphql-tagloader) or use `string` types if you will use the operations as raw strings, and get type-check and type-safety for your imports. This means that any time you import objects from `.graphql` files, your IDE will provide auto-complete.\\n\\nThis plugin also handles `.graphql` files containing multiple GraphQL documents, and name the imports according to the operation name.\\n\\n> ⚠ Fragments are not generated with named imports, only as default imports, due to `graphql-tag/loader` behavior.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-graphql-files-modules\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-graphql-files-modules\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-graphql-files-modules\",\n              \"description\": \"This plugin generates TypeScript typings for `.graphql` files containing GraphQL documents, which later on can be consumed using [`graphql-tag/loader`](https://github.com/apollographql/graphql-tag#webpack-preprocessing-with-graphql-tagloader) or use `string` types if you will use the operations as raw strings, and get type-check and type-safety for your imports. This means that any time you import objects from `.graphql` files, your IDE will provide auto-complete.\\n\\nThis plugin also handles `.graphql` files containing multiple GraphQL documents, and name the imports according to the operation name.\\n\\n> ⚠ Fragments are not generated with named imports, only as default imports, due to `graphql-tag/loader` behavior.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-graphql-files-modules\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-graphql-files-modules\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"named-operations-object\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/named-operations-object\\n\\n=> Make sure to include \\\"@graphql-codegen/named-operations-object\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/named-operations-object\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/named-operations-object\\n\\n=> Make sure to include \\\"@graphql-codegen/named-operations-object\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-graphql-request\",\n              \"description\": \"This plugin generates [`graphql-request`](https://npmjs.com/package/graphql-request) ready-to-use SDK, which is fully-typed.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-graphql-request\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-graphql-request\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-graphql-request\",\n              \"description\": \"This plugin generates [`graphql-request`](https://npmjs.com/package/graphql-request) ready-to-use SDK, which is fully-typed.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-graphql-request\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-graphql-request\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-mongodb\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-mongodb\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-mongodb\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-mongodb\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-mongodb\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-mongodb\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-resolvers\",\n              \"description\": \"This plugin generates TypeScript signature for `resolve` functions of your GraphQL API.\\nYou can use this plugin to generate simple resolvers signature based on your GraphQL types, or you can change its behavior be providing custom model types (mappers).\\n\\nYou can find a blog post explaining the usage of this plugin here: https://the-guild.dev/blog/better-type-safety-for-resolvers-with-graphql-codegen\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-resolvers\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-resolvers\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-resolvers\",\n              \"description\": \"This plugin generates TypeScript signature for `resolve` functions of your GraphQL API.\\nYou can use this plugin to generate simple resolvers signature based on your GraphQL types, or you can change its behavior be providing custom model types (mappers).\\n\\nYou can find a blog post explaining the usage of this plugin here: https://the-guild.dev/blog/better-type-safety-for-resolvers-with-graphql-codegen\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-resolvers\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-resolvers\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-apollo-angular\",\n              \"description\": \"This plugin generates Apollo services (`Query`, `Mutation` and `Subscription`) with TypeScript typings.\\n\\nIt will generate a strongly typed Angular service for every defined query, mutation or subscription. The generated Angular services are ready to inject and use within your Angular component.\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\\n\\nTo shed some more light regards this template, it's recommended to go through this article: https://apollo-angular.com/docs/get-started, and to read the Code Generation with Apollo Angular: https://the-guild.dev/blog/apollo-angular-12\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-apollo-angular\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-apollo-angular\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-apollo-angular\",\n              \"description\": \"This plugin generates Apollo services (`Query`, `Mutation` and `Subscription`) with TypeScript typings.\\n\\nIt will generate a strongly typed Angular service for every defined query, mutation or subscription. The generated Angular services are ready to inject and use within your Angular component.\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\\n\\nTo shed some more light regards this template, it's recommended to go through this article: https://apollo-angular.com/docs/get-started, and to read the Code Generation with Apollo Angular: https://the-guild.dev/blog/apollo-angular-12\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-apollo-angular\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-apollo-angular\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-nhost\",\n              \"description\": \"This plugin generates the Typescript schema that enables queries and mutations to be typed in the Nhost SDK.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-nhost\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-nhost\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-nhost\",\n              \"description\": \"This plugin generates the Typescript schema that enables queries and mutations to be typed in the Nhost SDK.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-nhost\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-nhost\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-urql\",\n              \"description\": \"This plugin generates `urql` (https://github.com/FormidableLabs/urql) components and HOC with TypeScript typings.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-urql\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-urql\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-urql\",\n              \"description\": \"This plugin generates `urql` (https://github.com/FormidableLabs/urql) components and HOC with TypeScript typings.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-urql\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-urql\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-react-apollo\",\n              \"description\": \"This plugin generates React Apollo components and HOC with TypeScript typings.\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-react-apollo\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-react-apollo\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-react-apollo\",\n              \"description\": \"This plugin generates React Apollo components and HOC with TypeScript typings.\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-react-apollo\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-react-apollo\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-vue-apollo\",\n              \"description\": \"This plugin generates\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-vue-apollo\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-vue-apollo\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-vue-apollo\",\n              \"description\": \"This plugin generates\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-vue-apollo\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-vue-apollo\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-vue-apollo-smart-ops\",\n              \"description\": \"This plugin generates Vue Apollo Smart Query, Smart Subscription and mutation operation functions with\\nTypeScript typings.\\n\\nThis plugin relies on some helper functions and types from the `vue-apollo-smart-ops` package. That package also adds\\nsome optional functionality for improved error handling in Vue Apollo operations which can be configured in the\\ngenerated code from this plugin.\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` -\\nand thus shares a similar configuration.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-vue-apollo-smart-ops\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-vue-apollo-smart-ops\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-vue-apollo-smart-ops\",\n              \"description\": \"This plugin generates Vue Apollo Smart Query, Smart Subscription and mutation operation functions with\\nTypeScript typings.\\n\\nThis plugin relies on some helper functions and types from the `vue-apollo-smart-ops` package. That package also adds\\nsome optional functionality for improved error handling in Vue Apollo operations which can be configured in the\\ngenerated code from this plugin.\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` -\\nand thus shares a similar configuration.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-vue-apollo-smart-ops\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-vue-apollo-smart-ops\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-vue-urql\",\n              \"description\": \"This plugin generates `urql` (https://github.com/FormidableLabs/urql) composition functions with TypeScript typings.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-vue-urql\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-vue-urql\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-vue-urql\",\n              \"description\": \"This plugin generates `urql` (https://github.com/FormidableLabs/urql) composition functions with TypeScript typings.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-vue-urql\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-vue-urql\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-stencil-apollo\",\n              \"description\": \"This plugin generates Stencil Apollo functional components typings\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-stencil-apollo\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-stencil-apollo\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-stencil-apollo\",\n              \"description\": \"This plugin generates Stencil Apollo functional components typings\\n\\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-stencil-apollo\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-stencil-apollo\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-document-nodes\",\n              \"description\": \"This plugin generates TypeScript source `.ts` file from GraphQL files `.graphql`.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-document-nodes\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-document-nodes\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-document-nodes\",\n              \"description\": \"This plugin generates TypeScript source `.ts` file from GraphQL files `.graphql`.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-document-nodes\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-document-nodes\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"typescript-msw\",\n              \"description\": \"This plugin generates `msw` (https://github.com/mswjs/msw) mock handlers with TypeScript typings.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-msw\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-msw\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/typescript-msw\",\n              \"description\": \"This plugin generates `msw` (https://github.com/mswjs/msw) mock handlers with TypeScript typings.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/typescript-msw\\n\\n=> Make sure to include \\\"@graphql-codegen/typescript-msw\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"java-apollo-android\",\n              \"description\": \"This plugin and presets creates generated mappers and parsers for a complete type-safe GraphQL requests, for developers that uses Apollo Android runtime.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/java-apollo-android\\n\\n=> Make sure to include \\\"@graphql-codegen/java-apollo-android\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/java-apollo-android\",\n              \"description\": \"This plugin and presets creates generated mappers and parsers for a complete type-safe GraphQL requests, for developers that uses Apollo Android runtime.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/java-apollo-android\\n\\n=> Make sure to include \\\"@graphql-codegen/java-apollo-android\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"java-resolvers\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/java-resolvers\\n\\n=> Make sure to include \\\"@graphql-codegen/java-resolvers\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/java-resolvers\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/java-resolvers\\n\\n=> Make sure to include \\\"@graphql-codegen/java-resolvers\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"java\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/java\\n\\n=> Make sure to include \\\"@graphql-codegen/java\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/java\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/java\\n\\n=> Make sure to include \\\"@graphql-codegen/java\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"kotlin\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/kotlin\\n\\n=> Make sure to include \\\"@graphql-codegen/kotlin\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/kotlin\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/kotlin\\n\\n=> Make sure to include \\\"@graphql-codegen/kotlin\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"flow\",\n              \"description\": \"This plugin generates Flow types based on your `GraphQLSchema`.\\n\\nIt generates types for your entire schema: types, input types, enum, interface, scalar and union.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/flow\\n\\n=> Make sure to include \\\"@graphql-codegen/flow\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/flow\",\n              \"description\": \"This plugin generates Flow types based on your `GraphQLSchema`.\\n\\nIt generates types for your entire schema: types, input types, enum, interface, scalar and union.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/flow\\n\\n=> Make sure to include \\\"@graphql-codegen/flow\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"flow-resolvers\",\n              \"description\": \"This plugin generates resolvers signature based on your `GraphQLSchema`.\\n\\nIt generates types for your entire schema: types, input types, enum, interface, scalar and union.\\n\\nThis plugin requires you to use `@graphql-codegen/flow` as well, because it depends on it's types.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/flow-resolvers\\n\\n=> Make sure to include \\\"@graphql-codegen/flow-resolvers\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/flow-resolvers\",\n              \"description\": \"This plugin generates resolvers signature based on your `GraphQLSchema`.\\n\\nIt generates types for your entire schema: types, input types, enum, interface, scalar and union.\\n\\nThis plugin requires you to use `@graphql-codegen/flow` as well, because it depends on it's types.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/flow-resolvers\\n\\n=> Make sure to include \\\"@graphql-codegen/flow-resolvers\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"flow-operations\",\n              \"description\": \"This plugin generates Flow types based on your `GraphQLSchema` and your GraphQL operations and fragments.\\n\\nIt generates types for your GraphQL documents: Query, Mutation, Subscription and Fragment.\\n\\nThis plugin requires you to use `@graphql-codegen/flow` as well, because it depends on its types.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/flow-operations\\n\\n=> Make sure to include \\\"@graphql-codegen/flow-operations\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/flow-operations\",\n              \"description\": \"This plugin generates Flow types based on your `GraphQLSchema` and your GraphQL operations and fragments.\\n\\nIt generates types for your GraphQL documents: Query, Mutation, Subscription and Fragment.\\n\\nThis plugin requires you to use `@graphql-codegen/flow` as well, because it depends on its types.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/flow-operations\\n\\n=> Make sure to include \\\"@graphql-codegen/flow-operations\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"introspection\",\n              \"description\": \"This plugin generates a GraphQL introspection file based on your GraphQL schema.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/introspection\\n\\n=> Make sure to include \\\"@graphql-codegen/introspection\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/introspection\",\n              \"description\": \"This plugin generates a GraphQL introspection file based on your GraphQL schema.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/introspection\\n\\n=> Make sure to include \\\"@graphql-codegen/introspection\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"fragment-matcher\",\n              \"description\": \"This plugin generates an introspection file but only with Interfaces and Unions, based on your GraphQLSchema.\\n\\nIf you are using `apollo-client` and your schema contains `interface` or `union` declaration, it's recommended to use Apollo's Fragment Matcher and the result generated by the plugin.\\n\\nYou can read more about it in [`apollo-client` documentation](https://apollographql.com/docs/react/data/fragments/#fragments-on-unions-and-interfaces).\\n\\nFragment Matcher plugin accepts a TypeScript / JavaScript or a JSON file as an output _(`.ts, .tsx, .js, .jsx, .json`)_.\\n\\nBoth in TypeScript and JavaScript a default export is being used.\\n\\n> The output is based on the output you choose for the output file name.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/fragment-matcher\\n\\n=> Make sure to include \\\"@graphql-codegen/fragment-matcher\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/fragment-matcher\",\n              \"description\": \"This plugin generates an introspection file but only with Interfaces and Unions, based on your GraphQLSchema.\\n\\nIf you are using `apollo-client` and your schema contains `interface` or `union` declaration, it's recommended to use Apollo's Fragment Matcher and the result generated by the plugin.\\n\\nYou can read more about it in [`apollo-client` documentation](https://apollographql.com/docs/react/data/fragments/#fragments-on-unions-and-interfaces).\\n\\nFragment Matcher plugin accepts a TypeScript / JavaScript or a JSON file as an output _(`.ts, .tsx, .js, .jsx, .json`)_.\\n\\nBoth in TypeScript and JavaScript a default export is being used.\\n\\n> The output is based on the output you choose for the output file name.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/fragment-matcher\\n\\n=> Make sure to include \\\"@graphql-codegen/fragment-matcher\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"urql-introspection\",\n              \"description\": \"This plugin generates an introspection file for Schema Awareness feature of Urql Cache Exchange\\n\\nYou can read more about it in `urql` documentation: https://formidable.com/open-source/urql/docs/graphcache/schema-awareness.\\n\\nUrql Introspection plugin accepts a TypeScript / JavaScript or a JSON file as an output _(`.ts, .tsx, .js, .jsx, .json`)_.\\n\\nBoth in TypeScript and JavaScript a default export is being used.\\n\\n> The output is based on the output you choose for the output file name.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/urql-introspection\\n\\n=> Make sure to include \\\"@graphql-codegen/urql-introspection\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/urql-introspection\",\n              \"description\": \"This plugin generates an introspection file for Schema Awareness feature of Urql Cache Exchange\\n\\nYou can read more about it in `urql` documentation: https://formidable.com/open-source/urql/docs/graphcache/schema-awareness.\\n\\nUrql Introspection plugin accepts a TypeScript / JavaScript or a JSON file as an output _(`.ts, .tsx, .js, .jsx, .json`)_.\\n\\nBoth in TypeScript and JavaScript a default export is being used.\\n\\n> The output is based on the output you choose for the output file name.\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/urql-introspection\\n\\n=> Make sure to include \\\"@graphql-codegen/urql-introspection\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"hasura-allow-list\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/hasura-allow-list\\n\\n=> Make sure to include \\\"@graphql-codegen/hasura-allow-list\\\" in your package.json file and install your dependencies.\\n\\n\"\n            },\n            {\n              \"const\": \"@graphql-codegen/hasura-allow-list\",\n              \"description\": \"\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/hasura-allow-list\\n\\n=> Make sure to include \\\"@graphql-codegen/hasura-allow-list\\\" in your package.json file and install your dependencies.\\n\\n\"\n            }\n          ]\n        },\n        {\n          \"type\": \"string\",\n          \"description\": \"Point to a custom plugin loaded from your file-system.\",\n          \"pattern\": \"(\\\\\\\\?([^\\\\/]*[\\\\/])*)([^\\\\/]+)$\"\n        },\n        {\n          \"type\": \"string\",\n          \"description\": \"You can point to any third-party module from node_modules that matches the requirements of a GraphQL Codegen plugin.\"\n        }\n      ]\n    }\n  },\n  \"$ref\": \"#/definitions/Types.Config\"\n}\n"
  },
  {
    "path": "website/route-lockfile.txt",
    "content": "\n/docs -> /docs/getting-started\n/docs/advanced -> /docs/advanced/generated-files-colocation\n/docs/advanced/generated-files-colocation\n/docs/advanced/how-does-it-work\n/docs/advanced/profiler\n/docs/advanced/programmatic-usage\n/docs/config-reference -> /docs/config-reference/codegen-config\n/docs/config-reference/ -> /docs/config-reference/codegen-config\n/docs/config-reference/codegen-config\n/docs/config-reference/config-field\n/docs/config-reference/documents-field\n/docs/config-reference/lifecycle-hooks\n/docs/config-reference/multiproject-config\n/docs/config-reference/naming-convention\n/docs/config-reference/require-field\n/docs/config-reference/schema-field\n/docs/custom-codegen\n/docs/custom-codegen/contributing\n/docs/custom-codegen/extend-schema\n/docs/custom-codegen/plugin-structure\n/docs/custom-codegen/using-visitor\n/docs/custom-codegen/validate-configuration\n/docs/custom-codegen/write-your-plugin -> /docs/custom-codegen\n/docs/generated-config/base-documents-visitor -> /plugins\n/docs/generated-config/base-visitor -> /plugins\n/docs/getting-started\n/docs/getting-started/codegen-config -> /docs/config-reference/codegen-config\n/docs/getting-started/config-field -> /docs/config-reference/config-field\n/docs/getting-started/config-reference/codegen-config -> /docs/config-reference/codegen-config\n/docs/getting-started/development-workflow\n/docs/getting-started/documents-field -> /docs/config-reference/documents-field\n/docs/getting-started/esm-typescript-usage\n/docs/getting-started/how-does-it-work -> /docs/advanced/how-does-it-work\n/docs/getting-started/installation\n/docs/getting-started/lifecycle-hooks -> /docs/config-reference/lifecycle-hooks\n/docs/getting-started/naming-convention -> /docs/config-reference/naming-convention\n/docs/getting-started/programmatic-usage -> /docs/advanced/programmatic-usage\n/docs/getting-started/require-field -> /docs/config-reference/require-field\n/docs/getting-started/schema-field -> /docs/config-reference/schema-field\n/docs/getting-startedinstallation -> /docs/getting-started\n/docs/guides/angular\n/docs/guides/flutter-freezed\n/docs/guides/further-reading\n/docs/guides/graphql-modules\n/docs/guides/graphql-server-apollo-yoga\n/docs/guides/react -> /docs/guides/react-vue\n/docs/guides/react-vue\n/docs/guides/svelte\n/docs/guides/vue -> /docs/guides/react-vue\n/docs/integrations -> /plugins\n/docs/integrations/apollo-local-state\n/docs/integrations/create-react-app\n/docs/integrations/federation\n/docs/integrations/gatsby\n/docs/integrations/prettier\n/docs/integrations/vscode\n/docs/migration/from-0-13\n/docs/migration/from-0-18\n/docs/migration/from-4-0\n/docs/plugins -> /plugins\n/docs/plugins/c-sharp -> /plugins/c-sharp/c-sharp-operations\n/docs/plugins/client-note -> /plugins\n/docs/plugins/typescript-common -> /plugins/typescript/typescript\n/docs/plugins/typescript-graphql-requesttypescript-graphql-request -> /plugins/typescript/typescript-graphql-request\n/docs/plugins/typescript-server -> /plugins/typescript/typescript-resolvers\n/docs/presets/presets-index -> /plugins\n/docs/tags -> /docs/getting-started\n/plugins\n/plugins/add -> /plugins/other/add\n/plugins/c-sharp-operations -> /plugins/c-sharp/c-sharp-operations\n/plugins/c-sharp/c-sharp-operations\n/plugins/core -> /plugins\n/plugins/dart -> /plugins\n/plugins/dart/flutter -> /plugins/dart/flutter-freezed\n/plugins/dart/flutter-freezed\n/plugins/flow -> /plugins/flow/flow-operations\n/plugins/flow-operations -> /plugins/flow/flow-operations\n/plugins/flow-resolvers -> /plugins/flow/flow-resolvers\n/plugins/flow/flow-operations\n/plugins/flow/flow-resolvers\n/plugins/flutter-freezed -> /plugins/dart/flutter-freezed\n/plugins/fragment-matcher -> /plugins/other/fragment-matcher\n/plugins/gql-tag-operations-preset -> /plugins/presets/gql-tag-operations-preset\n/plugins/graphql-modules-preset -> /plugins/presets/graphql-modules-preset\n/plugins/hasura-allow-list -> /plugins/other/hasura-allow-list\n/plugins/import-types-preset -> /plugins/presets/import-types-preset\n/plugins/introspection -> /plugins/other/introspection\n/plugins/java -> /plugins/java/java\n/plugins/java-apollo-android -> /plugins/java/java-apollo-android\n/plugins/java-installation -> /plugins/java/java\n/plugins/java-resolvers -> /plugins/java/java-resolvers\n/plugins/java/java\n/plugins/java/java-apollo-android\n/plugins/java/java-resolvers\n/plugins/java/kotlin\n/plugins/jsdoc -> /plugins/other/jsdoc\n/plugins/kotlin -> /plugins/java/kotlin\n/plugins/named-operations-object -> /plugins/typescript/named-operations-object\n/plugins/near-operation-file-preset -> /plugins/presets/near-operation-file-preset\n/plugins/other -> /plugins\n/plugins/other/add\n/plugins/other/fragment-matcher\n/plugins/other/hasura-allow-list\n/plugins/other/introspection\n/plugins/other/jsdoc\n/plugins/other/reason-client\n/plugins/other/schema-ast\n/plugins/other/time\n/plugins/other/typescript-operations -> /plugins/typescript/typescript-operations\n/plugins/other/urql-introspection\n/plugins/presets -> /plugins\n/plugins/presets/gql-tag-operations-preset\n/plugins/presets/graphql-modules-preset\n/plugins/presets/import-types-preset\n/plugins/presets/near-operation-file-preset\n/plugins/reason-client -> /plugins/other/reason-client\n/plugins/relay-operation-optimizer -> /plugins/typescript/relay-operation-optimizer\n/plugins/schema-ast -> /plugins/other/schema-ast\n/plugins/time -> /plugins/other/time\n/plugins/typed-document-node -> /plugins/typescript/typed-document-node\n/plugins/typescript -> /plugins/typescript/typescript\n/plugins/typescript -> /plugins/typescript/typescript\n/plugins/typescript-apollo-angular -> /plugins/typescript/typescript-apollo-angular\n/plugins/typescript-apollo-client-helpers -> /plugins/typescript/typescript-apollo-client-helpers\n/plugins/typescript-apollo-next -> /plugins/typescript/typescript-apollo-next\n/plugins/typescript-common -> /plugins/typescript/typescript\n/plugins/typescript-document-nodes -> /plugins/typescript/typescript-document-nodes\n/plugins/typescript-generic-sdk -> /plugins/typescript/typescript-generic-sdk\n/plugins/typescript-graphql-files-modules -> /plugins/typescript/typescript-graphql-files-modules\n/plugins/typescript-graphql-request -> /plugins/typescript/typescript-graphql-request\n/plugins/typescript-mongodb -> /plugins/typescript/typescript-mongodb\n/plugins/typescript-msw -> /plugins/typescript/typescript-msw\n/plugins/typescript-oclif -> /plugins/typescript/typescript-oclif\n/plugins/typescript-operations -> /plugins/typescript/typescript-operations\n/plugins/typescript-react-apollo -> /plugins/typescript/typescript-react-apollo\n/plugins/typescript-react-query -> /plugins/typescript/typescript-react-query\n/plugins/typescript-resolvers -> /plugins/typescript/typescript-resolvers\n/plugins/typescript-rtk-query -> /plugins/typescript/typescript-rtk-query\n/plugins/typescript-stencil-apollo -> /plugins/typescript/typescript-stencil-apollo\n/plugins/typescript-svelte-apollo -> /plugins/typescript/typescript-svelte-apollo\n/plugins/typescript-svelte-urql -> /plugins\n/plugins/typescript-type-graphql -> /plugins/typescript/typescript-type-graphql\n/plugins/typescript-urql -> /plugins/typescript/typescript-urql\n/plugins/typescript-urql-graphcache -> /plugins/typescript/typescript-urql\n/plugins/typescript-validation-schema -> /plugins/typescript/typescript-validation-schema\n/plugins/typescript-vue-apollo -> /plugins/typescript/typescript-vue-apollo\n/plugins/typescript-vue-apollo-smart-ops -> /plugins/typescript/typescript-vue-apollo-smart-ops\n/plugins/typescript-vue-urql -> /plugins/typescript/typescript-vue-urql\n/plugins/typescript/fragment-matcher -> /plugins/other/fragment-matcher\n/plugins/typescript/named-operations-object\n/plugins/typescript/relay-operation-optimizer\n/plugins/typescript/typed-document-node\n/plugins/typescript/typescript\n/plugins/typescript/typescript-apollo-angular\n/plugins/typescript/typescript-apollo-client-helpers\n/plugins/typescript/typescript-apollo-next\n/plugins/typescript/typescript-document-nodes\n/plugins/typescript/typescript-generic-sdk\n/plugins/typescript/typescript-graphql-files-modules\n/plugins/typescript/typescript-graphql-request\n/plugins/typescript/typescript-mongodb\n/plugins/typescript/typescript-msw\n/plugins/typescript/typescript-oclif\n/plugins/typescript/typescript-operations\n/plugins/typescript/typescript-react-apollo\n/plugins/typescript/typescript-react-query\n/plugins/typescript/typescript-resolvers\n/plugins/typescript/typescript-rtk-query\n/plugins/typescript/typescript-stencil-apollo\n/plugins/typescript/typescript-svelte-apollo\n/plugins/typescript/typescript-type-graphql\n/plugins/typescript/typescript-urql\n/plugins/typescript/typescript-urql-graphcache -> /plugins/typescript/typescript-urql\n/plugins/typescript/typescript-validation-schema\n/plugins/typescript/typescript-vue-apollo\n/plugins/typescript/typescript-vue-apollo-smart-ops\n/plugins/typescript/typescript-vue-urql\n/plugins/urql-introspection -> /plugins/other/urql-introspection\n"
  },
  {
    "path": "website/scripts/generate-config-json-schema.ts",
    "content": "import { writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport jsonPath from 'jsonpath';\nimport prettier from 'prettier';\nimport { transformDocs } from '../src/lib/transform';\n\nconst MARKDOWN_JSDOC_KEY = 'exampleMarkdown';\nconst DEFAULT_JSDOC_KEY = 'default';\nconst CWD = process.cwd();\nconst OUT_PATH = join(CWD, 'public/config.schema.json');\n\nconst prettierOptions = prettier.resolveConfig.sync(CWD);\n\nasync function generate(): Promise<void> {\n  const { schema } = transformDocs();\n  // Remove non-standard keys\n  jsonPath.apply(schema, `$..${MARKDOWN_JSDOC_KEY}`, () => undefined);\n\n  // Remove default to avoid annoying auto-complete\n  jsonPath.apply(schema, `$..*`, v => {\n    if (v && typeof v === 'object' && v[DEFAULT_JSDOC_KEY] !== undefined) {\n      if (!v.description) {\n        v.description = '';\n      }\n\n      v.description += `\\nDefault value: \"${v.default}\"`;\n      delete v.default;\n    }\n    return v;\n  });\n  const prettifiedSchema = prettier.format(JSON.stringify(schema), { ...prettierOptions, parser: 'json' });\n  await writeFile(OUT_PATH, prettifiedSchema);\n}\n\ngenerate()\n  .then(() => {\n    console.log('✅  Done!');\n  })\n  .catch(e => {\n    console.error(e);\n  });\n"
  },
  {
    "path": "website/scripts/generate-packages-info.ts",
    "content": "import { writeFileSync } from 'node:fs';\nimport path from 'node:path';\nimport semver from 'semver';\nimport { PACKAGES } from '../src/lib/plugins/packages.js';\n\ninterface PackageInfo {\n  readme: string;\n  createdAt: string;\n  updatedAt: string;\n  description: string;\n  weeklyNPMDownloads: number;\n}\n\n// FIXME: fetchPackageInfo is a simpler version of `@theguild/components`'s fetchPackageInfo\n// We cannot use the shared package version because it has imports that Next.js understands\n// but not a simple script like this. So, inlining this version helps unblock deployment\nconst fetchPackageInfo = async (packageName: string): Promise<PackageInfo> => {\n  const NO_NPM_README_PLACEHOLDER = 'ERROR: No README data found!';\n\n  const encodedName = encodeURIComponent(packageName);\n  console.debug(`Loading NPM package info: ${packageName}`);\n  const [packageInfo, { downloads }] = await Promise.all([\n    fetch(`https://registry.npmjs.org/${encodedName}`).then(response => response.json()),\n    fetch(`https://api.npmjs.org/downloads/point/last-week/${encodedName}`).then(response => response.json()),\n  ]);\n  const { readme, time, description } = packageInfo;\n  const latestVersion = packageInfo['dist-tags'].latest;\n\n  return {\n    readme:\n      (readme !== NO_NPM_README_PLACEHOLDER && readme) || // for some reason top level \"readme\" can be empty string, so we get the latest version readme\n      Object.values(packageInfo.versions as { readme?: string; version: string }[])\n        .reverse()\n        .find(curr => {\n          const isReadmeExist = curr.readme && curr.readme !== NO_NPM_README_PLACEHOLDER;\n          if (isReadmeExist) {\n            return semver.lte(curr.version, latestVersion);\n          }\n        })?.readme ||\n      '',\n    createdAt: time.created,\n    updatedAt: time.modified,\n    description,\n    weeklyNPMDownloads: downloads,\n  };\n};\n\nconst result: Record<string, PackageInfo> = {};\nfor (let [identifier, pkg] of Object.entries(PACKAGES)) {\n  const packageInfo = await fetchPackageInfo(pkg.npmPackage);\n  result[identifier] = packageInfo;\n\n  await (async function randomSleep({ minMs, maxMs }: { minMs: number; maxMs: number }): Promise<void> {\n    function sleep(ms: number): Promise<void> {\n      return new Promise(resolve => setTimeout(resolve, ms));\n    }\n\n    const delay = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs;\n    await sleep(delay);\n  })({ minMs: 100, maxMs: 5000 });\n}\n\nwriteFileSync(\n  path.join(process.cwd(), 'src', 'lib', 'packages-info.generated.ts'),\n  `export const packagesInfo= ${JSON.stringify(result)}`,\n  {\n    encoding: 'utf8',\n  }\n);\n"
  },
  {
    "path": "website/scripts/sitemap-ci.mjs",
    "content": "import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { XMLParser } from 'fast-xml-parser';\nimport config from '../next.config.mjs';\n\nconst parser = new XMLParser();\n\nconst sitemapPath = path.join(process.cwd(), 'public', 'sitemap.xml');\nconst { urlset } = parser.parse(await fs.readFile(sitemapPath, 'utf8'));\n\nconst routes = urlset.url.map(url => new URL(url.loc).pathname);\nconst redirectsPointingToNonExistingStuff = [];\n\nconst redirects = await config.redirects();\n\nfor (const redirect of redirects) {\n  if (routes.includes(redirect.destination)) {\n    routes.push(`${redirect.source} -> ${redirect.destination}`);\n  } else {\n    redirectsPointingToNonExistingStuff.push(redirect);\n  }\n}\n\nconst lockfilePath = path.join(process.cwd(), 'route-lockfile.txt');\nawait fs.writeFile(lockfilePath, routes.sort().join('\\n') + '\\n');\n"
  },
  {
    "path": "website/src/category-to-packages.mjs",
    "content": "/*\n  Used to determine right category folder in plugins and for redirect legacy links in next.config#redirects\n */\nexport const CategoryToPackages = {\n  'c-sharp': ['c-sharp-operations'],\n  flow: ['flow-operations', 'flow-resolvers'],\n  java: ['java', 'java-apollo-android', 'java-resolvers', 'kotlin'],\n  other: [\n    'urql-introspection',\n    'time',\n    'schema-ast',\n    'reason-client',\n    'jsdoc',\n    'introspection',\n    'hasura-allow-list',\n    'fragment-matcher',\n    'add',\n  ],\n  presets: ['near-operation-file-preset', 'import-types-preset', 'graphql-modules-preset', 'preset-client'],\n  typescript: [\n    'named-operations-object',\n    'relay-operation-optimizer',\n    'typed-document-node',\n    'typescript',\n    'typescript-apollo-angular',\n    'typescript-apollo-client-helpers',\n    'typescript-apollo-next',\n    'typescript-document-nodes',\n    'typescript-fabbrica',\n    'typescript-generic-sdk',\n    'typescript-graphql-files-modules',\n    'typescript-graphql-request',\n    'typescript-mongodb',\n    'typescript-msw',\n    'typescript-oclif',\n    'typescript-operations',\n    'typescript-react-apollo',\n    'typescript-react-query',\n    'typescript-resolvers',\n    'typescript-rtk-query',\n    'typescript-stencil-apollo',\n    'typescript-svelte-apollo',\n    'typescript-type-graphql',\n    'typescript-urql',\n    'typescript-validation-schema',\n    'typescript-vue-apollo',\n    'typescript-vue-apollo-smart-ops',\n    'typescript-vue-urql',\n    'typescript-mock-data',\n  ],\n  dart: ['flutter-freezed'],\n};\n"
  },
  {
    "path": "website/src/components/dev-ex-cards.tsx",
    "content": "import { cn, Heading, InfoCard } from '@theguild/components';\n\nimport boxSvg from './icons/box.svg';\nimport checkmarksSvg from './icons/checkmarks.svg';\nimport speedometerSvg from './icons/speedometer.svg';\n\nexport function DevExCards(props: { className?: string }) {\n  return (\n    <section className={cn('px-4 py-6 sm:py-12 md:px-6 lg:py-24 xl:px-[120px]', props.className)}>\n      <Heading as=\"h3\" size=\"md\" className=\"text-balance text-center\">\n        Your chance to fully use GraphQL.\n      </Heading>\n      <p className=\"mx-auto mt-4 max-w-[700px] text-center text-green-800\">\n        Codegen enhances your GraphQL development with fully typed client and server code, generating robust,\n        error-resistant solutions in seconds\n      </p>\n      <ul className=\"mt-6 flex flex-row flex-wrap justify-center gap-2 md:mt-16 md:gap-6\">\n        <InfoCard\n          as=\"li\"\n          heading=\"Typed Queries, Mutations, and Subscriptions\"\n          icon={<img src={boxSvg.src} alt=\"\" />}\n          className=\"flex-1 rounded-2xl md:rounded-3xl\"\n        >\n          Automate the creation of typed queries, mutations, and subscriptions for frameworks like React, Vue, Angular,\n          and more.\n        </InfoCard>\n        <InfoCard\n          as=\"li\"\n          heading=\"Typed GraphQL resolvers\"\n          icon={<img src={speedometerSvg.src} alt=\"\" />}\n          className=\"flex-1 basis-full rounded-2xl md:basis-0 md:rounded-3xl\"\n        >\n          Generate typed GraphQL resolvers for any Node.js or Java GraphQL server, ensuring compatibility and\n          efficiency.\n        </InfoCard>\n        <InfoCard\n          as=\"li\"\n          heading=\"Fully-typed Node.js SDKs\"\n          icon={<img src={checkmarksSvg.src} alt=\"\" />}\n          className=\"flex-1 basis-full rounded-2xl md:rounded-3xl lg:basis-0\"\n        >\n          Produce fully-typed Node.js SDKs, enhancing development with reliable, strongly typed software components.\n        </InfoCard>\n      </ul>\n    </section>\n  );\n}\n"
  },
  {
    "path": "website/src/components/hero/index.tsx",
    "content": "import { ReactNode } from 'react';\nimport { DecorationIsolation, cn, CodegenIcon } from '@theguild/components';\nimport Image from 'next/image';\n\nimport codegenHeroBadge from './codegen-badge.svg';\n\nexport function Hero(props: { children: ReactNode; className?: string }) {\n  return (\n    <div\n      className={cn(\n        'relative isolate flex max-w-[90rem] flex-col items-center justify-center gap-6 overflow-hidden rounded-3xl bg-blue-400 px-4 py-6 sm:py-12 md:gap-8 lg:py-24',\n        props.className\n      )}\n    >\n      <DecorationIsolation className=\"-z-10\">\n        <CodegenIcon className=\"absolute left-[-180px] top-[calc(50%-180px)] size-[360px] fill-[url(#codegen-hero-gradient)] stroke-white/10 stroke-[0.1px] md:hidden lg:left-[-649px] lg:top-[-58px] lg:size-[1047px] xl:block\" />\n        <CodegenIcon className=\"absolute right-[-350px] top-2 size-[672px] fill-[url(#codegen-hero-gradient)] stroke-white/10 stroke-[0.1px] max-md:hidden\" />\n        <svg>\n          <defs>\n            <linearGradient id=\"codegen-hero-gradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n              <stop offset=\"11.66%\" stopColor=\"rgba(255, 255, 255, 0.10)\" />\n              <stop offset=\"74.87%\" stopColor=\"rgba(255, 255, 255, 0.30)\" />\n            </linearGradient>\n          </defs>\n        </svg>\n      </DecorationIsolation>\n      <Image priority src={codegenHeroBadge.src} alt=\"\" width=\"96\" height=\"96\" />\n      {props.children}\n    </div>\n  );\n}\n\nexport function HeroLinks(props: { children: ReactNode }) {\n  return (\n    <div className=\"relative z-10 flex justify-center gap-2 px-0.5 max-sm:flex-col sm:gap-4\">{props.children}</div>\n  );\n}\n\nexport function HeroFeatures(props: { children: ReactNode }) {\n  return (\n    <ul className=\"mx-auto flex list-none gap-x-6 gap-y-2 text-sm font-medium max-md:flex-col [&>li]:flex [&>li]:items-center [&>li]:gap-2\">\n      {props.children}\n    </ul>\n  );\n}\n\nexport function HeroTitle(props: { children: ReactNode }) {\n  return (\n    <h1 className=\"mx-auto max-w-screen-lg bg-gradient-to-r from-yellow-500 via-orange-400 to-yellow-500 bg-clip-text text-center text-5xl font-semibold text-transparent sm:text-5xl lg:text-6xl\">\n      {props.children}\n    </h1>\n  );\n}\n\nexport function TrustedBy({ className, children, ...rest }: React.HTMLAttributes<HTMLElement>) {\n  return (\n    <div className={cn('max-w-[80%] text-center', className)} {...rest}>\n      <p className=\"text-base text-blue-800\">Trusted by global enterprises and fast-moving startups</p>\n      <div className=\"mt-6 flex flex-wrap items-center justify-center gap-x-16 gap-y-6 text-blue-1000\">{children}</div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/src/components/index-page.tsx",
    "content": "import { ReactElement, useEffect, useLayoutEffect } from 'react';\nimport {\n  ToolsAndLibrariesCards,\n  Heading,\n  CheckIcon,\n  CallToAction,\n  GitHubIcon,\n  cn,\n  InfoCard,\n  Anchor,\n  useData,\n  ExploreMainProductCards,\n} from '@theguild/components';\n\nimport { DevExCards } from './dev-ex-cards';\nimport { Page } from './page';\nimport { Hero, HeroFeatures, HeroLinks } from './hero';\nimport { PluginsMarketplaceSearch, Plugin, getPluginsStaticProps } from './plugins-marketplace-search';\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport { getPluginsStaticProps as getStaticProps };\n\nexport function IndexPage(): ReactElement {\n  const plugins = useData() as Plugin[];\n\n  useIsomorphicLayoutEffect(() => {\n    // We add .light class to body to style the Headless UI\n    // portal containing search results.\n    document.body.classList.add('light');\n\n    return () => {\n      document.body.classList.remove('light');\n    };\n  }, []);\n\n  return (\n    <Page className=\"light mx-auto max-w-[90rem] overflow-hidden text-green-1000\">\n      <style global jsx>\n        {`\n          html {\n            scroll-behavior: smooth;\n            color-scheme: light !important;\n          }\n          body {\n            background: #fff;\n            --nextra-primary-hue: 191deg;\n            --nextra-primary-saturation: 40%;\n            --nextra-bg: 255, 255, 255;\n          }\n          .nextra-sidebar-footer {\n            display: none;\n          }\n        `}\n      </style>\n\n      <Hero className=\"mx-4 max-sm:mt-2 md:mx-6\">\n        <Heading as=\"h1\" size=\"xl\" className=\"mx-auto max-w-3xl text-balance text-center\">\n          GraphQL Codegen\n        </Heading>\n        <p className=\"mx-auto w-[512px] max-w-[80%] text-balance text-center leading-6 text-green-800\">\n          Effortlessly generate comprehensive code from GraphQL schemas and operations, streamlining development across\n          your tech stack.\n        </p>\n        <HeroFeatures>\n          <li>\n            <CheckIcon className=\"text-green-800\" />\n            End-to-end type safety\n          </li>\n          <li>\n            <CheckIcon className=\"text-green-800\" />\n            Customizable\n          </li>\n          <li>\n            <CheckIcon className=\"text-green-800\" />\n            Rich plugins ecosystem\n          </li>\n        </HeroFeatures>\n        <HeroLinks>\n          <CallToAction variant=\"primary-inverted\" href=\"/docs/getting-started\">\n            Get started\n          </CallToAction>\n          <CallToAction variant=\"secondary-inverted\" href=\"https://github.com/dotansimha/graphql-code-generator\">\n            <GitHubIcon className=\"size-6\" />\n            GitHub\n          </CallToAction>\n        </HeroLinks>\n      </Hero>\n      <ExploreMainProductCards className=\"max-lg:mx-4 max-lg:my-8\" />\n      <TypeSafeCards className=\"mx-4 md:mx-6\" />\n      <DevExCards className=\"mx-4 md:mx-6\" />\n      <PluginsMarketplaceSearch plugins={plugins} className=\"sm:mx-4 md:mx-6\" />\n      <ToolsAndLibrariesCards className=\"mx-4 md:mx-6\" />\n    </Page>\n  );\n}\n\nfunction TypeSafeCards({ className }: { className?: string }) {\n  return (\n    <section className={cn('rounded-3xl bg-beige-100 p-4 pt-6 sm:py-24 md:px-6 md:py-[120px]', className)}>\n      <div className=\"flex flex-wrap justify-center md:px-6 xl:px-16\">\n        <div className=\"w-full sm:mb-12 sm:px-8 xl:mb-0 xl:w-[400px] xl:px-0\">\n          <Heading as=\"h3\" size=\"sm\" className=\"text-balance\">\n            Generate Type-Safe GraphQL Client and Server Code\n          </Heading>\n          <p className=\"mt-6 text-green-800\">\n            Codegen enhances your GraphQL development with fully typed client and server code, generating robust,\n            error-resistant solutions in seconds\n          </p>\n        </div>\n        <InfoCard\n          heading=\"No more mistakes\"\n          icon={<ChevronsIcon />}\n          className=\"flex-1 px-0 sm:px-8 sm:py-0 md:px-8 md:py-0\"\n        >\n          Codegen ensures your resolvers and client code are compliant with your GraphQL Schema.\n        </InfoCard>\n        <InfoCard\n          heading=\"Easy customization\"\n          icon={<WritingIcon />}\n          className=\"flex-1 basis-full border-beige-400 px-0 sm:basis-0 sm:border-l sm:px-8 sm:py-0 md:px-8 md:py-0\"\n        >\n          Tailor the output that you need with community plugins or write{' '}\n          <Anchor\n            href=\"/docs/custom-codegen/plugin-structure\"\n            className=\"hive-focus -mx-1 -my-0.5 rounded px-1 py-0.5 underline hover:text-blue-700\"\n          >\n            your own plugins\n          </Anchor>{' '}\n          to generate custom outputs matching your needs.\n        </InfoCard>\n      </div>\n    </section>\n  );\n}\n\nfunction ChevronsIcon(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\" {...props}>\n      <path d=\"M23 12L15.929 19.071L14.515 17.657L20.172 12L14.515 6.34302L15.929 4.92902L23 12ZM3.828 12L9.485 17.657L8.071 19.071L1 12L8.071 4.92902L9.485 6.34302L3.828 12Z\" />\n    </svg>\n  );\n}\n\nfunction WritingIcon(props: React.SVGProps<SVGSVGElement>) {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"25\" viewBox=\"0 0 24 25\" fill=\"currentColor\" {...props}>\n      <path d=\"M6.414 15.9398L16.556 5.79778L15.142 4.38378L5 14.5258V15.9398H6.414ZM7.243 17.9398H3V13.6968L14.435 2.26178C14.6225 2.07431 14.8768 1.96899 15.142 1.96899C15.4072 1.96899 15.6615 2.07431 15.849 2.26178L18.678 5.09078C18.8655 5.27831 18.9708 5.53262 18.9708 5.79778C18.9708 6.06294 18.8655 6.31725 18.678 6.50478L7.243 17.9398ZM3 19.9398H21V21.9398H3V19.9398Z\" />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "website/src/components/java-installation.mdx",
    "content": "import { Callout } from '@theguild/components'\n\n## Prepare your environment\n\nTo use the GraphQL Code Generator with Java, start by adding the [com.moowork.node](https://plugins.gradle.org/plugin/com.moowork.node) Gradle plugin to your `build.gradle`:\n\n```\nplugins {\n  id \"com.moowork.node\" version \"1.3.1\"\n}\n```\n\nThen, add the following in order to make sure you are running the code-generator on each build:\n\n```\nbuild.dependsOn yarn\n```\n\nThen, create a `package.json` file in your project root, with the following content:\n\n```json filename=\"package.json\"\n{\n  \"name\": \"java-app\",\n  \"scripts\": {\n    \"postinstall\": \"graphql-codegen\"\n  },\n  \"dependencies\": {\n    \"graphql\": \"14.5.8\",\n    \"@graphql-codegen/cli\": \"1.7.0\",\n    \"@graphql-codegen/RELEVANT_PLUGIN\": \"1.7.0\"\n  }\n}\n```\n\n<Callout>\n  Make sure to use the latest version of codegen and the plugins, and replace `RELEVANT_PLUGIN` with your plugin name.\n</Callout>\n\nThen, create `codegen.yml` file in your root directory, pointing to your schema, and add the plugins you need. For example:\n\n```yaml filename=\"codegen.yml\"\nschema: src/main/resources/schema.graphqls\ngenerates:\n  src/main/java/com/my-name/my-app/generated/File.java:\n    - RELEVANT_PLUGIN # Replace with your plugin name\n```\n\nAlso, make sure you add the following to your `.gitignore` file:\n\n```gitignore filename=\".gitignore\"\nyarn.lock\nnode_modules\n```\n\nNow, run `gradle yarn` to install the dependencies for the first time.\n\nNext time, the codegen will run automatically each time you run your Gradle build script.\n"
  },
  {
    "path": "website/src/components/live-demo/Editor.tsx",
    "content": "import { ReactElement } from 'react';\nimport MonacoEditor from '@monaco-editor/react';\nimport { useTheme } from '@theguild/components';\n\nexport function Editor({\n  value,\n  lang,\n  readOnly,\n  onEdit,\n}: {\n  lang: string;\n  value: string | undefined;\n  readOnly?: boolean;\n  onEdit?: (value: string | undefined) => void;\n}): ReactElement {\n  const { resolvedTheme } = useTheme();\n  return (\n    <MonacoEditor\n      height=\"40vh\"\n      language={lang}\n      theme={resolvedTheme === 'dark' ? 'vs-dark' : 'vs'}\n      value={value}\n      options={{\n        readOnly,\n        minimap: {\n          enabled: false,\n        },\n      }}\n      onChange={onEdit}\n    />\n  );\n}\n"
  },
  {
    "path": "website/src/components/live-demo/LiveDemo.tsx",
    "content": "import { ReactElement, useEffect, useState } from 'react';\nimport { Image, useTheme } from '@theguild/components';\nimport Select from 'react-select';\nimport { icons } from '@/lib/plugins';\nimport { EXAMPLES } from './examples';\nimport { generate } from './generate';\nimport { LiveDemoEditors } from './LiveDemoEditors';\n\nconst groupedExamples = Object.entries(EXAMPLES).map(([catName, category]) => ({\n  label: catName,\n  options: category.map((t, index) => ({ ...t, selectId: `${catName}__${index}` })),\n}));\n\nfunction useCodegen(config: string | undefined, schema: string | undefined, documents: string | undefined, templateName: string, operationsFileName?: string) {\n  const [error, setError] = useState<string | null>(null);\n  const [output, setOutput] = useState<{filename: string, content: string}[] | null>(null);\n\n  useEffect(() => {\n    if (!config || !schema) return;\n    generate(config, schema, documents, operationsFileName).then(result => {\n      if (typeof result === 'string') {\n        setOutput(null);\n        setError(result);\n      } else {\n        setOutput(result);\n        setError(null);\n      }\n    });\n  }, [config, schema, documents, templateName]);\n\n  return { error, output };\n}\n\nconst DEFAULT_EXAMPLE = {\n  catName: 'TypeScript',\n  index: 0,\n} as const;\n\nexport default function LiveDemo(): ReactElement {\n  const { resolvedTheme } = useTheme();\n  const isDarkTheme = resolvedTheme === 'dark';\n  const [template, setTemplate] = useState(`${DEFAULT_EXAMPLE.catName}__${DEFAULT_EXAMPLE.index}`);\n  const [schema, setSchema] = useState<string | undefined>(EXAMPLES[DEFAULT_EXAMPLE.catName][DEFAULT_EXAMPLE.index].schema);\n  const [documents, setDocuments] = useState<string | undefined>(EXAMPLES[DEFAULT_EXAMPLE.catName][DEFAULT_EXAMPLE.index].documents);\n  const [operationsFile, setOperationsFile] = useState<{filename: string, content: string, language: string} | undefined>(EXAMPLES[DEFAULT_EXAMPLE.catName][DEFAULT_EXAMPLE.index].operationsFile);\n  const [config, setConfig] = useState<string | undefined>(EXAMPLES[DEFAULT_EXAMPLE.catName][DEFAULT_EXAMPLE.index].config);\n  const { output, error } = useCodegen(config, schema, documents, template, operationsFile?.filename);\n\n  const changeTemplate = (value: string | undefined) => {\n    if (!value) return;\n    const [catName, index] = value.split('__');\n    setSchema(EXAMPLES[catName][Number(index)].schema);\n    setDocuments(EXAMPLES[catName][Number(index)].documents);\n    setOperationsFile(EXAMPLES[catName][Number(index)].operationsFile);\n    setConfig(EXAMPLES[catName][Number(index)].config);\n    setTemplate(value);\n  };\n\n  return (\n    <div className=\"hidden lg:!block\">\n      <div className=\"mx-auto mb-4 w-1/2\">\n        <h3 className=\"mb-2 text-center\">Choose Live Example:</h3>\n        <Select\n          isSearchable={false}\n          className=\"\n            rounded-md\n            [&>div>div>div]:dark:text-gray-200\n            [&>div]:dark:bg-black\n          \"\n          styles={{\n            option: (styles, { isFocused }) => ({\n              ...styles,\n              fontSize: 13,\n              ...(isFocused && isDarkTheme && { backgroundColor: 'gray' }),\n            }),\n          }}\n          isMulti={false}\n          isClearable={false}\n          onChange={e => changeTemplate(e?.selectId)}\n          getOptionValue={o => o.selectId}\n          getOptionLabel={o => (\n            <div className=\"flex items-center justify-end gap-1.5\">\n              <span className=\"mr-auto\">{o.name}</span>\n              {o.tags?.map(t => {\n                const icon = icons[t as keyof typeof icons];\n                return icon ? (\n                  <Image alt='Icon' key={t} src={icon} placeholder=\"empty\" loading=\"eager\" className=\"max-h-[20px] w-auto\" />\n                ) : (\n                  <span key={t} className=\"rounded-lg bg-gray-200 px-2 text-xs text-gray-800\">\n                    {t}\n                  </span>\n                );\n              })}\n            </div>\n            // fix react-select types\n          ) as any as string}\n          defaultValue={groupedExamples[0].options[0]}\n          options={groupedExamples}\n        />\n      </div>\n      <LiveDemoEditors\n        setSchema={setSchema}\n        schema={schema}\n        setDocuments={setDocuments}\n        documents={documents}\n        operationsFile={operationsFile}\n        setConfig={setConfig}\n        config={config}\n        error={error}\n        output={output}\n      />\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/src/components/live-demo/LiveDemoEditors.tsx",
    "content": "import { ReactElement, useEffect, useState } from 'react';\nimport { Image } from '@theguild/components';\nimport { load } from 'js-yaml';\nimport { Editor } from './Editor';\nimport { Config, getMode } from './formatter';\nimport codegenLogo from '../../../public/assets/img/gql-codegen-icon.svg';\nimport graphqlLogo from '../../../public/assets/img/GraphQL_Logo.svg';\nimport classnames from 'classnames';\nimport { basename } from 'path';\n\nconst classes = {\n  title: 'flex gap-1 justify-center font-bold h-12 items-center font-mono border-b dark:border-neutral-800',\n  column: 'w-[22vw]',\n};\n\nconst READ_ONLY_DOCUMENTS_TEXT = `# This example isn't\\n# using GraphQL operations`;\n\nexport interface LiveDemoEditorsProps {\n  setSchema: (newText: string | undefined) => void;\n  schema: string | undefined;\n  setDocuments: (newText: string | undefined) => void;\n  documents: string | undefined;\n  operationsFile?: { filename: string; content: string; language: string };\n  setConfig: (newText: string | undefined) => void;\n  config: string | undefined;\n  error: string | null;\n  output: { filename: string; content: string }[] | null;\n}\n\nexport function LiveDemoEditors({\n  setSchema,\n  schema,\n  setDocuments,\n  documents,\n  operationsFile,\n  setConfig,\n  config,\n  error,\n  output,\n}: LiveDemoEditorsProps): ReactElement {\n  const [index, setIndex] = useState(0);\n  let mode: ReturnType<typeof getMode> = 'javascript';\n\n  try {\n    const parsedConfig = load(config || '') as Config;\n    mode = getMode(parsedConfig);\n  } catch (e) {\n    console.error(e);\n  }\n\n  useEffect(() => {\n    setIndex(0);\n  }, [output]);\n\n  return (\n    <div className=\"flex\">\n      <div className={classes.column}>\n        <div className={classes.title}>\n          <Image alt=\"GraphQL logo\" src={graphqlLogo} placeholder=\"empty\" loading=\"eager\" className=\"h-7 w-7\" />\n          schema.graphql\n        </div>\n        <Editor lang=\"graphql\" onEdit={setSchema} value={schema} />\n      </div>\n      <div className={classes.column}>\n        <div className={classes.title}>\n          <Image alt=\"GraphQL logo\" src={graphqlLogo} placeholder=\"empty\" loading=\"eager\" className=\"h-7 w-7\" />\n          {operationsFile?.filename ?? 'operation.graphql'}\n        </div>\n        <Editor\n          lang={operationsFile?.language ?? 'graphql'}\n          onEdit={newText => {\n            setDocuments(newText !== READ_ONLY_DOCUMENTS_TEXT ? newText : undefined);\n          }}\n          value={documents === undefined ? READ_ONLY_DOCUMENTS_TEXT : operationsFile?.content || documents}\n          readOnly={documents === undefined || !!operationsFile}\n        />\n      </div>\n      <div className={classes.column}>\n        <div className={classes.title}>\n          <Image alt=\"Codegen logo\" src={codegenLogo} placeholder=\"empty\" loading=\"eager\" className=\"h-7 w-7\" />\n          codegen.yml\n        </div>\n        <Editor lang=\"yaml\" onEdit={setConfig} value={config} />\n      </div>\n      <div className=\"w-[32vw]\">\n        <div className=\"flex h-12 items-end\">\n          {output?.map((outputItem, i) => (\n            <button\n              onClick={() => setIndex(i)}\n              key={outputItem.filename}\n              className={classnames(\n                'h-2/3 min-w-[15%] rounded-t-md px-2 text-center font-mono text-xs font-bold',\n                index === i && 'bg-neutral-800 text-white'\n              )}\n            >\n              {basename(outputItem.filename)}\n            </button>\n          ))}\n        </div>\n        <Editor readOnly lang={mode} value={error || output?.[index]?.content || ''} />\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/src/components/live-demo/examples.ts",
    "content": "import dedent from 'dedent';\nimport { Icon } from '@/lib/plugins';\n\nconst TS_SCHEMA = dedent(/* GraphQL */ `\n  scalar Date\n\n  schema {\n    query: Query\n  }\n\n  type Query {\n    me: User!\n    user(id: ID!): User\n    allUsers: [User]\n    search(term: String!): [SearchResult!]!\n    myChats: [Chat!]!\n  }\n\n  enum Role {\n    USER\n    ADMIN\n  }\n\n  interface Node {\n    id: ID!\n  }\n\n  union SearchResult = User | Chat | ChatMessage\n\n  type User implements Node {\n    id: ID!\n    username: String!\n    email: String!\n    role: Role!\n  }\n\n  type Chat implements Node {\n    id: ID!\n    users: [User!]!\n    messages: [ChatMessage!]!\n  }\n\n  type ChatMessage implements Node {\n    id: ID!\n    content: String!\n    time: Date!\n    user: User!\n  }\n`);\n\nconst TS_QUERY = dedent(/* GraphQL */ `\n  query findUser($userId: ID!) {\n    user(id: $userId) {\n      ...UserFields\n    }\n  }\n\n  fragment UserFields on User {\n    id\n    username\n    role\n  }\n`);\n\nexport const APP_TSX = `\\\nimport { useQuery } from '@apollo/client';\n\nimport { graphql } from './gql/gql';\n\nconst findUserQuery = graphql(\\`${TS_QUERY}\\`);\n\nfunction App() {\n  const { data } = useQuery(findUserQuery, { variables: { userId: 10 } });\n  return (\n    <div className=\"App\">\n      {data?.user?.username}\n    </div>\n  );\n}\n\nexport default App;\n`;\n\nexport const EXAMPLES: Record<\n  string,\n  {\n    name: string;\n    description?: string;\n    tags: (Icon | 'frontend' | 'backend' | string)[];\n    config: string;\n    schema: string;\n    documents?: string;\n    operationsFile?: {\n      filename: string;\n      content: string;\n      language: string;\n    };\n  }[]\n> = {\n  TypeScript: [\n    {\n      name: 'Client preset',\n      description: `This is an example of using a Client preset (recommended).`,\n      tags: ['typescript', 'frontend'],\n      config: `generates:\n  gql/:\n    preset: client`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n      operationsFile: {\n        filename: 'App.tsx',\n        content: APP_TSX,\n        language: 'typescript',\n      },\n    },\n    {\n      name: 'Schema types',\n      description: `This is the simplest example of generating output based on a GraphQL Schema. Codegen will generate the compatible base type, based on your schema. These type declarations are 1:1 to your schema, and it will be used as base types for other Codegen plugins (such as \\`typescript-operations\\`), while combined into the same file.`,\n      tags: ['typescript', 'frontend', 'backend'],\n      config: `generates:\n  types.ts:\n    plugins:\n      - typescript`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'Operations types',\n      description: `This examples uses the based types from \\`typescript\\` plugin, and generates TypeScript signature based on your GraphQL operations (query/mutation/subscription/fragment) and the selection set you choose in each operation.`,\n      tags: ['typescript', 'frontend'],\n      config: `generates:\n  operations-types.ts:\n    plugins:\n      - typescript\n      - typescript-operations`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'Operations types (near-operation-file)',\n      description: `This examples uses the based types from \\`typescript\\` plugin, and generates TypeScript signature based on your GraphQL operations (query/mutation/subscription/fragment) and the selection set you choose in each operation. It uses Presets feature to manipulate the output of the codegen, and generate multiple files. In this example, it will generate a file per each operation, near the source file.`,\n      tags: ['typescript', 'frontend'],\n      config: `generates:\n  ./types.ts:\n    plugins:\n      - typescript\n  ./:\n    preset: near-operation-file\n    presetConfig:\n      extension: .generated.tsx\n      baseTypesPath: types.ts\n    plugins:\n      - typescript-operations\n      - typescript-react-apollo`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'Operations types (with Pick)',\n      description: `This is a similar output to regular usage of \\`typescript-operations\\`, but instead of using \\`Pick\\`, it will use the primitive value when possible, and reduce the output to the minimal types possible.`,\n      tags: ['typescript', 'frontend'],\n      config: `generates:\n  operations-types.ts:\n    config:\n      preResolveTypes: false\n    plugins:\n      - typescript\n      - typescript-operations`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'TypedDocumentNode',\n      description:\n        'This plugin generates a per-compiled version of `DocumentNode`, with the result and variables types bundled into the object, using this library: https://github.com/dotansimha/graphql-typed-document-node',\n      tags: ['typescript', 'frontend'],\n      config: `generates:\n  operations-types.ts:\n    plugins:\n      - typescript\n      - typescript-operations\n      - typed-document-node`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'Apollo-Client v3 TypePolicies',\n      description: 'This plugin generates fully-typed `keyFields` and Type-Policies for Apollo-Client v3.',\n      tags: ['typescript', 'apollo'],\n      config: `generates:\n      type-policies.ts:\n        plugins:\n          - typescript-apollo-client-helpers`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'React-Query Hooks',\n      description:\n        'This example uses types generated by `typescript` and `typescript-operations`, and creates a fully type-safe React Hooks, based on your GraphQL operations, that wraps \"react-query\" hooks.',\n      tags: ['typescript', 'react', 'react_query', 'frontend'],\n      config: `generates:\n  types-and-hooks.tsx:\n    plugins:\n      - typescript\n      - typescript-operations\n      - typescript-react-query`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'RTK-Query Hooks',\n      description: `This example uses types generated by \\`typescript\\` and \\`typescript-operations\\`, and creates fully type-safe React Hooks, based on your GraphQL operations, by injecting those into an existing RTK-Query api.`,\n      tags: ['typescript', 'react', 'rtk-query', 'redux', 'frontend'],\n      config: `generates:\n  types-and-hooks.tsx:\n    plugins:\n      - typescript\n      - typescript-operations\n      - typescript-rtk-query:\n          importBaseApiFrom: 'src/app/api/baseApi'\n          exportHooks: true`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'React-Apollo Hooks',\n      description: `This example uses types generated by \\`typescript\\` and \\`typescript-operations\\`, and creates fully type-safe React Hooks, based on your GraphQL operations.`,\n      tags: ['typescript', 'react', 'apollo', 'frontend'],\n      config: `generates:\n  types-and-hooks.tsx:\n    plugins:\n      - typescript\n      - typescript-operations\n      - typescript-react-apollo`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'React-Apollo Data Components (deprecated)',\n      description: `This example uses types generated by \\`typescript\\` and \\`typescript-operations\\`, and creates a fully type-safe React Components, based on your GraphQL operations.`,\n      tags: ['typescript', 'react', 'apollo', 'frontend'],\n      config: `generates:\n  types-and-components.tsx:\n    config:\n      withComponent: true\n    plugins:\n      - typescript\n      - typescript-operations\n      - typescript-react-apollo`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'React-Apollo Data HOC (deprecated)',\n      description: `This example uses types generated by \\`typescript\\` and \\`typescript-operations\\`, and creates a fully type-safe React HOC, based on your GraphQL operations.`,\n      tags: ['typescript', 'react', 'apollo', 'frontend'],\n      config: `generates:\n  types-and-hoc.tsx:\n    config:\n      withHOC: true\n    plugins:\n      - typescript\n      - typescript-operations\n      - typescript-react-apollo`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'Vue-Apollo composition functions',\n      description: `This example uses types generated by \\`typescript\\` and \\`typescript-operations\\`, and creates a fully type-safe Vue composition components, based on your GraphQL operations.`,\n      tags: ['typescript', 'vue', 'apollo', 'frontend'],\n      config: `generates:\n  composition-functions.ts:\n    plugins:\n      - typescript\n      - typescript-operations\n      - typescript-vue-apollo`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'Vue-Apollo Smart Operation functions',\n      description: `This example uses types generated by \\`typescript\\` and \\`typescript-operations\\`, and creates fully type-safe Vue Apollo Smart Query options and mutation functions, based on your GraphQL operations.`,\n      tags: ['typescript', 'vue', 'apollo', 'frontend'],\n      config: `generates:\n  composition-functions.ts:\n    plugins:\n      - typescript\n      - typescript-operations\n      - typescript-vue-apollo-smart-ops`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'Apollo-Angular Components',\n      description: `This example uses types generated by \\`typescript\\` and \\`typescript-operations\\`, and creates a fully type-safe Angular \\`Service\\`, based on your GraphQL operations.`,\n      tags: ['typescript', 'angular', 'apollo', 'frontend'],\n      config: `generates:\n  components.ts:\n    plugins:\n      - typescript\n      - typescript-operations\n      - typescript-apollo-angular`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'Urql',\n      description: `This example uses types generated by \\`typescript\\` and \\`typescript-operations\\`, and creates a fully type-safe Urql Hooks, based on your GraphQL operations.`,\n      tags: ['typescript', 'urql', 'react', 'frontend'],\n      config: `generates:\n  components.tsx:\n    config:\n      withHooks: true\n    plugins:\n      - typescript\n      - typescript-operations\n      - typescript-urql`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'Stencil-Apollo Components',\n      description: `This example uses types generated by \\`typescript\\` and \\`typescript-operations\\`, and creates a fully Stencil Components, based on your GraphQL operations.`,\n      tags: ['typescript', 'apollo', 'stencil', 'frontend'],\n      config: `generates:\n  components.tsx:\n    plugins:\n      - typescript\n      - typescript-operations\n      - typescript-stencil-apollo`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'Resolvers Signature',\n      description: `This example demonstrate how to generate a basic resolver signature, based on your GraphQL schema. With the default setup, you'll need to adjust your models types to the same structure of your GraphQL schema (see mappers example for more advanced usage).\n\n[You can read more about using this plugin here](https://the-guild.dev/blog/better-type-safety-for-resolvers-with-graphql-codegen)`,\n      tags: ['nodejs', 'backend'],\n      config: `generates:\n  resolvers.ts:\n    plugins:\n      - typescript\n      - typescript-resolvers`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'Resolvers Signature (with custom models)',\n      description: `This example demonstrate how to generate resolvers signature, based on your GraphQL schema, with your model types (\\`mappers\\` configuration)\n\n[You can read more about using this plugin here](https://the-guild.dev/blog/better-type-safety-for-resolvers-with-graphql-codegen)`,\n      tags: ['nodejs', 'backend'],\n      config: `generates:\n  resolvers.ts:\n    config:\n      mappers:\n        User: ./models#UserDbObject\n        Chat: ./models#ChatModel\n    plugins:\n      - typescript\n      - typescript-resolvers`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'graphql-request typed SDK',\n      tags: ['nodejs', 'backend', 'frontend'],\n      config: `generates:\n  sdk.ts:\n    plugins:\n      - typescript\n      - typescript-graphql-request`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'Generic SDK',\n      tags: ['nodejs', 'backend'],\n      config: `generates:\n  sdk.ts:\n    plugins:\n      - typescript\n      - typescript-generic-sdk`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n    {\n      name: 'type-graphql',\n      tags: ['type_graphql', 'nodejs', 'backend'],\n      config: `generates:\n  types.ts:\n    plugins:\n      - typescript-type-graphql`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'MongoDB Models',\n      tags: ['mongodb', 'nodejs', 'backend'],\n      config: `generates:\n    models.ts:\n      plugins:\n        - typescript-mongodb`,\n      schema: dedent(/* GraphQL */ `\n        type User @entity {\n          id: ID! @id\n          username: String! @column\n          email: String! @column @map(path: \"login.email\")\n          profile: Profile! @column\n          chats: [Chat!]! @link\n        }\n\n        type Profile @entity(embedded: true, additionalFields: [{ path: \"dateOfBirth\", type: \"string\" }]) {\n          name: String! @column\n          age: Int\n        }\n\n        type Chat @entity {\n          id: ID! @id\n          users: [User!]! @link\n          messages: [ChatMessage!]!\n        }\n\n        type ChatMessage @entity {\n          id: ID! @id\n          chat: Chat! @link\n          content: String! @column\n          author: User! @link\n        }\n      `),\n    },\n  ],\n  '.NET': [\n    {\n      name: 'C# Schema types',\n      tags: ['csharp', 'frontend', 'backend'],\n      config: `generates:\n  src/main/c-sharp/my-org/my-app/Types.cs:\n    plugins:\n      - c-sharp`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'C# Operations',\n      tags: ['csharp', 'frontend'],\n      config: `generates:\n  src/main/c-sharp/my-org/my-app/Operations.cs:\n    plugins:\n      - c-sharp-operations`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n  ],\n  Dart: [\n    {\n      name: 'Flutter Freezed models',\n      description: `This plugin generate Freezed classes from your GraphQL Schema`,\n      tags: ['dart', 'flutter', 'freezed'],\n      config: `generates:\n  flutter-app/lib/data/models/app_models.dart:\n    plugins:\n      - flutter-freezed\n    config:\n      customScalars:\n        {\n          \"Date\": \"DateTime\",\n        }`,\n      schema: TS_SCHEMA,\n    },\n  ],\n  Java: [\n    {\n      name: 'Types (Enum & Input)',\n      tags: ['java', 'backend'],\n      config: `generates:\n  src/main/java/my/app/generated/Types.java:\n    plugins:\n      - java`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'Resolvers Signature',\n      tags: ['java', 'backend'],\n      config: `generates:\n  src/main/java/my/app/generated/Resolvers.java:\n    plugins:\n      - java-resolvers`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'Apollo Android',\n      tags: ['java', 'apollo', 'frontend'],\n      config: `generates:\n  ./app/src/main/java/:\n    preset: java-apollo-android\n    config:\n      package: \"com.my.paackage.generated.graphql\"\n      typePackage: \"com.my.paackage.generated.Types\"\n      fragmentPackage: \"com.my.paackage.generated.Fragment\"\n    plugins:\n      - java-apollo-android`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n  ],\n  Flow: [\n    {\n      name: 'Schema types',\n      tags: ['flow', 'frontend', 'backend'],\n      config: `generates:\n  types.flow.js:\n    plugins:\n      - flow`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'Resolvers Signature',\n      tags: ['flow', 'backend'],\n      config: `generates:\n  resolvers.flow.js:\n    plugins:\n      - flow\n      - flow-resolvers`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'Operations types',\n      tags: ['flow', 'frontend'],\n      config: `generates:\n  types.flow.js:\n    plugins:\n      - flow\n      - flow-operations`,\n      schema: TS_SCHEMA,\n      documents: TS_QUERY,\n    },\n  ],\n  Other: [\n    {\n      name: 'JSDoc',\n      tags: [],\n      config: `generates:\n  schema.js:\n    plugins:\n      - jsdoc`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'Introspection JSON',\n      tags: ['graphql'],\n      config: `generates:\n  schema.json:\n    plugins:\n      - introspection`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'Schema AST',\n      tags: ['graphql'],\n      config: `generates:\n  schema.graphql:\n    plugins:\n      - schema-ast`,\n      schema: TS_SCHEMA,\n    },\n    {\n      name: 'Fragment Matcher',\n      tags: ['typescript', 'apollo', 'frontend'],\n      config: `generates:\n  fragment-matcher.json:\n    plugins:\n      - fragment-matcher`,\n      schema: TS_SCHEMA,\n    },\n  ],\n};\n"
  },
  {
    "path": "website/src/components/live-demo/formatter.ts",
    "content": "import { extname } from 'path';\n\nexport type Config = {\n  generates: Record<\n    string,\n    {\n      plugins: (string | unknown)[];\n      preset?: string;\n      presetConfig?: {\n        baseTypesPath: string;\n        extension: string;\n        typesPath: string;\n      };\n    }\n  >;\n};\n\nexport function getMode(config: Config) {\n  const ext = extname(Object.keys(config.generates)[0]);\n  switch (ext.slice(1)) {\n    case 'graphql':\n      return 'graphql';\n    case 'json':\n      return 'json';\n    case 'java':\n      return 'java';\n    case 'js':\n    case 'jsx':\n      return 'javascript';\n    default:\n      return 'text/typescript';\n  }\n}\n"
  },
  {
    "path": "website/src/components/live-demo/generate.ts",
    "content": "import { codegen } from '@graphql-codegen/core';\nimport { parse } from 'graphql';\nimport { load } from 'js-yaml';\nimport { pluginLoaderMap, presetLoaderMap } from './plugins';\nimport { normalizeConfig } from './utils';\nimport { Config } from './formatter';\n\nif (typeof window !== 'undefined') {\n  // @ts-ignore\n  process.hrtime = () => [0, 0]; // Fix error - TypeError: process.hrtime is not a function\n  window.global = window; // type-graphql error - global is not defined\n}\n\nexport async function generate(config: string, schema: string, documents?: string, documentsLocation?: string) {\n  try {\n    const outputs = [];\n    const cleanTabs = config.replace(/\\t/g, '  ');\n    const { generates, ...otherFields } = load(cleanTabs) as Record<string, Config>;\n    const runConfigurations = [];\n\n    for (const [filename, outputOptions] of Object.entries(generates)) {\n      const plugins = normalizeConfig(outputOptions.plugins || outputOptions);\n      const outputConfig = outputOptions.config;\n      const pluginMap: Record<string, any> = {};\n\n      const props = {\n        plugins,\n        pluginMap,\n        schema: parse(schema),\n        documents: documents\n          ? [\n              {\n                location: documentsLocation || 'operation.graphql',\n                document: parse(documents),\n                rawSDL: documents,\n              },\n            ]\n          : [],\n        config: {\n          ...otherFields.config,\n          ...outputConfig,\n        },\n      };\n\n      await Promise.all(\n        plugins?.map(async pluginElement => {\n          const [pluginName] = Object.keys(pluginElement);\n          try {\n            pluginMap[pluginName as string] = await pluginLoaderMap[pluginName as keyof typeof pluginLoaderMap]();\n          } catch (e) {\n            console.error(e);\n          }\n        })\n      );\n\n      if (!outputOptions.preset) {\n        runConfigurations.push({\n          filename,\n          ...props,\n        });\n      } else {\n        const presetExport = await presetLoaderMap[outputOptions.preset as unknown as keyof typeof presetLoaderMap]();\n        const presetFn = typeof presetExport === 'function' ? presetExport : presetExport.preset;\n\n        runConfigurations.push(\n          ...(await presetFn.buildGeneratesSection({\n            baseOutputDir: filename,\n            presetConfig: { ...outputOptions.presetConfig, typesPath: 'graphql.ts', baseTypesPath: 'graphql.ts' },\n            ...props,\n          }))\n        );\n      }\n    }\n\n    for (const execConfig of runConfigurations) {\n      outputs.push({\n        filename: execConfig.filename,\n        content: await codegen(execConfig),\n      });\n    }\n\n    return outputs;\n  } catch (error: any) {\n    console.error(error);\n\n    if (error.details) {\n      return `\n      ${error.message}:\n\n      ${error.details}\n      `;\n    }\n\n    if (error.errors) {\n      return error.errors\n        .map(\n          (subError: any) => `${subError.message}:\n${subError.details}`\n        )\n        .join('\\n');\n    }\n\n    return error.message;\n  }\n}\n"
  },
  {
    "path": "website/src/components/live-demo/plugins.ts",
    "content": "/* eslint sort-keys: error */\n\nexport const presetLoaderMap = {\n  'import-types': () => import('@graphql-codegen/import-types-preset'),\n  'java-apollo-android': () => import('@graphql-codegen/java-apollo-android'),\n  'near-operation-file': () => import('@graphql-codegen/near-operation-file-preset'),\n  client: () => import('@graphql-codegen/client-preset'),\n};\n\nexport const pluginLoaderMap = {\n  add: () => import('@graphql-codegen/add'),\n  'c-sharp': () => import('@graphql-codegen/c-sharp'),\n  'c-sharp-operations': () => import('@graphql-codegen/c-sharp-operations'),\n  'flutter-freezed': () => import('@graphql-codegen/flutter-freezed'),\n  flow: () => import('@graphql-codegen/flow'),\n  'flow-operations': () => import('@graphql-codegen/flow-operations'),\n  'flow-resolvers': () => import('@graphql-codegen/flow-resolvers'),\n  'fragment-matcher': () => import('@graphql-codegen/fragment-matcher'),\n  introspection: () => import('@graphql-codegen/introspection'),\n  java: () => import('@graphql-codegen/java'),\n  'java-apollo-android': () => import('@graphql-codegen/java-apollo-android'),\n  'java-resolvers': () => import('@graphql-codegen/java-resolvers'),\n  jsdoc: () => import('@graphql-codegen/jsdoc'),\n  'schema-ast': () => import('@graphql-codegen/schema-ast'),\n  time: () => import('@graphql-codegen/time'),\n  'typed-document-node': () => import('@graphql-codegen/typed-document-node'),\n  typescript: () => import('@graphql-codegen/typescript'),\n  'typescript-apollo-angular': () => import('@graphql-codegen/typescript-apollo-angular'),\n  'typescript-apollo-client-helpers': () => import('@graphql-codegen/typescript-apollo-client-helpers'),\n  'typescript-generic-sdk': () => import('@graphql-codegen/typescript-generic-sdk'),\n  'typescript-graphql-files-modules': () => import('@graphql-codegen/typescript-graphql-files-modules'),\n  'typescript-graphql-request': () => import('@graphql-codegen/typescript-graphql-request'),\n  'typescript-mongodb': () => import('@graphql-codegen/typescript-mongodb'),\n  'typescript-operations': () => import('@graphql-codegen/typescript-operations'),\n  'typescript-react-apollo': () => import('@graphql-codegen/typescript-react-apollo'),\n  'typescript-react-query': () => import('@graphql-codegen/typescript-react-query'),\n  'typescript-resolvers': () => import('@graphql-codegen/typescript-resolvers'),\n  'typescript-rtk-query': () => import('@graphql-codegen/typescript-rtk-query'),\n  'typescript-stencil-apollo': () => import('@graphql-codegen/typescript-stencil-apollo'),\n  'typescript-type-graphql': () => import('@graphql-codegen/typescript-type-graphql'),\n  'typescript-urql': () => import('@graphql-codegen/typescript-urql'),\n  'typescript-vue-apollo': () => import('@graphql-codegen/typescript-vue-apollo'),\n  'typescript-vue-apollo-smart-ops': () => import('@graphql-codegen/typescript-vue-apollo-smart-ops'),\n  'typescript-vue-urql': () => import('@graphql-codegen/typescript-vue-urql'),\n};\n"
  },
  {
    "path": "website/src/components/live-demo/utils.ts",
    "content": "import { Config } from './formatter';\n\nexport function normalizeConfig(config: Config['generates'][0]) {\n  if (typeof config === 'string') {\n    return [{ [config]: {} }];\n  }\n  if (Array.isArray(config)) {\n    return config.map(plugin => (typeof plugin === 'string' ? { [plugin]: {} } : plugin));\n  }\n  if (typeof config === 'object') {\n    return Object.keys(config).reduce<Record<string, any>[]>((prev, pluginName) => {\n      if (pluginName === 'preset') return prev;\n      return [...prev, { [pluginName]: config[pluginName] }];\n    }, []);\n  }\n  return [];\n}\n"
  },
  {
    "path": "website/src/components/page.tsx",
    "content": "import { ReactNode } from 'react';\nimport { cn } from '@theguild/components';\n\nexport function Page(props: { children: ReactNode; className?: string }) {\n  return <div className={cn('flex h-full flex-col', props.className)}>{props.children}</div>;\n}\n"
  },
  {
    "path": "website/src/components/plugin.tsx",
    "content": "import { ReactElement } from 'react';\nimport { Tabs, Callout, mdxComponents, RemoteContent } from '@theguild/components';\n\nexport function PluginHeader(): ReactElement {\n  // Get the data from SSG, and render it as a component.\n  // const { compiledHeader } = useData();\n\n  return <RemoteContent components={{ ...mdxComponents, Tab: Tabs.Tab, $Tabs: Tabs, Callout }} />;\n  // return (\n  // <MDXRemote compiledSource={compiledHeader}  />\n  // );\n}\n\nexport const PluginApiDocs = (): ReactElement => {\n  // Get the data from SSG, and render it as a component.\n  // const { compiledSource } = useData();\n  return null;\n  // return <MDXRemote compiledSource={compiledSource} />;\n};\n"
  },
  {
    "path": "website/src/components/plugins-marketplace-search.tsx",
    "content": "import { useMemo } from 'react';\nimport { IMarketplaceSearchProps, MarketplaceSearch } from '@theguild/components';\nimport { compareDesc } from 'date-fns';\nimport { CategoryToPackages } from '@/category-to-packages.mjs';\nimport { ALL_TAGS, Icon, icons, PACKAGES } from '@/lib/plugins';\nimport { packagesInfo } from '@/lib/packages-info.generated';\n\nexport type Plugin = {\n  title: string;\n  readme: string;\n  createdAt: string;\n  updatedAt: string;\n  description: string;\n  linkHref: string;\n  weeklyNPMDownloads: number;\n  icon: Icon | string;\n  tags: string[];\n};\n\nexport const getPluginsStaticProps = async () => {\n  const categoryEntries = Object.entries(CategoryToPackages);\n\n  const plugins: Plugin[] = Object.entries(PACKAGES).map(([identifier, { title, icon, tags }]) => {\n    const packageInfo = packagesInfo[identifier as keyof typeof packagesInfo];\n    if (!packageInfo) {\n      throw new Error(`Unknown \"${identifier}\" plugin identifier`);\n    }\n\n    const { readme, createdAt, updatedAt, description, weeklyNPMDownloads = 0 } = packageInfo;\n\n    const [category] = categoryEntries.find(([, pluginName]) => pluginName.includes(identifier)) || [];\n\n    return {\n      title,\n      readme,\n      createdAt,\n      updatedAt,\n      description,\n      linkHref: `/plugins/${category}/${identifier}`,\n      weeklyNPMDownloads,\n      icon,\n      tags,\n    };\n  });\n\n  return {\n    props: {\n      // We add an `ssg` field to the page props,\n      // which will be provided to the Nextra's `useData` hook.\n      ssg: plugins,\n    },\n  };\n};\n\nexport function PluginsMarketplaceSearch({\n  className,\n  plugins,\n  colorScheme,\n}: {\n  plugins: Plugin[];\n  className?: string;\n  colorScheme?: IMarketplaceSearchProps['colorScheme'];\n}) {\n  const marketplaceItems = useMemo(\n    () =>\n      plugins.map(plugin => {\n        const icon = icons[plugin.icon as Icon];\n        return {\n          title: plugin.title,\n          description: plugin.description,\n          tags: plugin.tags,\n          link: {\n            href: plugin.linkHref,\n            title: `${plugin.title} plugin details`,\n          },\n          update: plugin.updatedAt,\n          image: {\n            src: icon || plugin.icon,\n            placeholder: 'empty' as const,\n            loading: 'eager' as const,\n            alt: plugin.title,\n          },\n          weeklyNPMDownloads: plugin.weeklyNPMDownloads,\n        };\n      }),\n    [plugins]\n  );\n\n  const recentlyUpdatedItems = useMemo(\n    () => [...marketplaceItems].sort((a, b) => compareDesc(new Date(a.update), new Date(b.update))),\n    [marketplaceItems]\n  );\n\n  const trendingItems = useMemo(\n    () =>\n      marketplaceItems\n        .filter(i => i.weeklyNPMDownloads)\n        .sort((a, b) => {\n          const aMonthlyDownloads = a.weeklyNPMDownloads || 0;\n          const bMonthlyDownloads = b.weeklyNPMDownloads || 0;\n\n          return bMonthlyDownloads - aMonthlyDownloads;\n        }),\n    [marketplaceItems]\n  );\n\n  return (\n    <MarketplaceSearch\n      title=\"Explore Plugins & Presets\"\n      tagsFilter={ALL_TAGS}\n      placeholder=\"Search...\"\n      primaryList={{\n        title: 'Trending',\n        items: trendingItems,\n        placeholder: '0 items',\n        pagination: 10,\n      }}\n      secondaryList={{\n        title: 'Recently Updated',\n        items: recentlyUpdatedItems,\n        placeholder: '0 items',\n        pagination: 10,\n      }}\n      queryList={{\n        title: 'Search Results',\n        items: marketplaceItems,\n        placeholder: 'No results for {query}',\n        pagination: 10,\n      }}\n      className={className}\n      colorScheme={colorScheme}\n    />\n  );\n}\n"
  },
  {
    "path": "website/src/lib/docs-generator.ts",
    "content": "import * as TJS from 'typescript-json-schema';\nimport { PluginConfig, PresetConfig } from './plugins-docs';\n\nexport function generateDocs(schema: TJS.Definition, types: (PluginConfig | PresetConfig)[]): Record<string, string> {\n  return Object.fromEntries(\n    types.map(p => {\n      const subSchema = schema.definitions![p.identifier] as TJS.Definition;\n      const apiDocs = generateContentForSchema(subSchema);\n      let content = '';\n\n      if (subSchema.description) {\n        content += `${subSchema.description}\\n\\n`;\n      }\n\n      if (apiDocs) {\n        content += `## Config API Reference\\n\\n${apiDocs}`;\n      }\n\n      return [p.name, content];\n    })\n  );\n}\n\nfunction generateContentForSchema(schema: TJS.Definition): string {\n  return Object.entries(schema.properties || {})\n    .map(([propName, prop]) => {\n      if (typeof prop === 'boolean') {\n        throw new Error(`Prop \"${propName}\" should not be a \"boolean\"`);\n      }\n\n      return `### \\`${propName}\\`\n\n  type: \\`${printType(prop)}\\`\n  ${prop.default === undefined ? '' : `default: \\`${prop.default === '' ? '(empty)' : prop.default}\\`\\n`}\n  ${prop.description ? `${prop.description}\\n` : ''}\n  ${\n    (prop as any).exampleMarkdown\n      ? ` \\n#### Usage Examples\\n\\n${(prop as any).exampleMarkdown.replaceAll('## ', '##### ')}\\n`\n      : ''\n  }`;\n    })\n    .join('\\n');\n}\n\nfunction printType(def: TJS.Definition): string {\n  if (def.type) {\n    if (def.enum) {\n      return `${def.type} (values: ${def.enum.join(', ')})`;\n    }\n\n    if (def.type === 'array') {\n      return `${printType(def.items as TJS.Definition)}[]`;\n    }\n\n    return def.type as string;\n  }\n  if (def.$ref) {\n    return def.$ref.replace('#/definitions/', '');\n  }\n  if (def.anyOf) {\n    return def.anyOf.map(t => printType(t as TJS.Definition)).join(' | ');\n  }\n  if (def.oneOf) {\n    return def.oneOf.map(t => printType(t as TJS.Definition)).join(' | ');\n  }\n  if (def.allOf) {\n    return def.allOf.map(t => printType(t as TJS.Definition)).join(' & ');\n  }\n  return '';\n}\n"
  },
  {
    "path": "website/src/lib/plugin-get-static-props.ts",
    "content": "import { parse } from 'node:path';\nimport { defaultRemarkPlugins } from '@theguild/components/next.config';\nimport { format } from 'date-fns';\nimport { PACKAGES } from '@/lib/plugins';\nimport { transformDocs } from '@/lib/transform';\nimport { buildDynamicMDX } from 'nextra/remote';\nimport { packagesInfo } from '@/lib/packages-info.generated';\n\n// Can't be used in plugin.tsx due incorrect tree shaking:\n// Module not found: Can't resolve 'fs'\nexport const pluginGetStaticProps =\n  (fileName: string, { isDev = true, hasOperationsNote = false, ...rest } = {}) =>\n  async () => {\n    const unknownOptions = Object.keys(rest);\n    if (unknownOptions.length) {\n      throw new Error(`Unknown options \"${unknownOptions}\"`);\n    }\n    const identifier = parse(fileName).name;\n    const plugin = PACKAGES[identifier];\n    if (!plugin) {\n      throw new Error(`Unknown \"${identifier}\" plugin identifier`);\n    }\n\n    const { npmPackage } = plugin;\n    const { readme, updatedAt } = packagesInfo[identifier as keyof typeof packagesInfo];\n\n    const generatedDocs = transformDocs();\n    const source = generatedDocs.docs[identifier] || readme.replaceAll('```yml', '```yaml') || '';\n    const title = plugin.title ?? '';\n\n    const mdx = await buildDynamicMDX(\n      `\n      # ${title}\n|Package name|Weekly Downloads|Version|License|Updated|\n|-|-|-|-|-|\n|[\\`${npmPackage}\\`](https://npmjs.com/package/${npmPackage})|![Downloads](https://badgen.net/npm/dw/${npmPackage} \"Downloads\")|![Version](https://badgen.net/npm/v/${npmPackage} \"Version\")|![License](https://badgen.net/npm/license/${npmPackage} \"License\")|${format(\n        new Date(updatedAt),\n        'MMM do, yyyy'\n      )}|\n\n## Installation\n\n\\`\\`\\`sh npm2yarn\nnpm i ${isDev ? '-D ' : ''}${npmPackage}\n\\`\\`\\`\n\n${\n  hasOperationsNote\n    ? `<Callout type='warning'>\n**Usage Requirements**\nIn order to use this GraphQL Codegen plugin, please make sure that you have GraphQL operations (\\`query\\` / \\`mutation\\` / \\`subscription\\` and \\`fragment\\`) set as \\`documents: …\\` in your \\`codegen.yml\\`.\n\nWithout loading your GraphQL operations (\\`query\\`, \\`mutation\\`, \\`subscription\\` and \\`fragment\\`), you won't see any change in the generated output.\n</Callout>`\n    : ''\n}\n\n${source}\n`,\n      {\n        defaultShowCopyCode: true,\n        mdxOptions: {\n          remarkPlugins: defaultRemarkPlugins,\n        },\n      }\n    );\n    return { props: mdx };\n  };\n"
  },
  {
    "path": "website/src/lib/plugins/index.ts",
    "content": "import { StaticImageData } from 'next/image';\nimport angularIcon from './icons/angular.svg';\nimport apolloIcon from './icons/apollo.svg';\nimport codegenIcon from './icons/codegen.svg';\nimport csharpIcon from './icons/csharp.svg';\nimport dartIcon from './icons/dart.svg';\nimport flowIcon from './icons/flow.svg';\nimport graphqlIcon from './icons/graphql.svg';\nimport hasuraIcon from './icons/hasura.svg';\nimport javaIcon from './icons/java.svg';\nimport mongodbIcon from './icons/mongodb.png';\nimport nhostIcon from './icons/nhost.svg';\nimport nodeJsIcon from './icons/nodejs.svg';\nimport reactIcon from './icons/react.svg';\nimport reactQueryIcon from './icons/react-query.svg';\nimport typeGraphqlIcon from './icons/type-graphql.png';\nimport typescriptIcon from './icons/typescript.svg';\nimport urqlIcon from './icons/urql.svg';\nimport vueIcon from './icons/vue.svg';\nimport graphqlModulesIcon from './icons/graphql-modules.svg';\nimport mswIcon from './icons/msw.svg';\nimport reasonClientIcon from 'https://pbs.twimg.com/profile_images/1004185780313395200/ImZxrDWf_400x400.jpg';\n\nexport { PACKAGES } from './packages';\n\nconst ALL_ICONS = [\n  'graphql',\n  'csharp',\n  'flow',\n  'codegen',\n  'hasura',\n  'java',\n  'typescript',\n  'angular',\n  'apollo',\n  'react_query',\n  'type_graphql',\n  'vue',\n  'dart',\n  'mongodb',\n  'nhost',\n  'graphql_modules',\n  'reason_client',\n  'msw',\n  'nodejs',\n  'react',\n  'urql',\n] as const;\n\nexport type Icon = (typeof ALL_ICONS)[number];\n\n// TODO: These icons need to be swapped.\n/* eslint sort-keys: error */\nexport const icons: Record<Icon, StaticImageData> = {\n  angular: angularIcon,\n  apollo: apolloIcon,\n  codegen: codegenIcon,\n  csharp: csharpIcon,\n  dart: dartIcon,\n  flow: flowIcon,\n  graphql: graphqlIcon,\n  graphql_modules: graphqlModulesIcon,\n  hasura: hasuraIcon,\n  java: javaIcon,\n  mongodb: mongodbIcon,\n  nhost: nhostIcon,\n  msw: mswIcon,\n  nodejs: nodeJsIcon,\n  react: reactIcon,\n  react_query: reactQueryIcon,\n  reason_client: reasonClientIcon,\n  type_graphql: typeGraphqlIcon,\n  typescript: typescriptIcon,\n  urql: urqlIcon,\n  vue: vueIcon,\n};\n/* eslint-disable */\n\nexport const ALL_TAGS = [\n  'preset',\n  'plugin',\n  'typescript',\n  'csharp',\n  'dart',\n  'flutter',\n  'flow',\n  'java',\n  'utilities',\n  'mongodb',\n  'nhost',\n  'angular',\n  'react',\n  'svelte',\n  'next',\n  'apollo',\n  'urql',\n  'vue',\n  'kotlin',\n  'android',\n  'reason',\n  'relay',\n  'jsdoc',\n  'resolvers',\n  'hasura',\n  'validation',\n  'yup',\n  'zod',\n] as const;\n\nexport type Tag = (typeof ALL_TAGS)[number];\n"
  },
  {
    "path": "website/src/lib/plugins/packages.ts",
    "content": "import type { Icon, Tag } from './index';\n\nexport const PACKAGES: Record<\n  string,\n  {\n    title: string;\n    npmPackage: string;\n    icon: Icon | `https://${string}`;\n    tags: Tag[];\n  }\n> = {\n  add: {\n    title: 'Add',\n    npmPackage: '@graphql-codegen/add',\n    icon: 'graphql',\n    tags: ['plugin'],\n  },\n  'c-sharp-operations': {\n    title: 'C# Operations',\n    npmPackage: '@graphql-codegen/c-sharp-operations',\n    icon: 'csharp',\n    tags: ['plugin', 'csharp'],\n  },\n  'flow-operations': {\n    title: 'Flow Operations',\n    npmPackage: '@graphql-codegen/flow-operations',\n    icon: 'flow',\n    tags: ['plugin', 'flow'],\n  },\n  'flow-resolvers': {\n    title: 'Flow Resolvers',\n    npmPackage: '@graphql-codegen/flow-resolvers',\n    icon: 'flow',\n    tags: ['plugin', 'flow'],\n  },\n  'fragment-matcher': {\n    title: 'Fragment Matcher',\n    npmPackage: '@graphql-codegen/fragment-matcher',\n    icon: 'graphql',\n    tags: ['plugin', 'apollo'],\n  },\n  'graphql-modules-preset': {\n    title: 'GraphQL Modules Preset',\n    npmPackage: '@graphql-codegen/graphql-modules-preset',\n    icon: 'graphql_modules',\n    tags: ['preset', 'utilities', 'resolvers'],\n  },\n  'hasura-allow-list': {\n    title: 'Hasura Allow List',\n    npmPackage: '@graphql-codegen/hasura-allow-list',\n    icon: 'hasura',\n    tags: ['plugin', 'utilities', 'hasura'],\n  },\n  'import-types-preset': {\n    title: 'Import Types Preset',\n    npmPackage: '@graphql-codegen/import-types-preset',\n    icon: 'codegen',\n    tags: ['preset', 'utilities'],\n  },\n  'preset-client': {\n    title: 'Client preset',\n    npmPackage: '@graphql-codegen/client-preset',\n    icon: 'codegen',\n    tags: ['preset', 'next', 'react', 'urql', 'typescript', 'vue'],\n  },\n  introspection: {\n    title: 'Introspection',\n    npmPackage: '@graphql-codegen/introspection',\n    icon: 'graphql',\n    tags: ['plugin', 'utilities'],\n  },\n  java: {\n    title: 'Java',\n    npmPackage: '@graphql-codegen/java',\n    icon: 'java',\n    tags: ['plugin', 'java'],\n  },\n  'java-apollo-android': {\n    title: 'Java Apollo Android',\n    npmPackage: '@graphql-codegen/java-apollo-android',\n    icon: 'java',\n    tags: ['plugin', 'java', 'apollo', 'android'],\n  },\n  'java-resolvers': {\n    title: 'Java Resolvers',\n    npmPackage: '@graphql-codegen/java-resolvers',\n    icon: 'java',\n    tags: ['plugin', 'java'],\n  },\n  jsdoc: {\n    title: 'JSDoc',\n    npmPackage: '@graphql-codegen/jsdoc',\n    icon: 'graphql',\n    tags: ['plugin', 'jsdoc'],\n  },\n  kotlin: {\n    title: 'Kotlin',\n    npmPackage: '@graphql-codegen/kotlin',\n    icon: 'java',\n    tags: ['plugin', 'java', 'kotlin'],\n  },\n  'named-operations-object': {\n    title: 'Named Operations Object',\n    npmPackage: '@graphql-codegen/named-operations-object',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript'],\n  },\n  'near-operation-file-preset': {\n    title: 'Near Operation File Preset',\n    npmPackage: '@graphql-codegen/near-operation-file-preset',\n    icon: 'codegen',\n    tags: ['preset', 'utilities'],\n  },\n  'reason-client': {\n    title: 'Reason Client',\n    npmPackage: 'graphql-codegen-reason-client',\n    icon: 'reason_client',\n    tags: ['plugin', 'reason'],\n  },\n  'relay-operation-optimizer': {\n    title: 'Relay Operation Optimizer',\n    npmPackage: '@graphql-codegen/relay-operation-optimizer',\n    icon: 'graphql',\n    tags: ['plugin', 'relay'],\n  },\n  'schema-ast': {\n    title: 'Schema AST',\n    npmPackage: '@graphql-codegen/schema-ast',\n    icon: 'graphql',\n    tags: ['plugin', 'utilities'],\n  },\n  time: {\n    title: 'Time',\n    npmPackage: '@graphql-codegen/time',\n    icon: 'graphql',\n    tags: ['plugin', 'utilities'],\n  },\n  'typed-document-node': {\n    title: 'TypedDocumentNode',\n    npmPackage: '@graphql-codegen/typed-document-node',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript'],\n  },\n  typescript: {\n    title: 'TypeScript',\n    npmPackage: '@graphql-codegen/typescript',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript'],\n  },\n  'typescript-apollo-angular': {\n    title: 'TypeScript Apollo Angular',\n    npmPackage: '@graphql-codegen/typescript-apollo-angular',\n    icon: 'angular',\n    tags: ['plugin', 'typescript', 'apollo', 'angular'],\n  },\n  'typescript-apollo-client-helpers': {\n    title: 'Apollo-Client Helpers',\n    npmPackage: '@graphql-codegen/typescript-apollo-client-helpers',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript', 'apollo'],\n  },\n  'typescript-apollo-next': {\n    title: 'Typescript Apollo Next.js',\n    npmPackage: 'graphql-codegen-apollo-next-ssr',\n    icon: 'apollo',\n    tags: ['plugin', 'typescript', 'apollo', 'next'],\n  },\n  'typescript-document-nodes': {\n    title: 'TypeScript Document Nodes',\n    npmPackage: '@graphql-codegen/typescript-document-nodes',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript'],\n  },\n  'typescript-fabbrica': {\n    title: 'TypeScript Mock Data Factory',\n    npmPackage: '@mizdra/graphql-codegen-typescript-fabbrica',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript'],\n  },\n  'typescript-generic-sdk': {\n    title: 'TypeScript Generic SDK',\n    npmPackage: '@graphql-codegen/typescript-generic-sdk',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript'],\n  },\n  'typescript-graphql-files-modules': {\n    title: 'TypeScript GraphQL Files Modules',\n    npmPackage: '@graphql-codegen/typescript-graphql-files-modules',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript'],\n  },\n  'typescript-graphql-request': {\n    title: 'TypeScript GraphQL-Request',\n    npmPackage: '@graphql-codegen/typescript-graphql-request',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript'],\n  },\n  'typescript-mock-data': {\n    title: 'TypeScript Mock Data',\n    npmPackage: 'graphql-codegen-typescript-mock-data',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript'],\n  },\n  'typescript-mongodb': {\n    title: 'TypeScript MongoDB',\n    npmPackage: '@graphql-codegen/typescript-mongodb',\n    icon: 'mongodb',\n    tags: ['plugin', 'typescript', 'mongodb'],\n  },\n  'typescript-nhost': {\n    title: 'TypeScript Nhost',\n    npmPackage: '@graphql-codegen/typescript-nhost',\n    icon: 'nhost',\n    tags: ['plugin', 'typescript', 'nhost'],\n  },\n  'typescript-msw': {\n    title: 'TypeScript Msw',\n    npmPackage: '@graphql-codegen/typescript-msw',\n    icon: 'msw',\n    tags: ['plugin', 'typescript', 'utilities'],\n  },\n  'typescript-oclif': {\n    title: 'TypeScript Oclif',\n    npmPackage: '@graphql-codegen/typescript-oclif',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript'],\n  },\n  'typescript-operations': {\n    title: 'TypeScript Operations',\n    npmPackage: '@graphql-codegen/typescript-operations',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript'],\n  },\n  'typescript-react-apollo': {\n    title: 'TypeScript React Apollo',\n    npmPackage: '@graphql-codegen/typescript-react-apollo',\n    icon: 'apollo',\n    tags: ['plugin', 'typescript', 'react', 'apollo'],\n  },\n  'typescript-react-query': {\n    title: 'TypeScript React-Query',\n    npmPackage: '@graphql-codegen/typescript-react-query',\n    icon: 'react_query',\n    tags: ['plugin', 'typescript', 'react'],\n  },\n  'typescript-resolvers': {\n    title: 'TypeScript Resolvers',\n    npmPackage: '@graphql-codegen/typescript-resolvers',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript'],\n  },\n  'typescript-rtk-query': {\n    title: 'TypeScript RTK-Query',\n    npmPackage: '@graphql-codegen/typescript-rtk-query',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript', 'react'],\n  },\n  'typescript-stencil-apollo': {\n    title: 'TypeScript Stencil Apollo',\n    npmPackage: '@graphql-codegen/typescript-stencil-apollo',\n    icon: 'apollo',\n    tags: ['plugin', 'typescript', 'apollo'],\n  },\n  'typescript-svelte-apollo': {\n    title: 'TypeScript Svelte Apollo',\n    npmPackage: 'graphql-codegen-svelte-apollo',\n    icon: 'apollo',\n    tags: ['plugin', 'typescript', 'svelte', 'apollo'],\n  },\n  'typescript-type-graphql': {\n    title: 'TypeScript TypeGraphQL',\n    npmPackage: '@graphql-codegen/typescript-type-graphql',\n    icon: 'type_graphql',\n    tags: ['plugin', 'typescript'],\n  },\n  'typescript-urql': {\n    title: 'TypeScript Urql',\n    npmPackage: '@graphql-codegen/typescript-urql',\n    icon: 'typescript',\n    tags: ['plugin', 'typescript', 'urql', 'react'],\n  },\n  'typescript-validation-schema': {\n    title: 'TypeScript Validation Schema',\n    npmPackage: 'graphql-codegen-typescript-validation-schema',\n    icon: 'graphql',\n    tags: ['plugin', 'validation', 'yup', 'zod', 'typescript'],\n  },\n  'typescript-vue-apollo': {\n    title: 'TypeScript Vue Apollo Composition API',\n    npmPackage: '@graphql-codegen/typescript-vue-apollo',\n    icon: 'vue',\n    tags: ['plugin', 'typescript', 'vue', 'apollo'],\n  },\n  'typescript-vue-apollo-smart-ops': {\n    title: 'TypeScript Vue Apollo Smart Operations',\n    npmPackage: '@graphql-codegen/typescript-vue-apollo-smart-ops',\n    icon: 'vue',\n    tags: ['plugin', 'typescript', 'vue', 'apollo'],\n  },\n  'typescript-vue-urql': {\n    title: 'TypeScript Vue Urql',\n    npmPackage: '@graphql-codegen/typescript-vue-urql',\n    icon: 'vue',\n    tags: ['plugin', 'typescript', 'vue', 'urql'],\n  },\n  'urql-introspection': {\n    title: 'Urql Introspection for Schema Awareness',\n    npmPackage: '@graphql-codegen/urql-introspection',\n    icon: 'graphql',\n    tags: ['plugin', 'urql', 'typescript'],\n  },\n  'flutter-freezed': {\n    title: 'Dart Flutter Freezed Classes',\n    npmPackage: '@graphql-codegen/flutter-freezed',\n    icon: 'dart',\n    tags: ['plugin', 'dart', 'flutter'],\n  },\n};\n"
  },
  {
    "path": "website/src/lib/plugins-docs.ts",
    "content": "export type PluginConfig = { file: string; identifier: string; name: string };\nexport type PresetConfig = { file: string; identifier: string; name: string };\n\nexport const presetsConfigurations: PresetConfig[] = [\n  {\n    file: '../node_modules/@graphql-codegen/graphql-modules-preset/src/config.ts',\n    identifier: 'ModulesConfig',\n    name: 'graphql-modules-preset',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/near-operation-file-preset/typings/index.d.ts',\n    identifier: 'NearOperationFileConfig',\n    name: 'near-operation-file-preset',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/import-types-preset/typings/index.d.ts',\n    identifier: 'ImportTypesConfig',\n    name: 'import-types-preset',\n  },\n];\n\nexport const pluginsConfigurations: PluginConfig[] = [\n  {\n    file: '../node_modules/@graphql-codegen/flutter-freezed/typings/config.d.ts',\n    identifier: 'FlutterFreezedPluginConfig',\n    name: 'flutter-freezed',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-react-query/typings/config.d.ts',\n    identifier: 'ReactQueryRawPluginConfig',\n    name: 'typescript-react-query',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-rtk-query/typings/config.d.ts',\n    identifier: 'RTKConfig',\n    name: 'typescript-rtk-query',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-generic-sdk/typings/config.d.ts',\n    identifier: 'RawGenericSdkPluginConfig',\n    name: 'typescript-generic-sdk',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-apollo-client-helpers/typings/config.d.ts',\n    identifier: 'ApolloClientHelpersConfig',\n    name: 'typescript-apollo-client-helpers',\n  },\n  {\n    file: '../packages/plugins/other/add/src/config.ts',\n    identifier: 'AddPluginConfig',\n    name: 'add',\n  },\n  {\n    file: '../packages/plugins/other/time/src/config.ts',\n    identifier: 'TimePluginConfig',\n    name: 'time',\n  },\n  {\n    file: '../packages/plugins/typescript/typescript/src/config.ts',\n    identifier: 'TypeScriptPluginConfig',\n    name: 'typescript',\n  },\n  {\n    file: '../packages/plugins/typescript/operations/src/config.ts',\n    identifier: 'TypeScriptDocumentsPluginConfig',\n    name: 'typescript-operations',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/c-sharp/typings/config.d.ts',\n    identifier: 'CSharpResolversPluginRawConfig',\n    name: 'c-sharp',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/c-sharp-operations/typings/config.d.ts',\n    identifier: 'CSharpOperationsRawPluginConfig',\n    name: 'c-sharp-operations',\n  },\n  {\n    file: '../packages/plugins/other/schema-ast/src/index.ts',\n    identifier: 'SchemaASTConfig',\n    name: 'schema-ast',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-type-graphql/typings/config.d.ts',\n    identifier: 'TypeGraphQLPluginConfig',\n    name: 'typescript-type-graphql',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-graphql-files-modules/typings/index.d.ts',\n    identifier: 'TypeScriptFilesModulesPluginConfig',\n    name: 'typescript-graphql-files-modules',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/named-operations-object/typings/index.d.ts',\n    identifier: 'NamedOperationsObjectPluginConfig',\n    name: 'named-operations-object',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-graphql-request/typings/config.d.ts',\n    identifier: 'RawGraphQLRequestPluginConfig',\n    name: 'typescript-graphql-request',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-mongodb/typings/config.d.ts',\n    identifier: 'TypeScriptMongoPluginConfig',\n    name: 'typescript-mongodb',\n  },\n  {\n    file: '../packages/plugins/typescript/resolvers/src/config.ts',\n    identifier: 'TypeScriptResolversPluginConfig',\n    name: 'typescript-resolvers',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-apollo-angular/typings/config.d.ts',\n    identifier: 'ApolloAngularRawPluginConfig',\n    name: 'typescript-apollo-angular',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-nhost/typings/config.d.ts',\n    identifier: 'NhostPluginConfig',\n    name: 'typescript-nhost',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-urql/typings/config.d.ts',\n    identifier: 'UrqlRawPluginConfig',\n    name: 'typescript-urql',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-react-apollo/typings/config.d.ts',\n    identifier: 'ReactApolloRawPluginConfig',\n    name: 'typescript-react-apollo',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-vue-apollo/typings/config.d.ts',\n    identifier: 'VueApolloRawPluginConfig',\n    name: 'typescript-vue-apollo',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-vue-apollo-smart-ops/typings/config.d.ts',\n    identifier: 'VueApolloSmartOpsRawPluginConfig',\n    name: 'typescript-vue-apollo-smart-ops',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-vue-urql/typings/config.d.ts',\n    identifier: 'VueUrqlRawPluginConfig',\n    name: 'typescript-vue-urql',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-stencil-apollo/typings/config.d.ts',\n    identifier: 'StencilApolloRawPluginConfig',\n    name: 'typescript-stencil-apollo',\n  },\n  {\n    file: '../packages/plugins/typescript/document-nodes/src/index.ts',\n    identifier: 'TypeScriptDocumentNodesRawPluginConfig',\n    name: 'typescript-document-nodes',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/typescript-msw/typings/config.d.ts',\n    identifier: 'MSWConfig',\n    name: 'typescript-msw',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/java-apollo-android/typings/plugin.d.ts',\n    identifier: 'JavaApolloAndroidPluginConfig',\n    name: 'java-apollo-android',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/java-resolvers/typings/config.d.ts',\n    identifier: 'JavaResolversPluginRawConfig',\n    name: 'java-resolvers',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/java/typings/config.d.ts',\n    identifier: 'JavaResolversPluginRawConfig',\n    name: 'java',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/kotlin/typings/config.d.ts',\n    identifier: 'KotlinResolversPluginRawConfig',\n    name: 'kotlin',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/flow/typings/config.d.ts',\n    identifier: 'FlowPluginConfig',\n    name: 'flow',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/flow-resolvers/typings/config.d.ts',\n    identifier: 'FlowResolversPluginConfig',\n    name: 'flow-resolvers',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/flow-operations/typings/config.d.ts',\n    identifier: 'FlowDocumentsPluginConfig',\n    name: 'flow-operations',\n  },\n  {\n    file: '../packages/plugins/other/introspection/src/index.ts',\n    identifier: 'IntrospectionPluginConfig',\n    name: 'introspection',\n  },\n  {\n    file: '../packages/plugins/other/fragment-matcher/src/index.ts',\n    identifier: 'FragmentMatcherConfig',\n    name: 'fragment-matcher',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/urql-introspection/typings/index.d.ts',\n    identifier: 'UrqlIntrospectionConfig',\n    name: 'urql-introspection',\n  },\n  {\n    file: '../node_modules/@graphql-codegen/hasura-allow-list/typings/config.d.ts',\n    identifier: 'HasuraAllowListPluginConfig',\n    name: 'hasura-allow-list',\n  },\n];\n"
  },
  {
    "path": "website/src/lib/transform.ts",
    "content": "import * as TJS from 'typescript-json-schema';\nimport { generateDocs } from './docs-generator';\nimport { pluginsConfigurations, presetsConfigurations } from './plugins-docs';\nimport tsConfig from '../../tsconfig.json';\n\nconst ROOT_FILE = '../packages/utils/plugins-helpers/src/types.ts';\nconst ROOT_IDENTIFIER = 'Types.Config';\nconst MARKDOWN_JSDOC_KEY = 'exampleMarkdown';\n\nexport function transformDocs() {\n  const pluginsAndPresets = [...pluginsConfigurations, ...presetsConfigurations];\n\n  const program = TJS.getProgramFromFiles([ROOT_FILE, ...pluginsAndPresets.map(f => f.file)], {\n    baseUrl: '../../../',\n    paths: tsConfig.compilerOptions.paths,\n    skipLibCheck: true,\n    allowSyntheticDefaultImports: true,\n  });\n\n  const generator = TJS.buildGenerator(program, {\n    aliasRef: true,\n    validationKeywords: [MARKDOWN_JSDOC_KEY],\n  });\n\n  if (!generator) {\n    throw new Error(`Config-transform: failed to build TS generator...`);\n  }\n\n  const schema = generator.getSchemaForSymbols([ROOT_IDENTIFIER, ...pluginsAndPresets.map(f => f.identifier)]);\n\n  if (!schema.definitions) {\n    throw new Error('Config-transform: \"schema.definitions\" is not defined');\n  }\n\n  // This will make sure to add a nice auto complete for all built-in plugins and their configuration mapped\n  schema.definitions.GeneratedPluginsMap = {\n    anyOf: [\n      {\n        type: 'object',\n        additionalProperties: true,\n        properties: pluginsConfigurations.reduce((prev, plugin) => {\n          const refObj = {\n            additionalProperties: false,\n            $ref: `#/definitions/${plugin.identifier}`,\n          };\n\n          return {\n            ...prev,\n            [plugin.name]: refObj,\n            [`@graphql-codegen/${plugin.name}`]: refObj,\n          };\n        }, {}),\n      },\n      {\n        type: 'string',\n        oneOf: pluginsConfigurations.reduce<TJS.DefinitionOrBoolean[]>((prev, p) => {\n          const description = `${\n            (schema.definitions![p.identifier] as TJS.Definition).description || ''\n          }\\n\\nFor more details and documentation: https://the-guild.dev/graphql/codegen/docs/plugins/${\n            p.name\n          }\\n\\n=> Make sure to include \"@graphql-codegen/${\n            p.name\n          }\" in your package.json file and install your dependencies.\\n\\n`;\n\n          return [\n            ...prev,\n            { const: p.name, description },\n            {\n              const: `@graphql-codegen/${p.name}`,\n              description,\n            },\n          ];\n        }, []),\n      },\n      {\n        type: 'string',\n        description: `Point to a custom plugin loaded from your file-system.`,\n        pattern: `(\\\\\\\\?([^\\\\/]*[\\\\/])*)([^\\\\/]+)$`,\n      },\n      {\n        type: 'string',\n        description: `You can point to any third-party module from node_modules that matches the requirements of a GraphQL Codegen plugin.`,\n      },\n    ],\n  };\n\n  const configuredOutput = schema.definitions['Types.ConfiguredOutput'] as TJS.Definition;\n  const configuredPlugin = schema.definitions['Types.ConfiguredPlugin'] as TJS.Definition;\n\n  configuredPlugin.properties = Object.fromEntries(\n    pluginsConfigurations.map(pluginConfig => [pluginConfig.name, { $ref: `#/definitions/${pluginConfig.identifier}` }])\n  );\n\n  configuredOutput.properties!.config = {\n    additionalProperties: true,\n  };\n\n  configuredOutput.allOf = pluginsConfigurations.map(p => ({\n    if: {\n      properties: {\n        plugins: {\n          contains: {\n            type: 'string',\n            const: p.name,\n          },\n        },\n      },\n    },\n    then: {\n      properties: {\n        config: { $ref: `#/definitions/${p.identifier}` },\n      },\n    },\n  }));\n\n  // Point the root schema to the config root\n  schema.$ref = `#/definitions/${ROOT_IDENTIFIER}`;\n\n  const docsMarkdown = generateDocs(schema, pluginsAndPresets);\n\n  return {\n    docs: docsMarkdown,\n    schema,\n  };\n}\n"
  },
  {
    "path": "website/src/pages/_app.tsx",
    "content": "import '@theguild/components/style.css';\nimport { AppProps } from 'next/app';\nimport localFont from 'next/font/local';\n\nimport '../selection-styles.css';\n\nconst neueMontreal = localFont({\n  src: [\n    { path: '../fonts/PPNeueMontreal-Regular.woff2', weight: '400' },\n    { path: '../fonts/PPNeueMontreal-Medium.woff2', weight: '500' },\n  ],\n});\n\nexport default function App({ Component, pageProps }: AppProps) {\n  return (\n    <>\n      <style jsx global>{`\n        :root {\n          --font-sans: ${neueMontreal.style.fontFamily};\n        }\n      `}</style>\n      <Component {...pageProps} />\n    </>\n  );\n}\n"
  },
  {
    "path": "website/src/pages/_meta.ts",
    "content": "import { PRODUCTS_MENU_LIST } from '@theguild/components/products';\n\nexport default {\n  index: {\n    title: 'Home',\n    type: 'page',\n    display: 'hidden',\n    theme: {\n      layout: 'raw',\n    },\n  },\n  docs: {\n    title: 'Documentation',\n    type: 'page',\n  },\n  plugins: {\n    title: 'Plugins',\n    type: 'page',\n    theme: {\n      layout: 'raw',\n    },\n  },\n  products: {\n    title: 'Products',\n    type: 'menu',\n    items: PRODUCTS_MENU_LIST,\n  },\n  'the-guild': {\n    title: 'The Guild',\n    type: 'menu',\n    items: {\n      'about-us': {\n        title: 'About Us',\n        href: 'https://the-guild.dev/about-us',\n        newWindow: true,\n      },\n      'brand-assets': {\n        title: 'Brand Assets',\n        href: 'https://the-guild.dev/logos',\n        newWindow: true,\n      },\n    },\n  },\n  'graphql-foundation': {\n    title: 'GraphQL Foundation',\n    type: 'page',\n    href: 'https://graphql.org/community/foundation/',\n    newWindow: true,\n  },\n};\n"
  },
  {
    "path": "website/src/pages/docs/_meta.ts",
    "content": "export default {\n  'getting-started': 'Getting Started',\n  guides: 'Guides',\n  'config-reference': 'Config Reference',\n  advanced: 'Advanced Usage',\n  integrations: 'Integrations',\n  'custom-codegen': 'Writing Plugins',\n  migration: 'Migration Guides',\n};\n"
  },
  {
    "path": "website/src/pages/docs/advanced/_meta.ts",
    "content": "export default {\n  'generated-files-colocation': 'Generated files colocation',\n  'programmatic-usage': 'Programmatic Usage',\n  'how-does-it-work': 'How does it work?',\n  profiler: 'Profiler',\n  'document-transform': 'Document Transform',\n};\n"
  },
  {
    "path": "website/src/pages/docs/advanced/document-transform.mdx",
    "content": "---\ndescription: Document transform is a feature that allows you to modify documents before they are used by plugins.\n---\n\nimport { Callout } from '@theguild/components'\n\n# Document Transform\n\nDocument transform is a feature that allows you to modify `documents` before they are used by plugins.\nYou can use functions passed to the `documentTransforms` option to make changes to GraphQL `documents`.\n\n## Basic Usage\n\nDocument transform has `transform` function.\n\nLet's specify an object containing those functions as the `documentTransforms` option as follows:\n\n```ts {9-17}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'https://localhost:4000/graphql',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      documentTransforms: [\n        {\n          transform: ({ documents }) => {\n            // Make some changes to the documents\n            return documents\n          }\n        }\n      ]\n    }\n  }\n}\nexport default config\n```\n\nFor instance, to remove a `@localOnlyDirective` directive from `documents`, you can write the following code:\n\n```ts {2, 13-22}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\nimport { visit } from 'graphql'\n\nconst config: CodegenConfig = {\n  schema: 'https://localhost:4000/graphql',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      documentTransforms: [\n        {\n          transform: ({ documents }) => {\n            return documents.map(documentFile => {\n              documentFile.document = visit(documentFile.document, {\n                Directive: {\n                  leave(node) {\n                    if (node.name.value === 'localOnlyDirective') return null\n                  }\n                }\n              })\n              return documentFile\n            })\n          }\n        }\n      ]\n    }\n  }\n}\nexport default config\n```\n\n## How to specify by name\n\nThe document transform can also be specified by file name. You can create a custom file and pass it to `documentTransforms`.\n\nLet's create a file named `./my-document-transform.js`:\n\n```js\nmodule.exports = {\n  transform: ({ documents }) => {\n    // Make some changes to the documents\n    return documents\n  }\n}\n```\n\nThen, you can specify the file name as follows:\n\n```ts {9}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'https://localhost:4000/graphql',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      documentTransforms: ['./my-document-transform.js']\n    }\n  }\n}\nexport default config\n```\n\n## Configuration\n\nIf you want to change the behavior of a document transform at runtime, you can simply prepare a function that generates the document transform and write the configuration in its argument.\n\n```ts {3-10, 18}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst generateDocumentTransform: (config: { queryName: string }) => Types.DocumentTransformObject = ({ queryName }) => {\n  return {\n    transform: ({ documents }) => {\n      // Modify something in documents using `queryName`.\n      return documents\n    }\n  }\n}\n\nconst config: CodegenConfig = {\n  schema: 'https://localhost:4000/graphql',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      documentTransforms: [generateDocumentTransform({ queryName: 'test' })]\n    }\n  }\n}\nexport default config\n```\n\nIf you want to specify the document transform by file, do the following:\n\n```ts {11-13}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'https://localhost:4000/graphql',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      documentTransforms: [\n        {\n          './my-document-transform.js': {\n            queryName: 'test'\n          }\n        }\n      ]\n    }\n  }\n}\nexport default config\n```\n\nIn this case, you can retrieve the `queryName` from the `config` argument of the `transform` function as follows:\n\n```js\nmodule.exports = {\n  transform: ({ documents, config }) => {\n    // Modify something in documents using `config.queryName`.\n    return documents\n  }\n}\n```\n"
  },
  {
    "path": "website/src/pages/docs/advanced/generated-files-colocation.mdx",
    "content": "---\ndescription: Generate types near your GraphQL operations. Colocate your generated files with your original GraphQL operations.\n---\nimport { Callout } from '@theguild/components'\n\n# Generated files colocation\n\n<Callout>\n**Note for back-end use-cases**\n\nThis page covers the `@graphql-codegen/near-operation-file-preset` preset, which only applies to front-end projects.\n\nFor similar results on a back-end project, please refer to [`@graphql-codegen/graphql-modules-preset ` with the `useGraphQLModules: false{:ts}` flag](/plugins/graphql-modules-preset).\n\n</Callout>\n\nMost GraphQL Code Generator configuration examples (in guides or plugins documentation) generate types in a single common file, as follows:\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\n// Configuration for a React URQL setup\nconst config: CodegenConfig = {\n  schema: 'http://my-graphql-api.com/graphql',\n  documents: './src/**/*.tsx',\n  generates: {\n    'graphql/generated.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-urql'],\n      config: { withHooks: true },\n    },\n  },\n};\nexport default config;\n```\n\nAll code is generated in one single `graphql/generated.ts` file.\n\nHowever, you might prefer to have those types generated in files near the original GraphQL operations, as follows:\n\n```\nsrc/\n  components/\n    posts/\n      posts.generated.tsx\n      Posts.tsx\n  # …\n```\n\n`posts.generated.tsx` contains the generated code for the GraphQL query used in `Posts.tsx`.\n\nJust a few configuration steps are required to get this structure of colocated generated files:\n\n### Install\n\n```sh npm2yarn\nnpm i -D @graphql-codegen/near-operation-file-preset\n```\n\n### Configure the preset\n\nTo use this preset, you need to add 2 outputs to your `codegen.ts` file:\n\n- The first is the base types, generated by `typescript` plugin.\n- The second is the one in charge of generating types per operation.\n\n\n```ts filename=\"codegen.ts\"\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'http://my-graphql-api.com/graphql',\n  documents: 'src/**/!(*.generated).{ts,tsx}',\n  generates: {\n    'src/types.ts': {\n      plugins: ['typescript'],\n    },\n    'src/': {\n      preset: 'near-operation-file',\n      presetConfig: { extension: '.generated.tsx', baseTypesPath: 'types.ts' },\n      plugins: ['typescript-operations', 'typescript-urql'],\n      config: { withHooks: true },\n    },\n  },\n};\nexport default config;\n```\n\n<Callout>\n**`schema` and `documents` values**\n\n`schema` needs to be your target GraphQL API URL (`\"/graphql\"` included).\n\n`documents` is a glob expression to your `.graphql`, `.ts` or `.tsx` files.\n\n</Callout>\n\n<Callout>\nIf you're loading your `documents` from files with the same extension as the generated files, make sure the glob you use excludes the generated files. For example, if your original glob was `src/**/*.{ts,tsx}`, use `src/**/!(*.generated).{ts,tsx}` instead.\n</Callout>\n\n### Run the codegen and update your code\n\nAssuming that, as recommended, your `package.json` has the following script:\n\n```json filename=\"package.json\"\n{\n  \"scripts\": {\n    \"generate\": \"graphql-codegen\"\n  }\n}\n```\n\nRunning the following generates the colocated `.generated.tsx` file.\n\n```sh npm2yarn\nnpm run generate\n```\n\nFor more advanced configuration, please refer to the [`@graphql-codegen/near-operation-file-preset` documentation](/plugins/near-operation-file-preset).\n"
  },
  {
    "path": "website/src/pages/docs/advanced/how-does-it-work.mdx",
    "content": "---\ndescription: GraphQL Introspection allows fetching the types defined in the target GraphQL API. GraphQL AST allows to navigate through both client-side operations and remote schema types.\n---\n# How does GraphQL Code Generator Work?\n\nIn order to generate code and types, GraphQL Code Generator relies on 2 main core concepts of GraphQL:\n\n- **GraphQL Introspection** allows fetching the types defined in the target GraphQL API\n- **GraphQL AST** allows to navigate through both client-side operations and remote schema types\n\nOnce all GraphQL types (schema types and operations) are identified, GraphQL Code Generator relies on a set of plugins to generate specific code snippets and types.\n\nThis process, applied to the `@graphql-codegen/typescript` plugin, is illustrated below:\n\n![Codegen flow example](/assets/illustrations/codegen_flow1.png)\n\nimport { Callout } from '@theguild/components'\n\n<Callout>\n**Operations and fragments must have unique names**\n\nGraphQL Code Generator checks for this automatically and will let you know if you have any conflicts.\n</Callout>\n\n## Example with `@graphql-codegen/typescript`\n\nGiven the following GraphQL schema:\n\n```graphql filename=\"schema.graphql\"\nscalar Date\n\nschema {\n  query: Query\n}\n\ntype Query {\n  me: User!\n  user(id: ID!): User\n  allUsers: [User]\n  search(term: String!): [SearchResult!]!\n  myChats: [Chat!]!\n}\n\nenum Role {\n  USER\n  ADMIN\n}\n\ninterface Node {\n  id: ID!\n}\n\nunion SearchResult = User | Chat | ChatMessage\n\ntype User implements Node {\n  id: ID!\n  username: String!\n  email: String!\n  role: Role!\n}\n\ntype Chat implements Node {\n  id: ID!\n  users: [User!]!\n  messages: [ChatMessage!]!\n}\n\ntype ChatMessage implements Node {\n  id: ID!\n  content: String!\n  time: Date!\n  user: User!\n}\n```\n\nAnd the following operation (Query) on client-side:\n\n```graphql filename=\"operation.graphql\"\nquery findUser($userId: ID!) {\n  user(id: $userId) {\n    ...UserFields\n  }\n}\n\nfragment UserFields on User {\n  id\n  username\n  role\n}\n```\n\nAnd with the following `codegen.ts` configuration file:\n\n```ts filename=\"codegen.ts\"\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:3333',\n  generates: {\n    'types-and-hooks.tsx': { plugins: ['typescript', 'typescript-operations', 'typescript-react-query'] },\n  },\n};\nexport default config;\n```\n\n`@graphql-codegen/typescript` plugin can generate the following TypeScript typings and React hooks files based on defined operations:\n\n{/* ignore as it's generated code, prettier will remove semicolons */}\n{/* prettier-ignore */}\n```ts\n// …\n\n/** All built-in and custom scalars, mapped to their actual values */\nexport type Scalars = {\n  ID: { input: string; output: string; };\n  String: { input: string; output: string; };\n  Boolean: { input: boolean; output: boolean; };\n  Int: { input: number; output: number; };\n  Float: { input: number; output: number; };\n  Date: { input: any; output: any; };\n};\n\nexport type Query = {\n  __typename?: 'Query';\n  me: User;\n  user?: Maybe<User>;\n  allUsers?: Maybe<Array<Maybe<User>>>;\n  search: Array<SearchResult>;\n  myChats: Array<Chat>;\n};\n\n\nexport type QueryUserArgs = {\n  id: Scalars['ID']['input'];\n};\n\n\nexport type QuerySearchArgs = {\n  term: Scalars['String']['input'];\n};\n\nexport enum Role {\n  User = 'USER',\n  Admin = 'ADMIN'\n}\n\nexport type Node = {\n  id: Scalars['ID']['output'];\n};\n\nexport type SearchResult = User | Chat | ChatMessage;\n\nexport type User = Node & {\n  __typename?: 'User';\n  id: Scalars['ID']['output'];\n  username: Scalars['String']['output'];\n  email: Scalars['String']['output'];\n  role: Role;\n};\n\nexport type Chat = Node & {\n  __typename?: 'Chat';\n  id: Scalars['ID']['output'];\n  users: Array<User>;\n  messages: Array<ChatMessage>;\n};\n\nexport type ChatMessage = Node & {\n  __typename?: 'ChatMessage';\n  id: Scalars['ID']['output'];\n  content: Scalars['String']['output'];\n  time: Scalars['Date']['output'];\n  user: User;\n};\n\nexport type FindUserQueryVariables = Exact<{\n  userId: Scalars['ID']['input'];\n}>;\n\n\nexport type FindUserQuery = { __typename?: 'Query', user?: { __typename?: 'User', id: string, username: string, role: Role } | null | undefined };\n\nexport type UserFieldsFragment = { __typename?: 'User', id: string, username: string, role: Role };\n\nexport const UserFieldsFragmentDoc = `\n    fragment UserFields on User {\n  id\n  username\n  role\n}\n    `;\nexport const FindUserDocument = `\n    query findUser($userId: ID!) {\n  user(id: $userId) {\n    ...UserFields\n  }\n}\n    ${UserFieldsFragmentDoc}`;\nexport const useFindUserQuery = <\n      TData = FindUserQuery,\n      TError = unknown\n    >(\n      dataSource: { endpoint: string, fetchParams?: RequestInit },\n      variables: FindUserQueryVariables,\n      options?: UseQueryOptions<FindUserQuery, TError, TData>\n    ) =>\n    useQuery<FindUserQuery, TError, TData>(\n      ['findUser', variables],\n      fetcher<FindUserQuery, FindUserQueryVariables>(dataSource.endpoint, dataSource.fetchParams || {}, FindUserDocument, variables),\n      options\n    );\n```\n\nNow our React components can use the type-safe `useFindUserQuery()` hook to query the GraphQL API.\n"
  },
  {
    "path": "website/src/pages/docs/advanced/profiler.mdx",
    "content": "---\ndescription: GraphQL Code Generator CLI provides a flag that enables the profiler mode. This allows you to identify performance bottlenecks in your codegen configuration.\n---\n\n# GraphQL Code Generator Profiler\n\nGraphQL Code Generator CLI provides a flag that enables the profiler mode, as follows:\n\n```sh\nnpx graphql-code-generator --config graphql-codegen.ts --profile\n```\n\nGraphQL Code Generator operates as usual (generating your files) but also generates a `codegen-[timestamp].json` profile file.\n\nThis profile file can be loaded into the Chrome Dev Tools as follows:\n\n1. Open a new Chrome tab (or other browsers) and open the Chrome Dev Tools\n\n2. Click on the \"Performance\" tab\n\n3. Load the `codegen-[timestamp].json` file as follows:\n\n![Profiler](/assets/pages/docs/advanced/profiler/codegen-profile-1.png)\n\n4. You then have access to the graph view:\n\n![Profiler](/assets/pages/docs/advanced/profiler/codegen-profile-2.png)\n\nThe graph view shows the time spent on the main tasks of the codegen.\n\nInspecting it allows you to identify:\n\n- if your configuration could benefit from excluding some documents from loading\n- if you are facing a bug that [should be reported](https://github.com/dotansimha/graphql-code-generator/issues)\n"
  },
  {
    "path": "website/src/pages/docs/advanced/programmatic-usage.mdx",
    "content": "---\ndescription: GraphQL Code Generator also provides a complete programmatic API. The programmatic API can be used if you need to customize the execution flow or write a tool that uses the codegen.\n---\n\nimport { Callout } from '@theguild/components'\n\n# Programmatic Usage\n\nGraphQL Code Generator also provides a complete programmatic API.\n\nThe programmatic API can be used if you need to customize the execution flow or write a tool that uses the codegen.\n\n## Basic Programmatic Usage\n\nIn order to use the programmatic API, start by importing `codegen` from `@graphql-codegen/core`:\n\n```ts\nimport { codegen } from '@graphql-codegen/core'\n```\n\nThen, create a configuration object ([complete signature](https://github.com/dotansimha/graphql-code-generator/blob/master/packages/utils/plugins-helpers/src/types.ts#L6-L21)):\n\n```ts\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { buildSchema, printSchema, parse, GraphQLSchema } from 'graphql'\nimport * as typescriptPlugin from '@graphql-codegen/typescript'\n\nconst schema: GraphQLSchema = buildSchema(`type A { name: String }`)\nconst outputFile = 'relative/pathTo/filename.ts'\nconst config = {\n  documents: [],\n  config: {},\n  // used by a plugin internally, although the 'typescript' plugin currently\n  // returns the string output, rather than writing to a file\n  filename: outputFile,\n  schema: parse(printSchema(schema)),\n  plugins: [\n    // Each plugin should be an object\n    {\n      typescript: {} // Here you can pass configuration to the plugin\n    }\n  ],\n  pluginMap: {\n    typescript: typescriptPlugin\n  }\n}\n```\n\n<Callout>\n  The `schema` field be a valid `GraphQLSchema` object. If you need to load your GraphQL schema from an external source\n  (file, URL), you can use `loadSchema` from `@graphql-tools/load`.\n</Callout>\n\nNotice that a plugin name key in `pluginMap` and `plugins` must match to identify a plugin and its configuration.\n\n<Callout>You need to import the plugin in your favorite way; you can also use `await import` to lazy load it.</Callout>\n\nThen, provide the config object to `codegen`:\n\n```ts\nconst output = await codegen(config)\nawait fs.writeFile(path.join(__dirname, outputFile), output, 'utf8')\nconsole.log('Outputs generated!')\n```\n\n<Callout>\n  We are using this API in the live demo on the GraphQL Code Generator website. [The code is\n  here](https://github.com/dotansimha/graphql-code-generator/blob/master/website/src/components/live-demo/generate.ts).\n</Callout>\n\n<Callout>\n**Loading schema and documents**\n\nYou can use one of the tools from [`@graphql-tools`](https://github.com/ardatan/graphql-tools) for file loading, schema merging, transformations and more.\n\n</Callout>\n\n## Using the CLI instead of `core`\n\nIf you wish to have the benefits that `cli` package has (like loading schema and document files, parsing endpoints and more), you can use `require()` (or `import`) for `@graphql-codegen/cli` directly with Node.JS:\n\n```js\nimport { generate } from '@graphql-codegen/cli'\n\nasync function doSomething() {\n  const generatedFiles = await generate(\n    {\n      schema: 'http://127.0.0.1:3000/graphql',\n      documents: './src/**/*.graphql',\n      generates: {\n        [process.cwd() + '/models/types.d.ts']: {\n          plugins: ['typescript']\n        }\n      }\n    },\n    true\n  )\n}\n```\n\nThe return value should be of type `Promise<FileOutput[]>`.\n\n<Callout type=\"warning\">\n  This usage will not work in a browser environment because the `cli` package depends on Node.js internals and the file\n  system.\n</Callout>\n"
  },
  {
    "path": "website/src/pages/docs/config-reference/_meta.ts",
    "content": "export default {\n  'codegen-config': 'codegen.ts',\n  'schema-field': 'schema field',\n  'documents-field': 'documents field',\n  'config-field': 'plugin config',\n  'require-field': 'require field',\n  'naming-convention': 'Naming Convention',\n  'lifecycle-hooks': 'Lifecycle Hooks',\n  'multiproject-config': 'Multi Project',\n};\n"
  },
  {
    "path": "website/src/pages/docs/config-reference/codegen-config.mdx",
    "content": "---\ndescription: Learn how to configure GraphQL Code Generator to generate code from your GraphQL schema and documents.\n---\n\nimport { Callout } from '@theguild/components'\n\n# `codegen.ts` file\n\n[The plugins' page](/plugins) lists dozens of plugins with their set of options and specific outputs.\n\nGraphQL Code Generator relies on a configuration file named `codegen.ts` to manage all possible options, input, and output document types.\n\nThe CLI automatically detects the defined config file and generates code accordingly.\n\nIn addition, you can also define a path to your config file with the `--config` options, like so:\n\n```sh\nnpx graphql-code-generator --config ./path/to/codegen.ts\n```\n\n## Configuration file format\n\nHere's an example for a possible config file:\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:4000/graphql',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client'\n    }\n  }\n}\n\nexport default config\n```\n\n## Configuration options\n\nHere are the supported options that you can define in the config file (see [source code](https://github.com/dotansimha/graphql-code-generator/blob/master/packages/utils/plugins-helpers/src/types.ts#L388)):\n\n- [**`schema` (required)**](./schema-field#root-level) - A URL to your GraphQL endpoint, a local path to `.graphql` file, a glob pattern to your GraphQL schema files, or a JavaScript file that exports the schema to generate code from. This can also be an array that specifies multiple schemas to generate code from. You can read more about the supported formats [here](./schema-field#available-formats)\n\n- [**`documents`**](./documents-field#root-level) - Array of paths or glob patterns for files which export GraphQL documents using a `gql` tag or a plain string; for example: `./src/**/*.graphql`. You can also provide these options with a string instead of an array if you're dealing with a single document. You can read more about the supported formats [here](./documents-field#available-formats)\n\n- **`generates` (required)** - A map where the key represents an output path for the generated code, and the value represents a set of relevant options for that specific file. Below are the possible options that can be specified:\n\n  - **`generates.plugins` (required)** - A list of plugins to use when generating the file. Templates, considered as plugins, can be specified in this section. A complete list of supported plugins is available [here](/plugins). You can also point to a custom plugin in a local file (see [Custom Plugins](/docs/custom-codegen))\n\n  - **`generates.preset`** - A list of presets to use for the output. Presets are a way to dynamically create the list of output files based on the input schema. [`near-operation-file-preset`](/plugins/near-operation-file-preset) is a good example\n\n  - [**`generates.schema`**](./schema-field#output-file-level) - Same as root `schema`, but applies only for the specific output file\n\n  - [**`generates.documents`**](./documents-field#output-file-level) - Same as root `documents`, but applies only for the specific output file\n\n  - [**`generates.config`**](./config-field#output-level) - Same as root `config`, but applies only for the specific output file\n\n  - **`generates.overwrite`** - Same as root `overwrite`, but applies only for the specific output file\n\n- [**`require`**](./require-field) - A path to a file which defines custom Node.JS `require()` handlers for custom file extensions. This option is essential if the code generator has to go through files that require other files in an unsupported format ([more information](https://gist.github.com/jamestalmage/df922691475cff66c7e6)). Note that values specified in your `.yml` file get loaded after loading the `.yml` file\n\n- [**`config`**](./config-field#root-level) - Options we would like to provide to the specified plugins. The options may vary depending on what plugins you specified. Read the documentation of that specific plugin for more information. You can read more about passing configuration to plugins [here](./config-field)\n\n- **`overwrite`** - A flag to overwrite files if they already exist when generating code (`true` by default)\n\n- **`watch`** - A flag to trigger codegen when there are changes in the specified GraphQL schemas. You can either specify a boolean to turn it on/off or specify an array of glob patterns to add custom files to the watch. When in watch mode, partial success still writes to files.\n\n- **`silent`** - A flag to suppress printing errors when they occur\n\n- **`noSilentErrors`** - A flag to raise errors if any matched files are not valid GraphQL\n\n- **`debug`** - A flag to enable printing debug logs\n\n- **`verbose`** - A flag to enable tasks verbose mode\n\n- **`ignoreNoDocuments`** - A flag to not exit with non-zero exit code when there are no documents\n\n- **`importExtension`** - Append this extension to all imports.\n\n- **`errorsOnly`** - A flag to suppress printing anything except errors.\n\n- **`hooks`** - Specifies scripts to run when events are happening in the codegen's core. You can read more about lifecycle hooks [here](./lifecycle-hooks). You can specify this on your root configuration or on each output\n\n- **`pluginLoader`** - If you are using the programmatic API in a browser environment, you can override this configuration to load your plugins in a way different than `require`\n\n- **`pluckConfig`** - Allows you to override the configuration for `graphql-tag-pluck`. This tool extracts your GraphQL operations from your code files\n\n  - **`pluckConfig.modules`** - An array of `{ name: string, identifier: string }` uses to track down your `gql` usages and imports. Use this if your code files import `gql` from another library or have a custom `gql` tag. `identifier` is the named export, so don't provide it if the tag function is imported as default\n\n  - **`pluckConfig.gqlMagicComment`** - Configures the magic GraphQL comments to look for. The default is `/* GraphQL */`)\n\n  - **`pluckConfig.globalGqlIdentifierName`** - Overrides the name of the default GraphQL name identifier\n\n- **`skipDocumentsValidation`** - Allows to configure how to validate documents\n\n  - **`skipDocumentsValidation.skipValidationAgainstSchema`** - A flag to disable the validation against the schema\n\n  - **`skipDocumentsValidation.ignoreRules`** - An array of rule names to ignore during the validation. You can find a list of the available rules [here](https://github.com/graphql/graphql-js/tree/main/src/validation/rules)\n\n  - **`skipDocumentsValidation.skipDuplicateValidation`** - A flag to disable the validation for duplicate documents\n\n- **`allowPartialOutputs`** - Allows partial outputs to be written to files if one or more `generates` blocks have errors. Default is `false`.\n\n## Environment Variables\n\nYou can use environment variables in your `codegen.ts` file:\n\n```ts /process.env.SCHEMA_PATH/\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: process.env.SCHEMA_PATH,\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client'\n    }\n  }\n}\n\nexport default config\n```\n\n## CLI Flags\n\nThe Codegen also supports several CLI flags that allow you to override the default behavior specified in your `.yml` config file:\n\n- **`--config` (`-c`)** - Specifies the codegen config file to use.\n\n- **`--watch` (`-w`)** - Overrides the `watch` config to true. You can also specify a glob expression to create a custom watch list.\n\n- **`--silent` (`-s`)** - Overrides the `silent` config to true.\n\n- **`--verbose` (`-v`)** - Overrides the `verbose` config to true.\n\n- **`--debug` (`-d`)** - Overrides the `debug` config to true.\n\n- **`--errors-only` (`-e`)** - Overrides the `errorsOnly` config to true.\n\n- **`--require` (`-r`)** - Specifies `require.extensions` before loading the `.yml` file.\n\n- **`--overwrite` (`-o`)** - Overrides the `overwrite` config to true.\n\n- **`--profile`** - Use the profiler to measure performance. _(see \"Profiler\" in \"Advanced Usage\")_\n\n- **`--project` (`-p`)** - To generate only one project out of a [Multi Project](multiproject-config) config file.\n\n- **`--check`** - Enable dry-run mode (see below)\n\n## Dry-run mode\n\nCodegen can be run in dry-run mode to check if some new changes are detected:\n\n```bash\nyarn run codegen --check\n```\n\nWhen enabled, codegen will return the following exit code:\n\n- `0`: no changes were detected\n- `1`: some changes are missing in existing files\n\n<Callout type=\"warning\">\n\n**Using `--check` dry-run mode with prettyfied generated files**\n\nBecause the `--check` dry-run mode is comparing local files with\nin-memory generated content, projects that runs Prettier on files generated with codegen will always end-up returning\nall files as stale.\n\n</Callout>\n\n## Debug Mode\n\nTo enable debug mode, either set the `debug: true` configuration option or use the CLI `--debug` flag.\n\nFor more detailed output, you can also enable the `verbose: true` or `--verbose` CLI flag.\n\n> `DEBUG=1` and `VERBOSE=1` environment variables are deprecated but still supported until the next major.\n\n## Other ways to provide configuration\n\nGraphQL-Codegen uses [`cosmiconfig`](https://github.com/davidtheclark/cosmiconfig) library to manage configuration loading.\n\nThat means you can use `codegen.yml`, `codegen.json`, `codegen.js`, or `codegen.ts` as configuration files. You can also specify the entire configuration under a key called `\"codegen\"` in your `package.json`.\nFor more information, [please refer to `cosmiconfig` documentation](https://github.com/davidtheclark/cosmiconfig#cosmiconfig).\n\nFor TypeScript files, GraphQL-Codegen uses [`jiti` loader](https://github.com/unjs/jiti) to load the configuration. That means you can additionally use `.mts`, and `.cts` extensions.\n\nGraphQL-Codegen is also integrable with [GraphQL-Config](https://graphql-config.com), so you can specify `.graphqlrc` as your configuration file.\n"
  },
  {
    "path": "website/src/pages/docs/config-reference/config-field.mdx",
    "content": "---\ndescription: Learn how to configure GraphQL Code Generator to fit your needs. The `config` field is used to pass configuration to Plugins.\n---\n\nimport { Callout } from '@theguild/components'\n\n# `config` field\n\nThe `config` field is used to pass configuration to Plugins.\n\n`config` can be specified at many levels of the configuration:\n\n### Root Level\n\nIf you specify it in your root level, the options will be passed to every plugin for each output file:\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  config: { configKey: 'configValue' },\n  generates: { 'output.ts': ['plugin1', 'plugin2'] }\n}\nexport default config\n```\n\n### Output Level\n\nIf you specify it at the output file level, every plugin for specific output will get the config value:\n\n```ts {7-9}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  generates: {\n    'output.ts': {\n      config: {\n        configKey: 'configValue'\n      },\n      plugins: ['plugin1', 'plugin2']\n    }\n  }\n}\nexport default config\n```\n\n<Callout>Output level configuration overrides root-level configuration.</Callout>\n\n### Plugin Level\n\nIf you specify it at the plugin level, only that plugin will get the config value:\n\n```ts {8,11}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  generates: {\n    'output.ts': [\n      {\n        plugin1: { configKey: 'configValue' }\n      },\n      {\n        plugin2: { configKey: 'otherValue' }\n      }\n    ]\n  }\n}\nexport default config\n```\n\n<Callout>Plugin level configuration overrides output-level and root-level configuration.</Callout>\n"
  },
  {
    "path": "website/src/pages/docs/config-reference/documents-field.mdx",
    "content": "---\ndescription: Learn how to specify the documents field in your GraphQL Code Generator config file.\n---\n\nimport { Callout } from '@theguild/components'\n\n# `documents` field\n\nThe `documents` field should point to your GraphQL documents: `query`, `mutation`, `subscription`, and `fragment`.\n\n`documents` is only required if you use plugins that generate code for the client-side.\n\nYou can specify either a `string` pointing to your documents or `string[]` pointing to multiple documents.\n\n## How to use it?\n\n### Root-level\n\nYou can specify the `documents` field in your root level config:\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:3000/graphql',\n  documents: 'src/**/*.graphql',\n  generates: { './src/types.ts': { plugins: ['typescript', 'typescript-operations'] } }\n}\nexport default config\n```\n\n### Output-file level\n\nYou can also specify the `documents` field in your generated file level config:\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://server1.com/graphql',\n  generates: {\n    './src/types1.ts': {\n      documents: 'src/**/*.graphql',\n      plugins: ['typescript', 'typescript-operations']\n    }\n  }\n}\nexport default config\n```\n\n### Document Scanner\n\nGraphQL Code Generator has a built-in document scanner, which means you can specify a `.graphql` file or code files containing GraphQL documents (ex: `.tsx`).\n\nYou can tell it to find documents in TypeScript files:\n\n```ts /!(*.d).{ts,tsx}/\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://server1.com/graphql',\n  documents: 'src/**/!(*.d).{ts,tsx}'\n}\nexport default config\n```\n\n## Available Formats\n\nThe following can be specified as a single value or as an array with mixed values.\n\n- ### Local File\n\nYou can specify a `string` to point to a single file:\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  documents: 'my-query.graphql'\n  // ...\n}\nexport default config\n```\n\nOr `string[]` to point to multiple files:\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  documents: ['my-query.graphql', 'my-other-query.graphql']\n  // ...\n}\nexport default config\n```\n\n- ### Glob Expression\n\nYou can specify a Glob expression in order to load multiple files:\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  documents: './src/**/*.graphql'\n  // ...\n}\nexport default config\n```\n\nYou can also specify multiple Glob expressions as an array:\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  documents: ['./src/dir1/*.graphql', './src/dir2/*.graphql']\n  // ...\n}\nexport default config\n```\n\nYou can specify files to exclude by prefixing the Glob expression with `!`:\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  documents: ['./src/**/*.graphql', '!*.generated.graphql']\n  // ...\n}\nexport default config\n```\n\n<Callout>All provided glob expressions are evaluated together. The usage is similar to `.gitignore`.</Callout>\n\nAdditionally, you can use code files, and the codegen will try to extract the GraphQL documents from it:\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  documents: ['./src/*.jsx']\n  // ...\n}\nexport default config\n```\n\nThe codegen will try to load the file as an AST and look for exact GraphQL operations strings. Still, if it can't find those, it will try to `require` the file and look for operations in the default export.\n\nYou can disable the `require` if it causes errors for you (for example, because of different module system):\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  documents: {\n    './src/*.jsx': {\n      noRequire: true\n    }\n  }\n  // ...\n}\nexport default config\n```\n\n<Callout>\nYour operations should be declared as template strings with the `gql` tag or with a GraphQL comment (`` const myQuery = /* GraphQL */ `query { … }` ``). This can be configured with `pluckConfig` (see below).\n</Callout>\n\n- ### String\n\nYou can specify your GraphQL documents directly as an AST string in your config file. It's very useful for testing.\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  documents: ['query { f1 }', 'query { f2 }']\n  // ...\n}\nexport default config\n```\n\n## GraphQL Tag Pluck\n\nGraphQL Code Generator uses `graphql-tag-pluck` internally to extract GraphQL documents from your code file.\n\nIf you are pointing to a code file (such as `.js` or `.jsx`), GraphQL will try to look for usages of `gql` tag, or string literals that are using magic GraphQL comment (`/* GraphQL */`), for example:\n\n```jsx {5-11,14-20}\nimport React from 'react'\nimport { gql } from 'graphql-tag'\n\n// This will work\nconst MY_QUERY = gql`\n  query myQuery {\n    getSomething {\n      id\n    }\n  }\n`\n\n// This will also work\nconst MY_QUERY = /* GraphQL */ `\n  query myQuery {\n    getSomething {\n      id\n    }\n  }\n`\n\n// … some components code …\n```\n\nBy default, it has a predefined list of popular `gql` tags to look for, in order to make sure it's not trying to extract an invalid or unrelated string. [The default list could be found here](https://github.com/ardatan/graphql-tools/blob/master/packages/graphql-tag-pluck/src/visitor.ts#L12)\n\nYou can add custom tags if you need by using `pluckConfig` on the root level on your config file:\n\n```ts {6-13}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  documents: ['./src/*.jsx'],\n  pluckConfig: {\n    modules: [\n      {\n        name: 'my-custom-module'\n        identifier: 'gql'\n      }\n    ]\n  }\n  // ...\n}\nexport default config\n```\n\nYou can also customize globally used identifiers, like that:\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  documents: ['./src/*.jsx'],\n  pluckConfig: {\n    globalGqlIdentifierName: ['gql', 'graphql', 'myCustomGlobalGqlTag']\n  }\n  // ...\n}\nexport default config\n```\n\nAnd you can customize the magic GraphQL comment by doing:\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  documents: ['./src/*.jsx'],\n  pluckConfig: {\n    gqlMagicComment: 'customcomment'\n  }\n  // ...\n}\nexport default config\n```\n\n## Custom Document Loader\n\nSuppose your schema has a different or complicated way of loading. In that case, you can specify a custom loader with the `loader` field.\n\n```ts {6-8}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  documents: {\n    './src/*.jsx': {\n      loader: 'my-documents-loader.js'\n    }\n  }\n  // ...\n}\nexport default config\n```\n\nYour custom loader should export a default function that returns a `DocumentNode`. For example:\n\n```js\nconst { readFileSync } = require('node:fs')\nconst { parse } = require('graphql')\n\nmodule.exports = (docString, config) => {\n  return parse(readFileSync(docString, 'utf8'))\n}\n```\n\n<Callout>\n  The second parameter passed to the loader function is a config object that includes a `pluginContext` property.\n  `pluginContext` is passed to any executed plugins, so it can be modified by the loader to pass any additional\n  information to those plugins.\n</Callout>\n"
  },
  {
    "path": "website/src/pages/docs/config-reference/lifecycle-hooks.mdx",
    "content": "---\ndescription: Learn how to use the GraphQL Code Generator CLI to generate code from your GraphQL schema and operations.\n---\n\nimport { Callout } from '@theguild/components'\n\n# Lifecycle Hooks\n\nThe codegen allows specifying scripts it can run for you in certain events.\n\nYou can specify hooks on the root level or specify hooks on the output level (only some of them).\n\nEach hook has its arguments, and it passes them to your scripts using `argv`.\n\n## How to use?\n\nAdd your scripts to your `codegen.ts` file, and specify the scripts you wish to run, for example:\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:4000/graphql',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client'\n    }\n  },\n  hooks: {\n    afterOneFileWrite: ['prettier --write']\n  }\n}\n\nexport default config\n```\n\nOr, for specific output:\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:4000/graphql',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      hooks: {\n        afterOneFileWrite: ['prettier --write']\n      }\n    }\n  }\n}\n\nexport default config\n```\n\n## Root Level\n\nThe following lifecycle hooks are supported on the root level:\n\n### `afterStart`\n\nTriggered with no arguments when the codegen starts (after the `codegen.ts` has been loaded).\n\n### `onWatchTriggered`\n\nTriggered every time a file changes when using watch mode.\nTriggered with two arguments: the type of the event (for example, `changed`) and the file's path.\n\n### `onError`\n\nTriggered in case of a general error in the codegen. The argument is a string containing the error.\n\n### `beforeAllFileWrite`\n\nExecuted after the codegen has created the output and before writing the files to the file system.\n\nTriggered with multiple arguments - paths for all relevant files.\n\n<Callout>\n  Not all the files will be written to the file system, because this is triggered before checking if the file has\n  changed since last execution.\n</Callout>\n\n### `beforeOneFileWrite`\n\nTriggered before a file is written to the file system. Executed with the path for the file.\n\nIf the content of the file hasn't changed since the last execution - this hook won't be triggered.\n\n### `afterOneFileWrite`\n\nTriggered after a file is written to the file system. Executed with the path for the file.\nIf the content of the file hasn't changed since the last execution - this hook won't be triggered.\n\n<Callout>This is a very useful hook, you can use it for integration with Prettier or other linters.</Callout>\n\n### `afterAllFileWrite`\n\nExecuted after writing all the files to the file system.\nTriggered with multiple arguments - paths for all files.\n\n### `beforeDone`\n\nTriggered with no arguments, right before the codegen closes or when watch mode is stopped.\n\n## Output Level\n\nThe following hooks are available for a single output file: `beforeOneFileWrite` and `afterOneFileWrite`.\n\nOutput level hooks are triggered before root level hooks.\n"
  },
  {
    "path": "website/src/pages/docs/config-reference/multiproject-config.mdx",
    "content": "---\ndescription: Learn how to use GraphQL Code Generator with multiple projects in the same config file.\n---\n\n# Multi Project\n\nIn some cases, it's useful to have multiple projects in the same config file.\n\nFor example, in a monorepo, the VSCode GraphQL plugin will automatically pick up the right config for the right folder.\n\n## Configuration file format\n\nHere's an example for a possible config file:\n\n```js filename=\"graphql.config.js\"\n/** @type {import('graphql-config').IGraphQLConfig } */\nmodule.exports = {\n  projects: {\n    prj1: {\n      schema: ['prj1/**/*.graphql'],\n      documents: ['prj1/**/*.gql'],\n      extensions: {\n        codegen: {\n          generates: {\n            'graphqlTypes.ts': {\n              plugins: ['typescript', 'typed-document-node']\n            }\n          }\n        }\n      }\n    },\n    prj2: {\n      schema: ['prj2/**/*.graphql'],\n      documents: ['prj2/**/*.gql'],\n      extensions: {\n        codegen: {\n          generates: {\n            'graphqlTypes.ts': {\n              plugins: ['typescript', 'typed-document-node']\n            }\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n## Command to generate files\n\nWith the previous config, you can generate files with the following command:\n\n```sh\ngraphql-codegen --config graphql.config.js --project prj1\n```\n"
  },
  {
    "path": "website/src/pages/docs/config-reference/naming-convention.mdx",
    "content": "---\ndescription: 'GraphQL Code Generator is a tool for generating code from GraphQL schema and operations.'\n---\n\n# Naming Convention\n\nGraphQL Code Generation provides a `namingConvention` option to control the naming convention of the different code elements generated (types, enum values, …).\n\n### `namingConvention`\n\ntype: `NamingConvention`\ndefault: `change-case-all#pascalCase`\n\nAllow you to override the naming convention of the output.\n\nYou can either override all namings or specify an object with a specific custom naming convention per output.\nThe converter format must be a valid `module#method`.\n\nAllowed values for specific output are: `typeNames`, `enumValues`.\nYou can also use \"keep\" to keep all GraphQL names as-is.\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior to preserve underscores.\n\n#### Usage Examples\n\n##### Override All Names\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  config: { namingConvention: 'change-case-all#lowerCase' }\n  // ...\n}\nexport default config\n```\n\n##### Upper-case enum values\n\n```ts {6-9}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  config: {\n    namingConvention: {\n      typeNames: 'change-case-all#pascalCase',\n      enumValues: 'change-case-all#upperCase'\n    }\n  }\n  // ...\n}\nexport default config\n```\n\n##### Keep names as is\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  config: { namingConvention: 'keep' }\n  // ...\n}\nexport default config\n```\n\n##### Remove Underscores\n\n```ts {6-9}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  config: {\n    namingConvention: {\n      typeNames: 'change-case-all#pascalCase',\n      transformUnderscore: true\n    }\n  }\n  // ...\n}\nexport default config\n```\n\n#### Using external modules\n\nAll the examples you saw so far were using `change-case-all` package.\n\nThe `change-case-all` package being a direct dependency of graphql-codegen, you can use it directly.\n\nHowever, you can use any other package as long as it is installed as a dependency.\nThe same syntax needs to be used:\n\n```\npackage-name#export-you-want-to-use\n```\n\nFor example, if you want to use `camelCase` from lodash, given that you have it already installed, you will do it like this:\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  config: { namingConvention: 'lodash#camelCase' }\n  // ...\n}\nexport default config\n```\n\n#### Providing your own naming function\n\nAs you may have guessed already, there is nothing fancy about naming functions.\nThey are just functions that take a string as input and produce it as output.\n\nIf you stick to that signature, you can provide your own naming function.\nYou need to provide a CJS module with a default export of a function that takes a string and returns a string.\n\nThe following example provides a workaround to a limitation of `change-case-all`:\n\n```js filename=\"my-naming-fn.js\"\n// Fix for https://github.com/dotansimha/graphql-code-generator/issues/6040\nconst { constantCase } = require('change-case-all')\n/**\n * This function wraps constant case, that turns any string into CONSTANT_CASE\n * However, this function has a bug that, if you pass _ to it it will return an empty\n * string. This small module fixes that\n *\n * @param {string*} str\n * @return {string}\n */\nfunction FixedConstantCase(str) {\n  const result = constantCase(str)\n  // If result is an empty string, just return the original string\n  return result || str\n}\nmodule.exports = FixedConstantCase\n```\n\nThen, just provide the path to your custom naming module in the configuration:\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  config: { namingConvention: './my-naming-fn' }\n  // ...\n}\nexport default config\n```\n\nThis also applies when you want a specific custom naming convention per output.\nSpecify your custom naming function on the output or outputs you want to apply:\n\n```ts {6-8}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  config: {\n    namingConvention: {\n      typeNames: './my-naming-fn'\n    }\n  }\n  // ...\n}\nexport default config\n```\n"
  },
  {
    "path": "website/src/pages/docs/config-reference/require-field.mdx",
    "content": "---\ndescription: Learn how to use the require field to load external files without transpiling them.\n---\n\nimport { Callout } from '@theguild/components'\n\n# `require` field\n\nThe `require` field allows you to load any external files without the need to transpile them before.\n\n## How to use it?\n\nTo use it, install the extensions you wish to use from npm and then specify a list of `require` extensions in your root config:\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  require: ['extension1', 'extension2']\n  // ...\n}\nexport default config\n```\n\nAdding `require` extension is useful if you are loading your `GraphQLSchema` or GraphQL documents from a [code file](./schema-field#javascript-export), if you wish to use [custom plugins](/docs/custom-codegen/write-your-plugin), or use a [custom schema loader](./schema-field#custom-schema-loader) or a [custom document loader](./documents-field#custom-document-loader).\n\n## TypeScript Support\n\nIf you wish to use TypeScript, just add [`ts-node`](https://github.com/TypeStrong/ts-node) from npm and specify its register export in your config file:\n\n```ts {5}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  require: ['ts-node/register']\n  // ...\n}\nexport default config\n```\n\n## Specifying from the command line\n\nYou can also specify `require.extensions` as a CLI flag using `-r`.\n\nSpecifying the `-r` CLI flag will load your `require.extension` _before_ loading the `.yml` file.\n\nThis way, you can load environment variables using `dotenv` and use those environment variables in your `.yml` config file.\n\n### `dotenv` Integration\n\nIf you wish to use [dotenv](https://github.com/motdotla/dotenv) to load environment variables, you can install `dotenv` from npm and then use the `require` CLI flag: `-r dotenv/config`.\n\nIt will make sure to load your `.env` file before executing the codegen and loading your `.yml` file, so environment variables used in your config file will be replaced with the correct value.\n\nTo get started with this integration, make sure you have `.env` file with variables, `dotenv` installed, and codegen is being executed like that:\n\n```sh\ngraphql-codegen --require dotenv/config --config codegen.ts\n```\n\n#### Customize loaded env file\n\nIf you wish to load a file different than `.env` file, please follow [`dotenv` library documentation](https://github.com/motdotla/dotenv#dotenv).\n\nIt allows you to specify a custom file path using 2 methods.\n\nYou can either set an environment variable called `DOTENV_CONFIG_PATH` with the path:\n\n```sh\nDOTENV_CONFIG_PATH=\"./my.env\" graphql-codegen --require dotenv/config --config codegen.ts\n```\n\n<Callout>You can use `cross-env` library if you are using Windows.</Callout>\n\nOr, you can specify it using codegen CLI, like that:\n\n```sh\ngraphql-codegen --require dotenv/config --config codegen.ts dotenv_config_path=my.env\n```\n\n#### `dotenv` Example\n\n```text filename=\".env\"\nSCHEMAURL=https://example.com/graphql\nAPIKEY=ABC123\n```\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: {\n    [process.env.SCHEMAURL]: {\n      headers: {\n        apikey: process.env.APIKEY\n      }\n    }\n  }\n  // ...\n}\n\nexport default config\n```\n\n<Callout>\n  The env values might be saved in the generated code output. Be careful not to commit code with sensitive keys.\n</Callout>\n"
  },
  {
    "path": "website/src/pages/docs/config-reference/schema-field.mdx",
    "content": "---\ndescription: How to specify your GraphQL Schema in GraphQL Code Generator. Learn how to load your schema from a remote server, local file, or multiple files.\n---\n\nimport { Callout } from '@theguild/components'\n\n# `schema` field\n\nThe `schema` field should point to your `GraphQLSchema` - there are multiple ways you can specify it and load your `GraphQLSchema`.\n\n`schema` can either be a `string` pointing to your schema or a `string[]` pointing to multiple schemas that will be merged.\n\n## How to use it?\n\n### Root-level\n\nYou can specify the `schema` field in your root level config, as follows:\n\n```ts {4}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:3000/graphql',\n  generates: {\n    './src/types.ts': {\n      plugins: ['typescript']\n    }\n  }\n};\nexport default config;\n\n```\n\n### Output-file level\n\nOr, you can specify it per-output file level. This way you can\n\n```ts {6,10}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  generates: {\n    './src/types1.ts': {\n      schema: 'http://server1.com/graphql',\n      plugins: ['typescript']\n    },\n    './src/types2.ts': {\n      schema: 'http://server2.com/graphql',\n      plugins: ['typescript']\n    }\n  },\n};\nexport default config;\n\n```\n\n### Multiple schemas and client-side schema\n\nYou can also specify `schema` on both levels: root and output-file, and then GraphQL Code Generator will merge both schemas into one:\n\n```ts {4,7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:3000/graphql',\n  generates: {\n    './src/types.ts': {\n      schema: './schema.graphql',\n      plugins: ['typescript', 'typescript-operations']\n    }\n  }\n};\nexport default config;\n\n```\n\n<Callout>\n  It's also helpful if you have a remote schema from a server and a client-side schema available in your client-side.\n</Callout>\n\n## Available formats\n\nThe following can be specified as a single value or an array with mixed values.\n\n### URL\n\nYou can specify a URL to load your `GraphQLSchema` from:\n\n```ts {4}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:3000/graphql',\n  // ...\n};\nexport default config;\n```\n\n#### Supported Configuration\n\n##### `headers`\n\nYou can also specify custom HTTP headers to be sent with the request:\n\n```ts {7-9}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      'http://localhost:3000/graphql': {\n        headers: {\n          Authorization: 'YOUR-TOKEN-HERE',\n        },\n      },\n    },\n  ],\n};\nexport default config;\n\n```\n\n##### `customFetch`\n\nYou can specify a custom fetch function for the HTTP request, using the module name you wish to use:\n\n\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      'http://localhost:3000/graphql': {\n        customFetch: 'my-custom-fetch',\n      }\n    }\n  ]\n};\nexport default config;\n```\n\nAlternatively, you can specify a custom fetch function directly:\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\nimport { myCustomFetch } from './my-custom-fetch.ts'\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      'http://localhost:3000/graphql': {\n        customFetch: myCustomFetch,\n      }\n    }\n  ]\n};\nexport default config;\n```\n\n##### `method`\n\nYou can specify an HTTP method for the introspection query (the default value is `POST`).\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      'http://localhost:3000/graphql': {\n        method: 'GET',\n      }\n    }\n  ]\n};\nexport default config;\n\n```\n\n##### `handleAsSDL`\n\nHandling the response as SDL will allow you to load schema from remote server that doesn't return a JSON introspection. Example use case is when using schema registry like [GraphQL Hive](https://docs.graphql-hive.com/features/high-availability-cdn#graphql-schema-sdl).\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      'http://localhost:3000/sdl': {\n        handleAsSDL: true,\n      }\n    }\n  ]\n};\nexport default config;\n\n```\n\n### JSON\n\nYou can point to a local `.json` file that contains [GraphQL Introspection](https://graphql.org/learn/introspection) JSON.\n\n\n```ts {4}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'schema.json',\n  // ...\n};\nexport default config;\n```\n\n\n### Local `.graphql` files\n\nYou can point to a single `.graphql` file that contains the AST string of your schema:\n\n```ts {4}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  // ...\n};\nexport default config;\n```\n\nOr, you can point to multiple files using a glob expression (codegen will merge the schema files for you):\n\n\n\n```ts {4}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'src/**/*.graphql',\n  // ...\n};\nexport default config;\n```\n\nYou can also specify multiple patterns:\n\n\n```ts {4}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: ['src/dir1/**/*.graphql', 'src/dir2/**/*.graphql'],\n  // ...\n};\nexport default config;\n```\n\n\nAnd, you can specify files to exclude/ignore, using the `!` sign:\n\n```ts {4}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: ['src/**/*.graphql', '!*.generated.graphql'],\n  // ...\n};\nexport default config;\n```\n\n<Callout>All provided glob expressions are evaluated together. The usage is similar to `.gitignore`.</Callout>\n\n#### Supported Configuration\n\n##### `skipGraphQLImport`\n\nBy default, codegen skips `graphql-import` to load all files using glob expressions.\n\nIf you are using `graphql-import` syntax in your schema definitions, you can tell codegen to use those import statements:\n\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      './src/**/*.ts': {\n        skipGraphQLImport: true\n      },\n    },\n  ],\n};\nexport default config;\n```\n\n\n##### `commentDescriptions`\n\nWhen enabled, converts all deprecated forms of GraphQL comments (marked with `#`) into a GraphQL description (marked with `\"`) during the parsing phase.\n\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      './src/**/*.ts': {\n        commentDescriptions: true\n      },\n    },\n  ],\n};\nexport default config;\n```\n\n\n\n##### `assumeValidSDL`\n\nSet to true to assume the SDL is valid, and skip any SDL syntax validations.\n\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      './src/**/*.ts': {\n        assumeValidSDL: true\n      },\n    },\n  ],\n};\nexport default config;\n```\n\n### Code Files\n\nYou can use code files, and the codegen will try to extract the GraphQL schema from it, based on `gql` tag:\n\n```ts {4}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: './src/**/*.ts'\n};\nexport default config;\n```\n\nThe codegen will try to load the file as an AST and look for exact GraphQL strings, but if it can't find those, it will try to `require` the file and looks for operations in the default export.\n\n#### Supported Configuration\n\n##### `noRequire`\n\nYou can disable the `require` if it causes errors for you (for example, because of a different module system or missing dependency):\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      './src/**/*.ts': {\n        noRequire: true,\n      },\n    },\n  ],\n};\nexport default config;\n```\n\n##### `noPluck`\n\nYou can disable the AST lookup phase and tell codegen to skip and directly try to `require` each file:\n\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      './src/**/*.ts': {\n        noPluck: true,\n      },\n    },\n  ],\n};\nexport default config;\n```\n\n##### `assumeValid`\n\nSet this to `true` to tell codegen to skip AST validation.\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      './src/**/*.ts': {\n        assumeValid: true,\n      },\n    },\n  ],\n};\nexport default config;\n```\n\n### JavaScript export\n\nYou can also specify a code file that exports your `GraphQLSchema` object as export `schema` or as default export.\n\n\n\n```ts {4}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'schema.js'\n};\nexport default config;\n```\n```js\nconst { buildSchema } = require('graphql')\n\nmodule.exports = buildSchema(/* GraphQL */ `\n  type MyType {\n    foo: String!\n  }\n\n  type Query {\n    myType: MyType!\n  }\n`)\n```\n\n<Callout>\n  You can also import from TypeScript files, but don't forget to specify [require field](./require-field).\n</Callout>\n\n### String\n\nYou can specify your schema directly as an AST string in your config file. It's handy for testing.\n\n\n```ts {4}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'type MyType { foo: String } type Query { myType: MyType }'\n};\nexport default config;\n```\n\n\n### GitHub\n\nYou can load your schema file from a remote GitHub file using one of the following approaches:\n\n#### Provide GitHub token in Codegen Config\n\nProvide the GitHub path to your schema and token using the following syntax:\n\n```ts {4,5,6,7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: {\n    'github:user/repo#branchName:path/to/file.graphql':\n      { token: \"<YOUR GITHUB TOKEN>\" }\n  }\n};\nexport default config;\n```\n\nThen, run codegen:\n\n```bash\nyarn graphql-codegen\n```\n\n#### Provide GitHub token via Codegen CLI\n\nAlternatively, you can provide just the GitHub path to your schema:\n\n```ts {4}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'github:user/repo#branchName:path/to/file.graphql'\n};\nexport default config;\n```\n\nThen, provide your GitHub token using the `GITHU_TOKEN` environment variable when running codegen:\n\n```bash\nGITHUB_TOKEN=<YOUR GITHUB TOKEN> yarn graphql-codegen\n```\n\n<Callout>You can load from a JSON file, `.graphql` file, or from a code file containing `gql` tag syntax.</Callout>\n\n### Git\n\nYou can load your schema file from a Git repository using the following syntax:\n\n```ts {4}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'git:branch:path/to/file.graphql'\n};\nexport default config;\n```\n\n<Callout>You can load from a JSON file, `.graphql` file, or from a code file containing `gql` tag syntax.</Callout>\n\n### Apollo Engine\n\nYou can load your schema from Apollo Engine with the following syntax:\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      'apollo-engine': {\n        engine: {\n          apiKey: 'APOLLO_ENGINE_KEY_ID',\n        },\n        graph: 'GRAPH_ID',\n        variant: 'current',\n      }\n    }\n  ]\n};\nexport default config;\n\n```\n\n## Custom Schema Loader\n\nIf your schema has a different or complicated way of loading, you can point to a single code file that works for you.\n\n```ts {7,12}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      'http://localhost:3000/graphql': {\n        loader: './my-url-loader.js',\n      }\n    },\n    {\n      'schema.graphql': {\n        loader: './my-file-loader.js',\n      }\n    }\n  ],\n};\nexport default config;\n\n```\n\nYour custom loader should export a default function that returns `GraphQLSchema` object, or an identifier called `schema`. For example:\n\n```js\nconst { readFileSync } = require('node:fs')\nconst { buildSchema } = require('graphql')\n\nmodule.exports = (schemaString, config) => {\n  // Your logic for loading your GraphQLSchema\n  return buildSchema(readFileSync(schemaString, 'utf8'))\n}\n```\n\n<Callout>\n  The second parameter passed to the loader function is a config object that includes a `pluginContext` property. This\n  value is passed to any executed plugins, so the loader can modify them to pass any additional information to those\n  plugins.\n</Callout>\n\n### Loading API URL from TypeScript file example:\n\nIf you store your API config in a file, and don't want to repeat the URL in the codegen config. You can follow the following example:\n\n```ts\nexport const API_URL = 'https://example.com/graphql'\nexport const PUBLIC_TOKEN = '12345'\n```\n\nCreate custom loader file:\n\n```ts\nimport fetch from 'cross-fetch'\nimport { getIntrospectionQuery, buildClientSchema } from 'graphql'\nimport { API_URL, PUBLIC_TOKEN } from './config'\n\nexport default async () => {\n  const introspectionQuery = getIntrospectionQuery()\n\n  const response = await fetch(API_URL, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      'Access-Token': PUBLIC_TOKEN\n    },\n    body: JSON.stringify({ query: introspectionQuery })\n  })\n\n  const data = await response.json()\n\n  return buildClientSchema(data.data)\n}\n```\n\nAdd custom loader to your codegen config:\n\n```ts {7}\nimport { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: [\n    {\n      'my-api': {\n        loader: './codegen-loader.ts'\n      }\n    }\n  ]\n};\nexport default config;\n\n```\n\nFinally, make sure that you have installed `ts-node`, so TypeScript file can be transpiled before running codegen.\n\nIn your `package.json` script, add `-r ts-node/register` argument to use `ts-node` transpiler.\n\n```json filename=\"package.json\" /-r ts-node\\/register/\n{\n  \"scripts\": {\n    \"codegen\": \"graphql-codegen -r ts-node/register --config codegen.json\"\n  }\n}\n```\n"
  },
  {
    "path": "website/src/pages/docs/custom-codegen/_meta.ts",
    "content": "export default {\n  index: 'What are Plugins?',\n  'plugin-structure': 'Plugin structure',\n  'validate-configuration': 'Validate Configuration',\n  'extend-schema': 'Extend Schema',\n  'using-visitor': 'Using Visitor Pattern',\n  contributing: 'Contributing',\n};\n"
  },
  {
    "path": "website/src/pages/docs/custom-codegen/contributing.mdx",
    "content": "---\ndescription: Create a new GraphQL Code Generator plugin for your favorite language or platform.\n---\n\nimport { Callout } from '@theguild/components'\n\n# Contributing\n\nWhen your new plugin is ready, you can either:\n\n- maintain it in your repo and npm package\n- contribute and make it part of the GraphQL Code Generator community repo ([`dotansimha/graphql-code-generator-community`](https://github.com/dotansimha/graphql-code-generator-community))\n\nThe GraphQL Code Generator community repository contains plugins for all languages and platforms.\nIf your plugin could be helpful for others, please consider creating a PR and maintaining it in our repo.\nDoing so will also promise to run your tests against the latest core changes and make sure that no breaking changes affect your plugin.\n\n## 1. Requirements\n\nTo be able to clone, build and develop codegen, you'll need to have the following installed:\n\n- [GitHub Account](https://github.com)\n- [Git](https://git-scm.com/downloads)\n- [Node.js](https://nodejs.org/en) (v16+)\n- [Yarn](https://yarnpkg.com) (v1)\n- Any code editor (we recommend [VSCode](https://code.visualstudio.com))\n\nGraphQL Code Generator uses the following stack to manage the source code:\n\n1. [TypeScript](https://typescriptlang.org) - for writing the code\n2. [Bob](https://github.com/kamilkisiela/bob) - for building, bundling, and development workflow\n3. [Vitest](https://vitest.dev/) - for running tests\n\n## 2. Fork and Clone\n\nStart by [creating a Fork of the `dotansimha/graphql-code-generator-community` repository](https://help.github.com/en/github/getting-started-with-github/fork-a-repo); this will allow you to make changes and push them quickly later: [`dotansimha/graphql-code-generator-community`](https://github.com/dotansimha/graphql-code-generator-community).\n\nThen, use Git [to clone](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository-from-github) your newly created fork repository.\n\nIt's also recommended to create a new Git branch at this point, from `main` branch.\n\n## 3. Install Dependencies\n\nGraphQL Code Generator is built as a monorepo, using [Yarn Workspaces](https://classic.yarnpkg.com/en/docs/workspaces) it means that all scripts and dependencies are located in the root `package.json` of the project.\n\nNow that you have a local copy of the project, start by installing the dependencies for all packages in the repo, by running the following in the root directory of the project:\n\n```sh\nyarn\n```\n\n<Callout>\n  If you make changes, add libraries, or new packages, make sure to install the dependencies again, but always from the\n  root directory, otherwise you'll break the monorepo structure.\n</Callout>\n\n## 4. Make sure everything works\n\nTo test the initial scripts and verify that you have a valid development environment, start by running the following scripts from the root directory:\n\n```sh\nyarn build\nyarn test\n```\n\nThe command above will make sure to build all common/core packages, and will make sure that all tests are passing.\n\n## 5. Add your plugin\n\nTo add your plugin, start by creating a directory for it. All existing plugins are located under `packages/plugins/` directory, so add it there.\n\nNow, create a simple `package.json` (or, you can [copy from other plugins](https://github.com/dotansimha/graphql-code-generator-community/blob/main/packages/plugins/typescript/react-apollo/package.json)…)\n\nMake sure to follow the following instructions:\n\n1. Make sure the package name starts with `@graphql-codegen/` prefix.\n\n```json filename=\"package.json\"\n{\n  \"name\": \"@graphql-codegen/MY_PLUGIN_NAME\"\n}\n```\n\n2. Make sure that the version is aligned with all other existing packages.\n\n```json filename=\"package.json\"\n{\n  \"version\": \"X.Y.Z\"\n}\n```\n\n<Callout>\n  The current version of the codegen is: ![Codegen\n  version](https://img.shields.io/npm/v/@graphql-codegen/cli?color=%23e15799)\n</Callout>\n\n3. Make sure that you have the following `scripts` configured;\n\n```json filename=\"package.json\"\n{\n  \"scripts\": {\n    \"lint\": \"eslint **/*.ts\",\n    \"test\": \"vitest --no-watch\"\n  }\n}\n```\n\n<Callout>This will make sure that your plugin is compatible with our build and test system.</Callout>\n\n4. Make sure your basic plugin dependencies are configured this way:\n\n```json filename=\"package.json\"\n{\n  \"dependencies\": {\n    \"@graphql-codegen/plugin-helpers\": \"X.Y.Z\",\n    \"tslib\": \"~1.11.1\"\n  },\n  \"peerDependencies\": {\n    \"graphql\": \"^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0\"\n  }\n}\n```\n\n<Callout>\n`graphql` must be a `devDependency` in order to allow developers to choose their own version.\n\n`tslib` is required to compile plugins.\n\n`@graphql-codegen/plugin-helpers` contains helpful types and utils. Make sure it has the same version as your package.\n\n</Callout>\n\nNow that your plugin is configured, you need to make sure Yarn knows about it and links it to the monorepo, so rerun the following command, in the root directory:\n\n```sh\nyarn\n```\n\n## 6. Create your plugin\n\nTo create your new plugin, create `src/index.ts` in your plugin directory, and start with the following:\n\n```ts\nimport { PluginFunction, Types } from '@graphql-codegen/plugin-helpers'\n\nexport type MyPluginConfig = {\n  name: string\n}\n\nexport const plugin: PluginFunction<Partial<MyPluginConfig>, MyPluginConfig> = (\n  schema: GraphQLSchema,\n  documents: Types.DocumentFile[],\n  config: TypeScriptDocumentsPluginConfig\n) => {\n  return `Hello ${config.name || 'anonymous'}!`\n}\n```\n\n<Callout>\n`schema` is the merged `GraphQLSchema` object, from all sources. this will always be available for plugin.\n\n`documents` is an array of GraphQL operations (`query`/`mutation`/`subscription`/`fragment`). This is optional, and you can use it only if your plugin needs it.\n\n`config` is the merged configuration passed in the `.yaml` configuration file of the codegen.\n\n</Callout>\n\nYou can follow the plugin tips in [Write Your Plugin](./write-your-plugin), [Validate Configuration](./validate-configuration) and [Using Visitor](./using-visitor) sections.\n\n## 7. Test your plugin\n\nTo test your plugin, create a test file `tests/plugin.spec.ts` with the following content:\n\n```ts filename=\"plugin.spec.ts\"\nimport { plugin } from '../src'\n\ndescribe('My Plugin', () => {\n  const schema = buildSchema(/* GraphQL */ `\n    type Query {\n      foo: String!\n    }\n  `)\n\n  it('Should greet', async () => {\n    const result = await plugin(schema, [], {\n      name: 'Dotan'\n    })\n\n    expect(result).toBe('Hello Dotan!')\n  })\n})\n```\n\nNow, to make sure it works, run the following in your plugin directory:\n\n```sh\nyarn test\n```\n\n## 8. Integration\n\nYou can also test the integration of your plugin with the codegen core and cli, the integration with other plugins and the output for some complex schemas and operations.\n\nTo do that, make sure everything is built by using `yarn build` in the root directory, then you can use it in `./dev-test/codegen.ts`, and run `yarn generate:examples` in the project root directory to run it.\n\nIf you would like to test \"watch mode\" in the same way, you can run `yarn watch:examples`.\n\n## 9. Documentation\n\nGraphQL Code Generator website has API Reference for all our plugins. Most of the documentation is generated from code, and some of it is written manually.\n\nIn order to add it to the website, do the following:\n\n1. Add JSDoc annotations to your config object; it can also include a default value, examples, and type:\n\n````ts filename=\"packages/plugins/my-plugin/config.ts\"\n/**\n * My plugin is super cool!!!\n */\nexport type MyPluginConfig = {\n  /**\n   * @name name\n   * @description This allows you to generate a greeting with a custom name\n   * @default anonymous\n   *\n   * @exampleMarkdown\n   * ## Change the name\n   * ```yaml\n   * generates:\n   *   path/to/file.ts:\n   *     plugins:\n   *       - my-plugin\n   *     config:\n   *       name: Uri\n   * ```\n   */\n  name: string\n}\n````\n\n2. Open `website/src/lib/plugins-docs.ts` and add a record to the `pluginsConfigurations` variable in that file, and point the file with the configuration annotation:\n\n```ts\nexport const pluginsConfigurations: PluginConfig[] = [\n  {\n    file: '../packages/plugins/my-plugin/config.ts', // file where the config interface/type is located\n    identifier: 'MyPluginConfig', // name of the config interface/type\n    name: 'my-plugin' // name of your plugin package\n  }\n  // …\n]\n```\n\n<Callout>\n  Adding your plugin here will automatically include it in the generated `config.schema.json` that provides VSCode\n  auto-complete (try running `yarn generate-json-config` to see it in action) and will generate markdown documentation\n  automatically based on your TypeScript types.\n</Callout>\n\n## 10. Feature your plugin on the Plugins Hub\n\nTo add your plugin to the [Plugins hub](/plugins), please follow those steps:\n\n<Callout type=\"info\">\n  Each plugin belongs to a category (ex: `@graphql-codegen/typescript-react-apollo` belongs to the `typescript` category).\n\nPlease find the proper category for your plugin (usually based on the target language: TypeScript, Flow, Java, etc).\n\n</Callout>\n\n1. Create a `.mdx` to the proper folder of `website/src/pages/plugins/`, under the proper category.\n\n   For example, the `@graphql-codegen/typescript-react-apollo` plugin has a page at `website/src/pages/plugins/typescript/typescript-react-apollo.mdx`.\n\n2. Add your plugin's package as a dependency of the `website/package.json` and run `yarn install` at the root of the repository.\n\n3. Update the `website/src/lib/plugins-docs.ts` file by adding your plugin to the `pluginsConfigurations` array.\n\nYou must provide the relative link to your plugin typing definition. You will find examples with the existing plugins.\n\n4. Each plugin belongs to a category (ex: `@graphql-codegen/typescript-react-apollo` belongs to the `typescript` category). Make sure that your plugin is assigned to the proper category by updating the `website/src/category-to-packages.mjs` file:\n\nGo ahead to `website` directory and run the website using `yarn dev`.\n\nYour plugin page should be available in `http://localhost:3000/plugins/<category>/<plugin-name>`.\n\nExample for `@graphql-codegen/typescript-react-apollo`: `http://localhost:3000/plugins/typescript/typescript-react-apollo`\n"
  },
  {
    "path": "website/src/pages/docs/custom-codegen/extend-schema.mdx",
    "content": "---\ndescription: Learn how to create a custom plugin for GraphQL Code Generator. How to extend the GraphQL Schema?\n---\n\n# How to extend the GraphQL Schema?\n\nEach plugin can also specify `addToSchema` field, and to extend the `GraphQLSchema` with more types:\n\n```js {7-13}\nmodule.exports = {\n  plugin(schema, documents, config) {\n    const typesMap = schema.getTypeMap()\n\n    return Object.keys(typesMap).join('\\n')\n  },\n  addToSchema: /* GraphQL */ `\n    type MyType {\n      field: String\n    }\n\n    directive @myDirective on OBJECT\n  `\n}\n```\n\nIt's useful when you wish to add things like declarative `@directive` to your `GraphQLSchema`, which affects only the output of the codegen.\n\nFor example, let's add a custom `@directive` that tells the codegen to ignore a specific `type`:\n\n```js\nmodule.exports = {\n  plugin(schema, documents, config, info) {\n    const typesMap = schema.getTypeMap()\n\n    return Object.keys(typesMap)\n      .filter(typeName => {\n        const type = typesMap[typeName]\n        const { astNode } = type\n\n        if (astNode?.directives?.find(d => d.name.value === 'ignore')) {\n          return false\n        }\n\n        return true\n      })\n      .join('\\n')\n  },\n  addToSchema: /* GraphQL */ `\n    directive @ignore on OBJECT\n  `\n}\n```\n"
  },
  {
    "path": "website/src/pages/docs/custom-codegen/index.mdx",
    "content": "---\ndescription: The general purpose of GraphQL Code Generator is to parse GraphQL syntax, transform it into an AST and then output it into desired formats which can vary.\n---\n\n# What are Plugins?\n\nThe general purpose of GraphQL Code Generator is to parse GraphQL syntax, transform it into an AST and then output it into desired formats which can vary.\n\nSince there can be a potentially infinite amount of formats, we've made it possible to build custom plugins.\n\nPlugins are handlers who respond to the parsed data, and output is based on your implementation.\n\nGraphQL Code Generator triggers plugins with `GraphQLSchema` object, GraphQL documents, and the configuration the user has passed and expects them to return `string` (or `Promise<string>`), and then it appends this value to the output.\n\nWriting your plugins could be helpful for things such as new language templates, customizing existing plugins, and adding custom context to output files.\n\nIt's easy to write and test codegen plugins, and you can learn how to write your own.\n"
  },
  {
    "path": "website/src/pages/docs/custom-codegen/plugin-structure.mdx",
    "content": "---\ndescription: Learn how to write your own GraphQL Code Generator Plugin. You can use it to generate custom output, or to extend the existing plugins.\n---\n\nimport { Callout } from '@theguild/components'\n\n# Write your first Plugin\n\n## Basic Plugin\n\nTo get started with writing your GraphQL Code-Generator plugin, start by creating a simple `my-plugin.js` file in your project, with the following content:\n\n```js filename=\"my-plugin.js\"\nmodule.exports = {\n  plugin(schema, documents, config) {\n    return 'Hi!'\n  }\n}\n```\n\nThe exported object should match the [`CodegenPlugin`](https://github.com/dotansimha/graphql-code-generator/blob/e3af1dbc80a998444a1d1b353f127f297c6a09d0/packages/utils/plugins-helpers/src/types.ts#L552) interface.\n\nNow, let's try to load and use it with the codegen. Specify the path to your `.js` file in your `codegen.yml` config file:\n\n```yaml filename=\"codegen.yml\" {5}\nschema: my-schema.graphql\ndocuments: './src/**/*.graphql'\ngenerates:\n  plugins:\n    output.ts:\n      - my-plugin.js\n```\n\nNow, run the `@graphql-codegen/cli` using `graphql-codegen` command, and it will create a file called `output.ts` with `Hi!`\n\n## Using the `GraphQLSchema`\n\nThe first argument of your `plugin` function is the `GraphQLSchema`.\n\nThen, the code-generator will make sure to merge all `GraphQLSchema`'s into a single, easy-to-use object that you can use to create your output.\n\nYou can find the fully-typed [API of `GraphQLSchema` here](https://github.com/graphql/graphql-js/blob/2df59f18dd3f3c415eaba57d744131a674079ddf/src/type/schema.ts#L129).\n\nSo let's use a very basic method from `GraphQLSchema`, and return a list of all GraphQL types declared in the schema:\n\n```js filename=\"my-plugin.js\"\nmodule.exports = {\n  plugin(schema, documents, config, info) {\n    const typesMap = schema.getTypeMap()\n\n    return Object.keys(typesMap).join('\\n')\n  }\n}\n```\n\n## Using the documents\n\nThe second argument of your `plugin` method is an array of GraphQL documents. This array contains a list of `{ location: string, document: DocumentNode }`.\n\nThe `location` field is the file's path, and `DocumentNode` is an object containing all GraphQL documents that have been found in that file.\n\nYou can find the fully-typed [API of `DocumentNode` here](https://github.com/graphql/graphql-js/blob/main/src/language/ast.ts#L249-L253).\n\nLet's print a list of all documents files, and the name of operations in this file:\n\n```js filename=\"my-plugin.js\"\nmodule.exports = {\n  plugin(schema, documents, config, info) {\n    return documents\n      .map(doc => {\n        const docsNames = doc.document.definitions.map(def => def.name.value)\n\n        return `File ${doc.location} contains: ${docsNames.join(', ')}`\n      })\n      .join('\\n')\n  }\n}\n```\n\n## Add plugin configuration\n\nThe third argument of your function is `config`, and it includes an object with the configuration passed to your Plugin.\n\nYou can use it to tweak the behavior of your Plugin and allow developers to customize the output easily.\n\nYou can pass configuration to your plugin in the following this way:\n\n```yaml filename=\"codegen.yml\" {6}\nschema: my-schema.graphql\ndocuments: './src/**/*.graphql'\ngenerates:\n  output.ts:\n    plugins:\n      - my-plugin.js:\n          myConfig: 'some-value'\n```\n\nAnd then, you can use in your plugin:\n\n```js filename=\"my-plugin.js\"\nmodule.exports = {\n  plugin(schema, documents, config, info) {\n    if (extname(info.outputFile) === '.graphql') {\n      return 'baz'\n    }\n\n    return config.myConfig === 'some-value' ? 'foo' : 'bar'\n  }\n}\n```\n\n## Packing your Plugin\n\nTo pack your Plugin as a package, create a simple `package.json` file and add the `main` field, pointing to your Plugin file.\n\nThen, publish it to npm using `npm publish` and test it by installing the published package from npm, and use it in your YML config file:\n\n```yaml filename=\"codegen.yml\" {5}\nschema: my-schema.graphql\ndocuments: './src/**/*.graphql'\ngenerates:\n  plugins:\n    output.ts:\n      - my-custom-plugin-package\n```\n\n<Callout>\n  If you are using TypeScript to write your Plugin, don't forget to compile your `.ts` file using `tsc` and point `main`\n  to the compiled file.\n</Callout>\n"
  },
  {
    "path": "website/src/pages/docs/custom-codegen/using-visitor.mdx",
    "content": "---\ndescription: Learn how to write your own plugins for GraphQL Code Generator. Most of the codegen's plugins are written with a design-pattern called Visitor.\n---\n\n# Visitor Pattern\n\nMost of the codegen's plugins are written with a design-pattern called [Visitor](https://en.wikipedia.org/wiki/Visitor_pattern).\n\nIn addition, GraphQL has an internal mechanism for \"visiting\" `GraphQLSchema` and GraphQL operations, and you can use it to transform your GraphQL definitions into a custom output.\n\nYou can call a custom function on each AST node and transform it into something else with a visitor pattern.\n\nYou can use [ASTExplorer](https://astexplorer.net) and see how GraphQL represents its definitions in a JSON structure. You can also use this to understand which function will be called each time.\n\nIn [graphql.org](https://graphql.org/graphql-js/language/#visit) you can find the detailed API documentation we will use in this section.\n\n## Basic Visitor\n\nIn this example, we will transform a basic type definition into a list of types and fields:\n\nFrom:\n\n```graphql\ntype MyType {\n  myField: String!\n}\n\ntype MyOtherType {\n  myOtherField: Int!\n}\n```\n\nTo\n\n```\nMyType.myField\nMyOtherType.myOtherField\n```\n\nTo get started with a basic visitor, start by extracting the `astNode` of your `GraphQLSchema`:\n\n```js {5}\nconst { getCachedDocumentNodeFromSchema } = require('@graphql-codegen/plugin-helpers')\n\nmodule.exports = {\n  plugin(schema, documents, config) {\n    const astNode = getCachedDocumentNodeFromSchema(schema) // Transforms the GraphQLSchema into ASTNode\n  }\n}\n```\n\nThen, create your initial visitor, in our case, we would like to transform a `FieldDefinition` and `ObjectTypeDefinition`, so let's create an object with a stub definitions, an use `visit` to run it:\n\n```js {8-13}\nconst { getCachedDocumentNodeFromSchema, oldVisit } = require('@graphql-codegen/plugin-helpers')\n\nmodule.exports = {\n  plugin(schema, documents, config) {\n    const astNode = getCachedDocumentNodeFromSchema(schema) // Transforms the GraphQLSchema into ASTNode\n    const visitor = {\n      FieldDefinition(node) {\n        // This function triggered per each field\n      },\n      ObjectTypeDefinition(node) {\n        // This function triggered per each type\n      }\n    }\n\n    const result = oldVisit(astNode, { leave: visitor })\n\n    return result.definitions.join('\\n')\n  }\n}\n```\n\nNow, let's implement `ObjectTypeDefinition` and `FieldDefinition`:\n\n```js {8-15}\nconst { getCachedDocumentNodeFromSchema, oldVisit } = require('@graphql-codegen/plugin-helpers')\n\nmodule.exports = {\n  plugin(schema, documents, config) {\n    const astNode = getCachedDocumentNodeFromSchema(schema) // Transforms the GraphQLSchema into ASTNode\n    const visitor = {\n      FieldDefinition(node) {\n        // Transform the field AST node into a string, containing only the name of the field\n        return node.name.value\n      },\n      ObjectTypeDefinition(node) {\n        // \"node.fields\" is an array of strings, because we transformed it using \"FieldDefinition\".\n        return node.fields.map(field => `${node.name.value}.${field}`).join('\\n')\n      }\n    }\n\n    const result = oldVisit(astNode, { leave: visitor })\n\n    return result.definitions.join('\\n')\n  }\n}\n```\n\n## Codegen and Visitors\n\nThis repository also contains a set of utils that might help you to write plugins faster using the visitor pattern.\n\nAll those utils are part of `@graphql-codegen/visitor-plugin-common` package.\n\nIt includes a set of Visitor classes that you can use and extend to implement your plugin quickly:\n\nFor example, `BaseVisitor` is a class that contains a simple implementation and utils for plugin configuration and lets you quickly implement plugins compatible with `namingConvention` and `scalars` configuration.\n\n[You can find an example for using it here](https://github.com/dotansimha/graphql-code-generator/blob/master/packages/plugins/typescript/mongodb/src/visitor.ts#L38).\n\n- `BaseTypesVisitor` is a class that contains implementation for converting types, interfaces, unions, enums, and fields. It's the base implementation for [`flow`](https://github.com/dotansimha/graphql-code-generator/blob/master/packages/plugins/flow/flow/src/visitor.ts#L12) and [`typescript`](https://github.com/dotansimha/graphql-code-generator/blob/master/packages/plugins/typescript/typescript/src/visitor.ts#L18) plugins\n\n- `BaseResolversVisitor` is a class that contains implementation for generating a resolvers signature, it's the base implementation for [`flow-resolvers`](https://github.com/dotansimha/graphql-code-generator/blob/master/packages/plugins/flow/resolvers/src/visitor.ts#L10) and [`typescript-resolvers`](https://github.com/dotansimha/graphql-code-generator/blob/master/packages/plugins/typescript/resolvers/src/visitor.ts#L13)\n\n- `BaseDocumentsVisitor` is class that contains implementation for transforming GraphQL operations (query/mutation/subscription/fragment) with a recursive handler for selection-sets. It's the base implementation for [`flow-operations`](https://github.com/dotansimha/graphql-code-generator/blob/master/packages/plugins/flow/operations/src/visitor.ts#L14) and [`typescript-operations`](https://github.com/dotansimha/graphql-code-generator/blob/master/packages/plugins/typescript/operations/src/visitor.ts#L15)\n\n- `ClientSideBaseVisitor` is a class that contains implementation for creating client-side code for consuming GraphQL operations, it's in use by `typescript-apollo-angular`, `typescript-react-apollo`, `typescript-vue-apollo` and `typescript-apollo-stencil` plugins\n\nTo create a custom plugin, you can use the above classes as a base and extend it as you wish.\n"
  },
  {
    "path": "website/src/pages/docs/custom-codegen/validate-configuration.mdx",
    "content": "---\ndescription: Learn how to create your own plugins for GraphQL Code Generator. You can use plugins to generate code, documents, or even to modify the schema.\n---\n\nimport { Callout } from '@theguild/components'\n\n# Validate Plugin Configuration\n\nEach plugin can also provide a function to validate the configuration before executing it.\n\nYou can use this function to:\n\n- test for other plugin's existence (for example, if your plugin requires another plugin to function correctly)\n- validate the name and path of the output file\n- validate the schema or documents\n\nAnd much more!\n\nTo add your plugin validation method, export a function called `validate` from your plugin file:\n\n```js {7}\nmodule.exports = {\n  plugin(schema, documents, config, info) {\n    const typesMap = schema.getTypeMap()\n\n    return Object.keys(typesMap).join('\\n')\n  },\n  validate(schema, documents, config, outputFile, allPlugins) {}\n}\n```\n\n<Callout>\n  `outputFile` is the name of the output file, and you can use it to enforce the specific filename of a specific file\n  extension.\n</Callout>\n\n<Callout>\n  `allPlugins` is a list of all plugins requested in this specific output file - use it to create dependencies between\n  plugins.\n</Callout>\n\nYou can now check the schema, documents, configuration, output file and sibling plugins, and in case something does not fits your requirements, throw an `Error`:\n\n```js {9}\nmodule.exports = {\n  plugin(schema, documents, config, info) {\n    const typesMap = schema.getTypeMap()\n\n    return Object.keys(typesMap).join('\\n')\n  },\n  validate(schema, documents, config, outputFile, allPlugins) {\n    if (!config.mustHave) {\n      throw new Error(`You must specify \"mustHave\" in my plugin configuration!`)\n    }\n  }\n}\n```\n"
  },
  {
    "path": "website/src/pages/docs/getting-started/_meta.ts",
    "content": "export default {\n  index: 'Introduction',\n  installation: 'Installation',\n  'development-workflow': 'Development workflow',\n  'esm-typescript-usage': 'ESM TypeScript usage',\n};\n"
  },
  {
    "path": "website/src/pages/docs/getting-started/development-workflow.mdx",
    "content": "---\ndescription: How to integrate GraphQL Code Generator into your development workflow. Learn how to run it in watch mode, or as part of your CI flow.\n---\n\nimport { Callout } from '@theguild/components'\n\n# Development workflow\n\nGraphQL Code Generator should be integrated as part of your development workflow.\n\n## Scripts Integration\n\nIf you wish to run the codegen before starting your server/app, you can use `pre` scripts in your `package.json`, for example:\n\n```json filename=\"package.json\" {6-7}\n{\n  \"scripts\": {\n    \"dev\": \"nodemon app.js\",\n    \"start\": \"node app.js\",\n    \"generate\": \"graphql-codegen\",\n    \"prestart\": \"yarn generate\",\n    \"predev\": \"yarn generate\"\n  }\n}\n```\n\nThis way, the codegen generates the output according to your configuration before each time you run `dev` or `start` scripts.\n\nIt's also helpful to run the codegen during your continuous integration flow and ensure that your code continually compiles with the generated output; this way, you can detect breaking changes in your GraphQL schema and GraphQL documents.\n\n## Watch Mode\n\n<Callout type=\"info\">\nWatch mode was made optional to reduce install size in CI and prevent build errors in certain environments.\n\nTo use watch mode, install [`@parcel/watcher`](https://www.npmjs.com/package/@parcel/watcher).\n\n</Callout>\n\nIf you wish to run the codegen in watch mode, you can specify `--watch` (or `-w`) when running it.\n\nYou can either run it in a separate terminal session or use tools like [`concurrently`](https://npmjs.com/package/concurrently) to run two scripts at the same time:\n\n```json {3} /--watch/\n{\n  \"scripts\": {\n    \"dev\": \"concurrently \\\"nodemon app.js\\\" \\\"yarn generate --watch\\\"\",\n    \"start\": \"node app.js\",\n    \"generate\": \"graphql-codegen\",\n    \"prestart\": \"yarn generate\"\n  }\n}\n```\n\nIf you wish, you can specify a custom list of files to watch, by adding a glob expression to the command, using `--watch` flag:\n\n```sh /\"src/**/*.js\"/\nyarn graphql-codegen --watch \"src/**/*.js\"\n```\n\nUse this when you are loading your schema or documents from a single code file that depends on other files internally because codegen can't tell that you're using those files automatically.\n\nWe use [`@parcel/watcher`](https://github.com/parcel-bundler/watcher) which supports subscribing to realtime notifications of changes in a directory. It works recursively, so changes in sub-directories will also be emitted.\n\n```ts {6-10}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:4000/graphql',\n  // ...\n  watch: true\n}\n\nexport default config\n```\n\n## Monorepo and Yarn Workspaces\n\nIf you are using a monorepo structure, with tools such as [Yarn Workspaces](https://yarnpkg.com/lang/en/docs/workspaces) or [Lerna](https://github.com/lerna/lerna), we recommend installing the codegen in the root of your monorepo.\n\nIf you need to execute the codegen multiple times, note that you can specify multiple fields for `generates` field, for example:\n\n```ts {7-8}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'server/src/**/*.graphql',\n  documents: 'client/src/**/*.graphql',\n  generates: {\n    'client/src/models.ts': ['typescript', 'typescript-operations'],\n    'server/src/models.ts': ['typescript', 'typescript-resolver']\n  }\n}\n\nexport default config\n```\n\n## What's next?\n\nGet started with our guides:\n\n- [React and Vue](/docs/guides/react-vue)\n- [Angular](/docs/guides/angular)\n- [Svelte](/docs/guides/svelte)\n- [Apollo and Yoga server](/docs/guides/graphql-server-apollo-yoga)\n- [GraphQL Modules](/docs/guides/graphql-modules)\n\nIf your stack is not listed above, please refer to [our plugins directory](/plugins).\n"
  },
  {
    "path": "website/src/pages/docs/getting-started/esm-typescript-usage.mdx",
    "content": "---\ntitle: ESM TypeScript Usage\ndescription: How to use ESM with TypeScript. ESM is an important step in the JavaScript ecosystem because it allows static analysis of the dependency tree.\n---\n\n# ESM TypeScript Usage\n\nESM is an important step in the JavaScript ecosystem because it allows static analysis of the dependency tree.\nFor bundlers such as Webpack, this is huge as it allows the compiled bundle only to contain code that is required at runtime, which means a smaller download size when loading code over the network.\n\nWhile ESM is a huge benefit for the whole JavaScript community, the adoption is not straight-forward.\n\n**Note:** ESM adoption in the JavaScript ecosystem is still in progress. If you choose to use ESM in your application (especially Node.js), you might hit a lot of pitfalls and incompatibility issues within libraries.\n\nIf you are not interested in ESM, you can easily skip this documentation.\n\nLet's show you how to use ESM with TypeScript.\n\nIf you are impatient, [checkout this example](https://github.com/dotansimha/graphql-code-generator/tree/master/examples/typescript-esm).\n\n## Codegen Configuration\n\nOne quirk of ESM is that named imports, such as `./foo` or `../something/from/here`, now require adding a file extension at the end of the import statement.\nFor these examples, the correct ESM counterpart is `./foo.js` and `../something/from/here.js`.\n\nIn order to instruct GraphQL Code Generator to generate such imports whenever a named import is generated, you need to set the `importExtension` option.\n\n### Standard ESM with TypeScript (transpiled to JavaScript)\n\nFor most TypeScript projects that compile to JavaScript, you should use `.js` extensions:\n\n```ts filename=\"codegen.ts\" {6}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:4000/graphql',\n  documents: ['src/**/*.tsx'],\n  importExtension: '.js',\n  generates: {\n    './src/gql/': {\n      preset: 'client'\n    }\n  }\n}\n\nexport default config\n```\n\n### Direct TypeScript Execution (Node.js 22.18.0+ or Deno)\n\nSince Node.js v22.18.0 (with type stripping enabled by default) and Deno, you can run TypeScript files directly without transpilation. In these environments, you can use `.ts` extensions in your imports:\n\n```ts filename=\"codegen.ts\" {6}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:4000/graphql',\n  documents: ['src/**/*.tsx'],\n  importExtension: '.ts',\n  generates: {\n    './src/gql/': {\n      preset: 'client'\n    }\n  }\n}\n\nexport default config\n```\n\nWith this configuration, the generated code will use `.ts` extensions in import statements:\n\n```ts\nimport { FragmentType } from './fragment-masking.ts'\nimport { graphql } from './gql.ts'\n```\n\n**When to use `.ts` extensions:**\n\n- You're using Node.js v22.18.0 or later with type stripping enabled (default)\n- You're running your code with Deno\n- You want to execute TypeScript files directly without a build step\n\n**When to use `.js` extensions:**\n\n- You're compiling TypeScript to JavaScript (most common case)\n- You're using an older version of Node.js\n- You have a build step in your workflow\n\n## TypeScript Compiler Options\n\nTypeScript introduced a new module resolution algorithm for ESM in version 4.7.\nFor supporting ESM within your application, you need to set `moduleResolution` to `node16` and the (output) `module` type to `node16` (see tsconfig.json).\n\n```ts {4,5}\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"moduleResolution\": \"node16\",\n    \"module\": \"node16\",\n    \"outDir\": \"dist\"\n  },\n  \"include\": [\"src/**/*\"]\n}\n```\n\n## Package adjustments\n\nIn order to instruct runtimes and tooling to interpret `.js` files as ESM you have to set the `type` property to `module` within the `package.json` of your application.\n\nFurthermore, you can use the ESM CLI version of GraphQL Code Generator by utilizing the command `graphql-codegen-esm.\nThis step, however, is fully optional.\n\n```json filename=\"package.json\" {14,18}\n{\n  \"name\": \"example-typescript-esm\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"2.11.3\",\n    \"@graphql-codegen/client-preset\": \"2.1.1\"\n  },\n  \"dependencies\": {\n    \"@graphql-typed-document-node/core\": \"3.2.0\",\n    \"graphql\": \"16.5.0\"\n  },\n  \"scripts\": {\n    \"codegen\": \"graphql-codegen-esm --config codegen.ts\",\n    \"build\": \"tsc\",\n    \"start\": \"node dist/main.js\"\n  },\n  \"type\": \"module\"\n}\n```\n\n## Conclusion\n\nSupporting ESM and configuring GraphQL Code Generator and your project for ESM requires some work but isn't that hard.\nAs mentioned before, you can check out [an example in the GraphQL Code Generator repository](https://github.com/dotansimha/graphql-code-generator/tree/master/examples/typescript-esm).\n\nHere are also some useful additional resources:\n\n- [ECMAScript Module Support in Node.js - TypeScript 4.7 Changelog](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#ecmascript-module-support-in-node-js)\n- [package.json type module - Node.js documentation](https://nodejs.org/api/packages.html#type)\n- [Named Imports - import MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#named_import)\n"
  },
  {
    "path": "website/src/pages/docs/getting-started/index.mdx",
    "content": "---\ntitle: Introduction\ndescription: GraphQL Code Generator is a plugin-based tool that helps you get the best out of your GraphQL stack. From back-end to front-end, GraphQL Code Generator automates the generation of typed Queries, Mutations and, Subscriptions for React, Vue, Angular, Next.js, Svelte, whether you are using Apollo Client, URQL or, React Query.\n---\n\nimport { Tabs, Callout, Cards} from '@theguild/components'\n\n# Introduction to GraphQL Code Generator\n\nGraphQL Code Generator is a plugin-based tool that helps you get the best out of your GraphQL stack.\n\nFrom back-end to front-end, GraphQL Code Generator automates the generation of:\n\n- **Typed Queries, Mutations and, Subscriptions** for React, Vue, Angular, Next.js, Svelte, whether you are using Apollo Client, URQL or, React Query.\n- **Typed GraphQL resolvers**, for any Node.js (GraphQL Yoga, GraphQL Modules, TypeGraphQL or Apollo) or Java GraphQL server.\n- **Fully-typed Node.js SDKs, Apollo Android** support, and more!\n\n## The perfect GraphQL Developer Experience\n\nTo illustrate how GraphQL Code Generator improves your developer experience, let's take a look at the front-end and back-end usage of the following schema:\n\n```graphql filename=\"schema.graphql\"\ntype Author {\n  id: Int!\n  firstName: String!\n  lastName: String!\n  posts(findTitle: String): [Post]\n}\n\ntype Post {\n  id: Int!\n  title: String!\n  author: Author\n}\n\ntype Query {\n  posts: [Post]\n}\n```\n\nThe following sections showcase why GraphQL Code Generator is a game-changer for your GraphQL Stack.\n\n### From the Frontend\n\nMost client-side implementations without GraphQL Code Generator would query the API as showcased in the following examples:\n\n<Tabs items={['URQL React', 'React Query', 'Vue Apollo', 'Angular Apollo', 'Svelte Apollo']}>\n<Tabs.Tab>\n```tsx\nimport { useQuery } from 'urql'\n\ninterface PostsQuery {\n  posts: {\n    id: string\n    title: string\n    author?: {\n      id: string\n      firstName: string\n      lastName: string\n    }\n  }[]\n}\n\nconst postsQueryDocument = /* GraphQL */ `\n  query Posts {\n    posts {\n      id\n      title\n      author {\n        id\n        firstName\n        lastName\n      }\n    }\n  }\n`\n\nconst Posts = () => {\n  const [result] = useQuery<PostsQuery>({ query: postsQueryDocument })\n\n  // …\n}\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```tsx\nimport { request, gql } from 'graphql-request'\nimport { useQuery } from '@tanstack/react-query'\n\ninterface PostsQuery {\n  posts: {\n    id: string\n    title: string\n    author?: {\n      id: string\n      firstName: string\n      lastName: string\n    }\n  }[]\n}\n\nconst postsQueryDocument = gql`\n  query Posts {\n    posts {\n      id\n      title\n      author {\n        id\n        firstName\n        lastName\n      }\n    }\n  }\n`\n\nconst Posts = () => {\n  const { data } = useQuery<PostsQuery>('posts', async () => {\n    const { posts } = await request(endpoint, postsQueryDocument)\n    return posts\n  })\n\n  // …\n}\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```vue\n<template>\n  <div class=\"apollo\">\n    <!-- UI … -->\n  </div>\n</template>\n\n<script lang=\"ts\">\ninterface PostQueryVariables {\n  id: string\n}\n\nexport default {\n  apollo: {\n    post: {\n      query: gql`\n        query ($id: ID!) {\n          post(id: $id) {\n            id\n            title\n            author {\n              id\n              firstName\n              lastName\n            }\n          }\n        }\n      `,\n      variables: { id: 1 } as PostQueryVariables\n    }\n  },\n  data() {\n    return {\n      post: undefined\n    }\n  }\n}\n</script>\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```tsx\nconst GET_POSTS = gql`\n  query Posts {\n    posts {\n      id\n      title\n      author {\n        id\n        firstName\n        lastName\n      }\n    }\n  }\n`\n\ninterface Post {\n  id: string\n  title: string\n  author?: {\n    id: string\n    firstName: string\n    lastName: string\n  }\n}\n\n@Component({ /* … */ })\nclass PostsComponent implements OnInit, OnDestroy {\n  posts: Post[]\n\n  private querySubscription: Subscription\n\n  ngOnInit() {\n    this.querySubscription = this.apollo\n      .watchQuery({ query: GET_POSTS })\n      .valueChanges.subscribe(({ data }) => {\n        this.posts = data.posts as Post[]\n      })\n  }\n  ngOnDestroy() {\n    this.querySubscription.unsubscribe()\n  }\n}\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```svelte\n<script lang=\"ts\">\n  import { query } from 'svelte-apollo'\n\n  const postsQueryDocument = gql`\n    query Posts {\n      posts {\n        id\n        title\n        author {\n          id\n          firstName\n          lastName\n        }\n      }\n    }\n  `\n\n  const posts = query(postsQueryDocument)\n</script>\n\n<ul>\n  <!-- UI … -->\n</ul>\n```\n</Tabs.Tab>\n</Tabs>\n\nManually maintaining the GraphQL operation types or the complete absence of types can lead to many issues:\n\n- **outdated typing** (regarding the current Schema)\n\n- **typos**\n\n- **partial typing** of data (not all Schema&apos;s fields has a corresponding type)\n\nThe strength of your frontend application types is based on your data types.\nAny mistake on your manually maintained data types ripples in many of your components.\n\nFor this reason, automating and generating the typing of your GraphQL operations will both improve the developer\nexperience and stability of your stack.\n\nAfter installing GraphQL Code Generator:\n\n```sh npm2yarn\nnpm i graphql\nnpm i -D typescript @graphql-codegen/cli\n```\n\nand providing a simple configuration:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n   schema: 'https://localhost:4000/graphql',\n   documents: ['src/**/*.tsx'],\n   generates: {\n      './src/gql/': {\n        preset: 'client',\n      }\n   }\n}\nexport default config\n```\n\nYou will no longer need to maintain TypeScript types:\n\n<Tabs items={['URQL React', 'React Query', 'Vue Apollo', 'Angular Apollo', 'Svelte Apollo']}>\n<Tabs.Tab>\n```tsx\nimport { useQuery } from 'urql'\nimport { graphql } from './gql/gql'\n\n// postsQueryDocument is now fully typed!\nconst postsQueryDocument = graphql(/* GraphQL */ `\n  query Posts {\n    posts {\n      id\n      title\n      author {\n        id\n        firstName\n        lastName\n      }\n    }\n  }\n`)\n\nconst Posts = () => {\n  // URQL's `useQuery()` knows how to work with typed graphql documents\n  const [result] = useQuery({ query: postsQueryDocument })\n\n  // `result` is fully typed!\n  // …\n}\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```tsx\nimport { request } from 'graphql-request'\nimport { useQuery } from '@tanstack/react-query'\nimport { graphql } from './gql/gql'\n\n// postsQueryDocument is now fully typed!\nconst postsQueryDocument = graphql(/* GraphQL */ `\n  query Posts {\n    posts {\n      id\n      title\n      author {\n        id\n        firstName\n        lastName\n      }\n    }\n  }\n`)\n\nconst Posts = () => {\n  // React Query `useQuery()` knows how to work with typed graphql documents\n  const { data } = useQuery<PostsQuery>('posts', async () => {\n    const { posts } = await request(endpoint, postsQueryDocument)\n    return posts\n  })\n\n  // `data` is fully typed!\n  // …\n}\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```vue\n<script setup lang=\"ts\">\nimport { useQuery } from '@vue/apollo-composable';\nimport { graphql } from './gql/gql';\nimport FilmItem from './components/FilmItem.vue';\nimport { computed } from 'vue';\nconst { result } = useQuery(\n  graphql(/* GraphQL */ `\n    query Posts {\n      posts {\n        id\n        title\n        author {\n          id\n          firstName\n          lastName\n        }\n      }\n    }\n  `),\n);\n\n// `posts` is properly typed!\nconst posts = computed(() => result.value?.posts);\n</script>\n\n<template>\n  <ul>\n    <li v-for=\"film of films\"><FilmItem :film=\"film\" /></li>\n  </ul>\n</template>\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```tsx\nimport { PostsGQL, PostsQuery } from './graphql'\nimport { Observable } from 'rxjs'\nimport { map } from 'rxjs/operators'\n\n@Component({ /* … */ })\nexport class PostsComponent {\n  posts: Observable<PostsQuery['posts']>\n\n  constructor(postsGQL: PostsGQL) {\n    this.posts = postsGQL.watch().valueChanges.pipe(map(result => result.data.posts))\n  }\n}\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```svelte\n<script lang=\"ts\">\n  import { Posts } from '../graphql/generated'\n\n  // `posts` is fully typed, also are `Posts()` options!\n  const posts = Posts()\n</script>\n\n<ul>\n  <!-- UI … -->\n</ul>\n```\n</Tabs.Tab>\n</Tabs>\n\nNow, with simple configuration and an npm/yarn script, a front-end developer benefits from:\n\n- **up-to-date typings**\n\n- **autocompletion on all queries, mutations and, subscription variables and results**\n\n- **less boilerplate** (thanks to full code generation such as React hooks generation)\n\n<Callout>\n**Operations and fragments must have unique names**\n\nGraphQL Code Generator checks for this automatically and will let you know if you have any conflicts.\n</Callout>\n\n<Callout>\n**How does GraphQL Code Generator work?**\n\nMore details on the inner working of GraphQL Code Generator are available on [this page](/docs/advanced/how-does-it-work).\n</Callout>\n\n### To the Backend\n\nMost GraphQL API resolvers remain untyped or wrongly typed which, leads to multiple issues:\n\n- resolvers are not compliant with the schema definition\n\n- typos in the resolvers' function type signature\n\nFor this reason, GraphQL Code Generator provides multiple plugins that help you automate the generation of resolvers' typings.\n\nHere are an example of a GraphQL API leveraging GraphQL Code Generator resolvers typings (based on the `schema.graphql` above):\n\n<Tabs items={['Apollo Server', 'GraphQL Yoga', 'GraphQL Modules']}>\n<Tabs.Tab>\n```ts\nimport { readFileSync } from 'node:fs'\nimport { ApolloServer } from 'apollo-server'\nimport { Resolvers } from './resolvers-types'\n\nconst typeDefs = readFileSync('./schema.graphql', 'utf8')\n\nconst resolvers: Resolvers = {\n  Query: {\n    // typed resolvers!\n  }\n}\n\nconst server = new ApolloServer({ typeDefs, resolvers })\n\n// The `listen` method launches a web server\nserver.listen().then(({ url }) => {\n  console.log(`🚀  Server ready at ${url}`)\n})\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```ts\nimport { readFileSync } from 'node:fs'\nimport { createServer } from 'node:http'\nimport { createYoga, createSchema } from 'graphql-yoga'\nimport { Resolvers } from './resolvers-types'\n\nconst typeDefs = readFileSync('./schema.graphql', 'utf8')\n\nconst resolvers: Resolvers = {\n  Query: {\n    // typed resolvers!\n  }\n}\n\nconst schema = createSchema({ typeDefs, resolvers })\nconst yoga = createYoga({ schema })\nconst server = createServer(yoga)\n\nserver.listen(4000, () => {\n  console.log('GraphQL Server is listening on http://localhost:4000/graphql');\n})\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\nGiven the following structure:\n\n```\n- src/\n  - modules/\n    - user/\n      - resolvers.ts\n      - typedefs/\n        - user.graphql\n    - product/\n      - resolvers.ts\n      - typedefs/\n        - product.graphql\n```\n\nThe User module resolvers would be:\n\n```ts filename=\"src/modules/user/resolvers.ts\"\nimport { UsersModule } from './generated-types/module-types'\n\nexport const resolvers: UsersModule.Resolvers = {\n  // Here, you can implement only the types and fields defined in your module!\n}\n```\n</Tabs.Tab>\n</Tabs>\n\n## What's next?\n\nAfter unstanding the basic concepts of GraphQL Code Generator, you can start setting it up within your project.\nIf your stack is not listed below, please refer to [our plugin overview](/plugins).\n\n### Client-Side GraphQL\n\nChoose your existing setup or preference to get started.\n\n<Cards>\n  <Cards.Card arrow title=\"Vanilla TypeScript\" href=\"/docs/guides/vanilla-typescript\" />\n  <Cards.Card arrow title=\"React Query\" href=\"/docs/guides/react-query\" />\n  <Cards.Card arrow title=\"React / Vue\" href=\"/docs/guides/react-vue\" />\n  <Cards.Card arrow title=\"Angular\" href=\"/docs/guides/angular\" />\n  <Cards.Card arrow title=\"Svelte\" href=\"/docs/guides/svelte\" />\n</Cards>\n\n### Server-Side GraphQL\n\n\n<Cards>\n  <Cards.Card\n    arrow\n    title=\"GraphQL Yoga with Server Preset\"\n    href=\"/docs/guides/graphql-server-apollo-yoga-with-server-preset\"\n  />\n   <Cards.Card\n    arrow\n    title=\"Apollo Server with Server Preset\"\n    href=\"/docs/guides/graphql-server-apollo-yoga-with-server-preset\"\n  />\n  <Cards.Card arrow title=\"Apollo and Yoga server\" href=\"/docs/guides/graphql-server-apollo-yoga\" />\n  <Cards.Card arrow title=\"GraphQL Modules\" href=\"/docs/guides/graphql-modules\" />\n</Cards>\n\n\n### Troubleshooting\n\nIf you are experiencing any issues, you can reach us via the following channels:\n\n- Found a bug? [report it in our GitHub repo](https://github.com/dotansimha/graphql-code-generator)\n- Need help or have a question? You can use the live chat box in the corner of the screen, [ask it in our GitHub Discussions page](https://github.com/dotansimha/graphql-code-generator/discussions) or [reach out to us directly in our Discord](http://bit.ly/guild-chat)\n- We have more awesome [open source tools](https://github.com/the-guild-org/Stack)!\n- You can [visit our website](https://the-guild.dev) for more information about us and what we do\n"
  },
  {
    "path": "website/src/pages/docs/getting-started/installation.mdx",
    "content": "---\ntitle: Quick Start\ndescription: GraphQL Code Generator is a plugin-based tool that helps you get the best out of your GraphQL stack. From back-end to front-end, GraphQL Code Generator automates the generation of typed Queries, Mutations and, Subscriptions for React, Vue, Angular, Next.js, Svelte, whether you are using Apollo Client, URQL or, React Query.\n---\n\nimport { Callout, Cards } from '@theguild/components'\n\n# Quick Start\n\nMake sure that you add both the `graphql` and `@graphql-codegen/cli` packages in your project's dependencies:\n\n```sh npm2yarn\nnpm i graphql\nnpm i -D typescript @graphql-codegen/cli\n```\n\nIf you want [watch mode](/docs/getting-started/development-workflow#watch-mode) support you need to add `@parcel/watcher` as well:\n\n```sh npm2yarn\nnpm i -D @parcel/watcher\n```\n\n## Global Installation\n\nPlease avoid installing `graphql`, `@graphql-codegen/cli`, and its plugins as global dependencies. This will cause issues because of duplications of the `graphql` package. Install it only locally in your project.\n\n## Monorepo Project\n\nIf you are using Monorepo setup (Yarn or pnpm Workspaces), please note that GraphQL Codegen is using `require` to load plugins and files. This might break and fail in case of hoisting.\n\nIf you are having issues with loading GraphQL-Codegen plugins, make sure it's installed correctly, at the same level of `node_modules`, and make sure it's accessible and available for the Codegen CLI.\n\n## Setup\n\nGraphQL Code Generator comes with dozens of plugins, from frontend to backend, from web apps to mobile apps.\nWe recommend looking at the [guides](#manual-setup) or trying the [initialization wizards](#initialization-wizard)\n\nOtherwise, you can start exploring the [plugins](/plugins) and [setting up them manually](#manual-setup).\n\n## Initialization Wizard\n\nOnce installed, GraphQL Code Generator CLI can help you configure your project based on some popular flows:\n\n```sh\nnpx graphql-code-generator init\n```\n\nInstall the chosen packages:\n\n```sh npm2yarn\nnpm install\n```\n\nQuestion by question, it will guide you through the whole process of setting up a schema, selecting and installing plugins, picking a destination to where your files are generated, and a lot more.\n\n## Manual Setup\n\nOnce GraphQL Code Generator is installed and added to your project's development workflow (scripts), you can start installing plugins and configuring them.\n\nIf you are looking for the **best way to leverage GraphQL Code Generator on your stack**, you should read one of our _Guides_.\n\n### Client\n\nFollow one of the following guides to get started.\n\n<Cards>\n  <Cards.Card arrow title=\"Vanilla TypeScript\" href=\"/docs/guides/vanilla-typescript\" />\n  <Cards.Card arrow title=\"React Query\" href=\"/docs/guides/react-query\" />\n  <Cards.Card arrow title=\"React / Vue\" href=\"/docs/guides/react-vue\" />\n  <Cards.Card arrow title=\"Angular\" href=\"/docs/guides/angular\" />\n  <Cards.Card arrow title=\"Svelte\" href=\"/docs/guides/svelte\" />\n</Cards>\n\n### Server\n\nFollow one of the following guides to get started.\n\n<Cards>\n  <Cards.Card\n    arrow\n    title=\"Apollo and Yoga server with Server Preset\"\n    href=\"/docs/guides/graphql-server-apollo-yoga-with-server-preset\"\n  />\n  <Cards.Card arrow title=\"Apollo and Yoga server\" href=\"/docs/guides/graphql-server-apollo-yoga\" />\n  <Cards.Card arrow title=\"GraphQL Modules\" href=\"/docs/guides/graphql-modules\" />\n</Cards>\n\n### Other\n\nIf your stack is not listed above, please refer to [our plugins directory](/plugins).\n"
  },
  {
    "path": "website/src/pages/docs/guides/_meta.ts",
    "content": "export default {\n  'vanilla-typescript': 'Vanilla TypeScript',\n  'react-query': 'React Query',\n  'react-vue': 'React / Vue',\n  angular: 'Angular',\n  svelte: 'Svelte / Kit',\n  'flutter-freezed': 'Dart/Flutter',\n  'graphql-server-apollo-yoga': 'Apollo Server / GraphQL Yoga',\n  'graphql-server-apollo-yoga-with-server-preset': 'Apollo Server / GraphQL Yoga with Server Preset',\n  'api-testing': 'API Testing',\n  'graphql-modules': 'GraphQL Modules',\n  'further-reading': 'Further Reading',\n};\n"
  },
  {
    "path": "website/src/pages/docs/guides/angular.mdx",
    "content": "---\ndescription: GraphQL Code Generator provides the @graphql-codegen/typescript-apollo-angular plugin that generates full-typed Apollo GraphQL services.\n---\n\nimport { Callout } from '@theguild/components'\n\n# Guide: Angular\n\nGraphQL Code Generator provides the `@graphql-codegen/typescript-apollo-angular` plugin that generates full-typed Apollo GraphQL services.\n\nTaking the following schema:\n\n```graphql filename=\"schema.graphql\"\ntype Author {\n  id: Int!\n  firstName: String!\n  lastName: String!\n  posts(findTitle: String): [Post]\n}\n\ntype Post {\n  id: Int!\n  title: String!\n  author: Author\n}\n\ntype Query {\n  posts: [Post]\n}\n```\n\nMost Apollo Client usage in Angular will look as follows:\n\n```ts\nconst GET_POSTS = gql`\n  query Posts {\n    posts {\n      id\n      title\n      author {\n        id\n        firstName\n        lastName\n      }\n    }\n  }\n`\n\ninterface Post {\n  id: string\n  title: string\n  author?: {\n    id: string\n    firstName: string\n    lastName: string\n  }\n}\n\n@Component({\n  /* … */\n})\nclass PostsComponent implements OnInit, OnDestroy {\n  posts: Post[]\n\n  private querySubscription: Subscription\n\n  ngOnInit() {\n    this.querySubscription = this.apollo\n      .watchQuery({\n        query: GET_POSTS\n      })\n      .valueChanges.subscribe(({ data }) => {\n        this.posts = data.posts as Post[]\n      })\n  }\n  ngOnDestroy() {\n    this.querySubscription.unsubscribe()\n  }\n}\n```\n\nNot typing or manually maintaining the data-types can lead to many issues:\n\n- **outdated typing** (regarding the current Schema)\n\n- **typos**\n\n- **partial typing** of data (not all Schema&apos;s fields has a corresponding type)\n\nFor this reason, GraphQL Code Generator provides a `@graphql-codegen/typescript-apollo-angular` plugin that generates typed Apollo services for each GraphQL operation.\n\nJust a few configuration steps are required to get those Apollo services:\n\n### Install\n\n```sh npm2yarn\nnpm i graphql\nnpm i -D typescript\nnpm i -D @graphql-codegen/cli\nnpm i -D @graphql-codegen/typescript\nnpm i -D @graphql-codegen/typescript-operations\nnpm i -D @graphql-codegen/typescript-apollo-angular\n```\n\n### Configure the plugin\n\nCreate or update your `codegen.ts` file as follows:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://my-graphql-api.com/graphql',\n  documents: './src/**/*.ts',\n  generates: {\n    './graphql/generated.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-apollo-angular']\n    }\n  }\n}\nexport default config\n```\n\n<Callout>\n**`schema` and `documents` values**\n\n`schema` needs to be your target GraphQL API URL (`\"/graphql\"` included).\n\n`documents` is a glob expression to your `.graphql` or `.ts` files.\n\n</Callout>\n\n### Run the codegen and update your code\n\nAssuming that, as recommended, your `package.json` has the following script:\n\n```json filename=\"package.json\"\n{\n  \"scripts\": {\n    \"generate\": \"graphql-codegen\"\n  }\n}\n```\n\nRunning the following generates the `graphql/generated.ts` file.\n\n```sh npm2yarn\nnpm run generate\n```\n\nWe can now update our code as follows:\n\n```ts\nimport { PostsGQL, PostsQuery } from './graphql'\n// BE SURE TO USE Observable from `rxjs` and not from `@apollo/client/core` when using map\nimport { Observable } from 'rxjs'\nimport { map } from 'rxjs/operators'\n\n@Component({\n  /* … */\n})\nexport class PostsComponent {\n  posts: Observable<PostsQuery['posts']>\n\n  constructor(postsGQL: PostsGQL) {\n    this.posts = postsGQL.watch().valueChanges.pipe(map(result => result.data.posts))\n  }\n}\n```\n\nFor more advanced configuration, please refer to the [plugin documentation](/plugins/typescript-apollo-angular).\n\nFor a different organization of the generated files, please refer to the [\"Generated files colocation\"](/docs/advanced/generated-files-colocation) page.\n"
  },
  {
    "path": "website/src/pages/docs/guides/api-testing.mdx",
    "content": "---\ndescription: GraphQL Code Generator can generate typed results for your GraphQL operations. This tutorial uses GraphQL Yoga, but the practices are applicable to testing any GraphQL server.\n---\n\nimport { Callout } from '@theguild/components'\n\n# Guide: API Testing\n\nGraphQL Code Generator can generate typed results for your GraphQL operations.\n\n<br />\n\nThis tutorial uses GraphQL Yoga, but the practices are applicable to testing any GraphQL server.\n\n<Callout type=\"info\">\n\nRefer to [GraphQL Codegen - Yoga example](https://github.com/dotansimha/graphql-code-generator/tree/master/examples/yoga-tests) for a fully running example using [GraphQL Yoga](https://the-guild.dev/graphql/yoga-server).\n\n</Callout>\n\n## Installation\n\nInstall the following dependencies:\n\n```sh npm2yarn\nnpm i graphql-yoga\n```\n\nInstall the following development dependencies:\n\n```sh npm2yarn\nnpm i -D typescript ts-node @graphql-codegen/cli jest @babel/core @babel/preset-env @babel/preset-typescript babel-jest @graphql-typed-document-node/core\n```\n\n## Setup\n\nFirst, create the following files with the boilerplate project set up.\n\n```json filename=\"./tsconfig.json\"\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"module\": \"Node16\",\n    \"outDir\": \"dist\"\n  },\n  \"include\": [\"src/**/*\"]\n}\n```\n\n```js filename=\"./babel.config.js\"\nmodule.exports = {\n  presets: [\n    ['@babel/preset-env', { targets: { node: process.versions.node.split('.')[0] } }],\n    '@babel/preset-typescript'\n  ]\n}\n```\n\n```js filename=\"./jest.config.js\"\nmodule.exports = {\n  transform: { '^.+\\\\.ts': 'babel-jest' }\n}\n```\n\nNext, create the `codegen.ts` file.\n\n```ts filename=\"./codegen.ts\"\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { type CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: './src/yoga.ts',\n  documents: ['src/**/*.ts'],\n  generates: {\n    './src/gql/': {\n      preset: 'client-preset'\n    }\n  }\n}\n\nexport default config\n```\n\nUp next, create a simple GraphQL Yoga server with a `Query` and `Mutation` root type.\n\n```ts filename=\"./src/yoga.ts\"\nimport { createSchema, createYoga } from 'graphql-yoga'\n\nconst schema = createSchema({\n  typeDefs: /* GraphQL */ `\n    type Query {\n      hello: String!\n    }\n\n    type Mutation {\n      echo(message: String!): String!\n    }\n  `,\n  resolvers: {\n    Query: {\n      hello: () => 'Hello world!'\n    },\n    Mutation: {\n      echo: (_, args) => args.message\n    }\n  }\n})\n\nexport const yoga = createYoga({\n  schema\n})\n```\n\n## Writing tests\n\nNow that we have a GraphQL Yoga server, we can write some tests.\n\n```ts filename=\"./src/yoga.spec.ts\"\nimport type { TypedDocumentNode } from '@graphql-typed-document-node/core'\nimport { type ExecutionResult, print } from 'graphql'\nimport { graphql } from './gql'\nimport { yoga } from './yoga'\n\nfunction executeOperation<TResult, TVariables>(\n  operation: TypedDocumentNode<TResult, TVariables>,\n  ...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]\n): Promise<ExecutionResult<TResult>> {\n  return Promise.resolve(\n    yoga.fetch('http://yoga/graphql', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        Accept: 'application/json'\n      },\n      body: JSON.stringify({\n        query: print(operation),\n        variables: variables ?? undefined\n      })\n    })\n  ).then(response => response.json())\n}\n\ndescribe('Yoga Tests', () => {\n  it('execute query operation', async () => {\n    const HelloQuery = graphql(/* GraphQL */ `\n      query HelloQuery {\n        hello\n      }\n    `)\n\n    const result = await executeOperation(HelloQuery)\n\n    expect(result.data?.hello).toEqual('Hello world!')\n  })\n\n  it('execute mutation operation', async () => {\n    const EchoMutation = graphql(/* GraphQL */ `\n      mutation EchoMutation($message: String!) {\n        echo(message: $message)\n      }\n    `)\n\n    const result = await executeOperation(EchoMutation, {\n      message: 'Ohayoo!'\n    })\n\n    expect(result.data?.echo).toEqual('Ohayoo!')\n  })\n\n  it('execute mutation operation (variant)', async () => {\n    const EchoMutation = graphql(/* GraphQL */ `\n      mutation EchoMutation($message: String!) {\n        echo(message: $message)\n      }\n    `)\n\n    const result = await executeOperation(EchoMutation, {\n      message: 'Konbanwa'\n    })\n\n    expect(result.data?.echo).toEqual('Konbanwa')\n  })\n})\n```\n\nWe can then generate the types for the referenced GraphQL operation using the GraphQL Code Generator CLI.\n\n```sh\nnpx graphql-codegen\n```\n\nAs the command was run, the TypeScript errors within the test file should have disappeared.\n\nFor convenience and writing tests it is recommended to run GraphQL Code Generator in watch mode.\n\n```sh\nnpx graphql-codegen --watch\n```\n\nYou can then run the tests using `npx jest` (or `npx jest --watch`) for watch mode.\n\n```ts filename=\"Typed Execution Result helper function\"\nimport type { TypedDocumentNode } from '@graphql-typed-document-node/core'\nimport { type ExecutionResult, print } from 'graphql'\nimport { graphql } from './gql'\n\nfunction executeOperation<TResult, TVariables>(\n  operation: TypedDocumentNode<TResult, TVariables>,\n  ...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]\n): Promise<ExecutionResult<TResult>> {\n  return Promise.resolve(\n    yoga.fetch('http://yoga/graphql', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        Accept: 'application/json'\n      },\n      body: JSON.stringify({\n        query: print(operation),\n        variables: variables ?? undefined\n      })\n    })\n  ).then(response => response.json())\n}\n```\n\nThe `executeOperation` function is a helper function that executes a GraphQL operation and returns a typed result.\nIt can be used in any context, whether it is tests or server-to-server communication.\n\n## Conclusion\n\nGraphQL Code Generator can enhance the developer experience by generating GraphQL operation types for unit and integration tests .\n"
  },
  {
    "path": "website/src/pages/docs/guides/flutter-freezed.mdx",
    "content": "---\ndescription: Boost 🚀 your development of Dart/Flutter apps using a GraphQL API by generating models directly from your GraphQL Schema.\n---\n\n# Guide: Dart/Flutter\n\nBoost 🚀 your development of Dart/Flutter apps using a GraphQL API by generating models directly from your GraphQL Schema.\n\nCurrently, this plugin only generates [Freezed](https://pub.dev/packages/freezed) models but work is ongoing to make it way easier to work with GraphQL by scaffolding an entire GraphQL client with support for Queries, Mutations and Subscriptions taking huge inspiration from [KitQL](https://www.kitql.dev/)\n\n## TL;DR\n\nThe `flutter-freezed` plugin generates [Freezed](https://pub.dev/packages/freezed) models from a GraphQL Schema.\n\n## Motivation\n\n> Dart is awesome, but defining a \"model\" can be tedious. We may have to:\n>\n> - define a constructor + the properties\n> - override toString, operator ==, hashCode\n> - implement a copyWith method to clone the object\n> - handling de/serialization\n>\n> On top of that, Dart is also missing features such as union types and pattern-matching.\n>\n> Implementing all of this can take hundreds of lines, which are error-prone and the readability of your model significantly.\n>\n> Freezed tries to fix that by implementing most of this for you, allowing you to focus on the definition of your model.\n> https://pub.dev/packages/freezed\n\nFortunately enough, GraphQL is strongly typed, and so is Dart.\nSave yourself from implementing a model to match your strongly typed GraphQL types, and let [Freezed](https://pub.dev/packages/freezed) handle the work while you chill with this `flutter-freezed`plugin\n\n## Features\n\nCurrently, the plugin supports the following features\n\n- [x] Generate Freezed classes for ObjectTypes\n- [x] Generate Freezed classes for InputTypes\n- [x] Support for EnumsTypes\n- [x] Support for custom ScalarTypes\n- [x] Support freeze documentation of class & properties from GraphQL SDL description comments\n- [x] Ignore/don't generate freezed classes for certain ObjectTypes\n- [x] Support directives\n- [x] Support deprecation annotation\n- [x] ~~Support for InterfaceTypes~~\n- [x] Support for UnionTypes [union/sealed classes](https://pub.dev/packages/freezed#unionssealed-classes)\n- [x] Merge InputTypes with ObjectType as union/sealed class [union/sealed classes](https://pub.dev/packages/freezed#unionssealed-classes)\n\n## TODO:\n\n- [ ] Support Queries, Mutations, and Subscription: make it way easier to use GraphQL in flutter without going through any complex process. Inspired by [KitQL](https://www.kitql.dev/)\n\n## Demo\n\nGiven the following GraphQL schema:\n\n```graphql\ninput RequestOTPInput {\n  email: String\n  phoneNumber: String\n}\n\ninput VerifyOTPInput {\n  email: String\n  phoneNumber: String\n  otpCode: String!\n}\n\nunion AuthWithOTPInput = RequestOTPInput | VerifyOTPInput\n```\n\nUsing the following config:\n\n```yaml\nschema: demo-schema.graphql\ngenerates:\n  ./lib/data/models/app_models.dart:\n    plugins:\n      - flutter-freezed\n```\n\nThis is the generated output:\n\n```dart\nimport 'package:freezed_annotation/freezed_annotation.dart';\nimport 'package:flutter/foundation.dart';\n\npart 'app_models.freezed.dart';\npart 'app_models.g.dart';\n\n@unfreezed\nclass RequestOtpInput with _$RequestOtpInput {\n  const RequestOtpInput._();\n\n  const factory RequestOtpInput({\n    String? email,\n    String? phoneNumber,\n  }) = _RequestOtpInput;\n\n  factory RequestOtpInput.fromJson(Map<String, dynamic> json) => _$RequestOtpInputFromJson(json);\n}\n\n@unfreezed\nclass VerifyOtpInput with _$VerifyOtpInput {\n  const VerifyOtpInput._();\n\n  const factory VerifyOtpInput({\n    String? email,\n    String? phoneNumber,\n    required String otpCode,\n  }) = _VerifyOtpInput;\n\n  factory VerifyOtpInput.fromJson(Map<String, dynamic> json) => _$VerifyOtpInputFromJson(json);\n}\n\n@freezed\nclass AuthWithOtpInput with _$AuthWithOtpInput {\n  const AuthWithOtpInput._();\n\n  const factory AuthWithOtpInput.requestOtpInput({\n    String? email,\n    String? phoneNumber,\n  }) = RequestOtpInput;\n\n  const factory AuthWithOtpInput.verifyOtpInput({\n    String? email,\n    String? phoneNumber,\n    required String otpCode,\n  }) = VerifyOtpInput;\n\n  factory AuthWithOtpInput.fromJson(Map<String, dynamic> json) => _$AuthWithOtpInputFromJson(json);\n}\n```\n\n## Getting started\n\nTo get started, make sure you have the following installed:\n\n- Node.js (10 or later)\n- NPM or Yarn\n\nFollow the [Installation Guide](/docs/getting-started/installation) for more details on getting started with GraphQL Code Generator\n\nInside your Flutter project root folder:\n\n1. Install [freezed](https://pub.dev/packages/freezed#install) in your flutter project\n\n2. Install [json_serializable](https://pub.dev/packages/json_serializable) in your flutter project\n\n3. Download your GraphQL schema in graphql format and place it at the root of your Flutter project using a tool like [get-graphql-schema](https://www.npmjs.com/package/get-graphql-schema)\n\n```sh\nnpm install -g get-graphql-schema\n\nget-graphql-schema https://your-graphql-endpoint > schema.graphql\n```\n\n4. Add the following to the `.gitignore` file:\n\n```\n# graphql-code-generator related\nnode_modules/\n```\n\n5. Create a node project with `npm init -y` and add a script to run the generator:\n\n```json\n{\n  \"scripts\": {\n    \"generate\": \"graphql-codegen\"\n  }\n}\n```\n\n6. Install the `graphql-code-generator` and the `flutter-freezed` plugin\n\n```sh npm2yarn\nnpm i graphql\nnpm i -D typescript @graphql-codegen/cli @graphql-codegen/flutter-freezed\n```\n\n7. Create a `codegen.ts` file at the root of the Flutter project with the following:\n\n```ts filename='codegen.ts'\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  generates: {\n    'lib/data/models/app_models.dart': {\n      plugins: {\n        'flutter-freezed': {}\n      }\n    }\n  }\n}\nexport default config\n```\n\n8. Generate your freezed models with the following command and chill 🍻:\n\n```bash\nnpm run generate\n```\n\n## Configuring the plugin\n\nTo configure the plugin, you need to first understand how to use Patterns\nto configure specific GraphQL Types and its fields and also apply\na config option globally to all GraphQL Types and fields.\n\nThis plugin is heavily documented so please take a look into the `tests` directory to learn more.\n\nAlso, understanding how the generated output is identified helps in granular configuration\n\nUsing the schema below:\n\n```graphql filename='schema.graphql'\nenum Episode {\n  NEWHOPE\n  EMPIRE\n  JEDI\n}\n\ntype Actor {\n  name: String!\n  appearsIn: [Episode]!\n}\n\ntype Starship {\n  id: ID!\n  name: String!\n  length: Float\n}\n\ninterface Character {\n  id: ID!\n  name: String!\n  friends: [Character]\n  appearsIn: [Episode]!\n}\n\ntype Human implements Character {\n  id: ID!\n  name: String!\n  friends: [Actor]\n  appearsIn: [Episode]!\n  totalCredits: Int\n}\n\ntype Droid implements Character {\n  id: ID!\n  name: String!\n  friends: [Actor]\n  appearsIn: [Episode]!\n  primaryFunction: String\n}\n\nunion SearchResult = Human | Droid | Starship\n```\n\nWith the following configuration:\n\n```ts filename='codegen.ts'\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'lib/data/models/app_models.dart': {\n      plugins: {\n        'flutter-freezed': Config.create({\n          defaultValues: [\n            [FieldNamePattern.forFieldNamesOfAllTypeNames([friends]), '[]', ['union_factory_parameter']],\n            [FieldNamePattern.forFieldNamesOfAllTypeNames([appearsIn]), '[]', ['default_factory_parameter']]\n          ],\n          deprecated: [\n            [FieldNamePattern.forAllFieldNamesOfTypeName([Actor]), ['default_factory_parameter']],\n            [TypeNamePattern.forTypeNames(SearchResultDroid), ['union_factory']]\n          ],\n          final: [[FieldNamePattern.forFieldNamesOfAllTypeNames([id, name]), ['parameter']]],\n          mergeTypes: {\n            Human: ['Actor'],\n            Actor: ['Human']\n          },\n          immutable: TypeNamePattern.forAllTypeNamesExcludeTypeNames([Actor, Human])\n        })\n      }\n    }\n  }\n}\n```\n\nGenerates output below:\n\n```dart\nimport 'package:freezed_annotation/freezed_annotation.dart';\nimport 'package:flutter/foundation.dart';\n\npart 'app_models.freezed.dart';\npart 'app_models.g.dart';\n\nenum Episode { // @1\n  @JsonKey(name: 'NEWHOPE')\n  newhope // @1.i\n  @JsonKey(name: 'EMPIRE')\n  empire // @1.ii\n  @JsonKey(name: 'JEDI')\n  jedi // @1.iii\n}\n\n@unfreezed\nclass Actor with _$Actor { // @2\n  const Actor._();\n\n  factory Actor({ // @2.a\n    @deprecated\n    required final String name, // @2.a.i\n    @deprecated\n    @Default([])\n    required List<Episode?> appearsIn, // @2.a.ii\n  }) = _Actor;\n\n  const factory Actor.human({ // @2.b\n    required final String id, // @2.b.i\n    required final String name, // @2.b.ii\n    List<Actor?>? friends, // @2.b.iii\n    required List<Episode?> appearsIn, // @2.b.iv\n    int? totalCredits, // @2.b.v\n  }) = Human; // @2.b.1\n\n  factory Actor.fromJson(Map<String, dynamic> json) => _$ActorFromJson(json);\n}\n\n@freezed\nclass Starship with _$Starship { // @3\n  const Starship._();\n\n  const factory Starship({ // @3.a\n    required final String id, // @3.a.i\n    required final String name, // @3.a.ii\n    double? length, // @3.a.iii\n  }) = _Starship;\n\n  factory Starship.fromJson(Map<String, dynamic> json) => _$StarshipFromJson(json);\n}\n\n@unfreezed\nclass Human with _$Human { // @4\n  const Human._();\n\n  factory Human({ // @4.a\n    required final String id, // @4.a.i\n    required final String name, // @4.a.ii\n    List<Actor?>? friends, // @4.a.iii\n    @Default([])\n    required List<Episode?> appearsIn, // @4.a.iv\n    int? totalCredits, // @4.a.v\n  }) = _Human;\n\n  const factory Human.actor({ // @4.b\n    required final String name, // @4.b.i\n    required List<Episode?> appearsIn, // @4.b.ii\n  }) = Actor; // @4.b.1\n\n  factory Human.fromJson(Map<String, dynamic> json) => _$HumanFromJson(json);\n}\n\n@freezed\nclass Droid with _$Droid { // @5\n  const Droid._();\n\n  const factory Droid({, // @5.a\n    required final String id, // @5.a.i\n    required final String name, // @5.a.ii\n    List<Actor?>? friends, // @5.a.iii\n    @Default([])\n    required List<Episode?> appearsIn, // @5.a.iv\n    String? primaryFunction, // @5.a.v\n  }) = _Droid;\n\n  factory Droid.fromJson(Map<String, dynamic> json) => _$DroidFromJson(json);\n}\n\n@freezed\nclass SearchResult with _$SearchResult { // @6\n  const SearchResult._(); // @6.1\n\n  const factory SearchResult.human({ // @6.a\n    required final String id, // @6.a.i\n    required final String name, // @6.a.ii\n    @Default([])\n    List<Actor?>? friends, // @6.a.iii\n    required List<Episode?> appearsIn, // @6.a.iv\n    int? totalCredits,// @6.a.v\n  }) = Human; // @6.a.1\n\n  @deprecated\n  const factory SearchResult.droid({ // @6.b\n    required final String id, // @6.b.i\n    required final String name, // @6.b.ii\n    @Default([])\n    List<Actor?>? friends, // @6.b.iii\n    required List<Episode?> appearsIn, // @6.b.iv\n    String? primaryFunction, // @6.b.v\n  }) = Droid; // @6.a.2\n\n  const factory SearchResult.starship({ // @6.c\n    required final String id, // @6.c.i\n    required final String name, // @6.c.ii\n    double? length, // @6.c.iii\n  }) = Starship; // @6.a.3\n\n  factory SearchResult.fromJson(Map<String, dynamic> json) => _$SearchResultFromJson(json);\n}\n```\n\n### Identifying the building blocks\n\nThe generated output consists of several blocks enabling you to specify a configuration\ntargetting a specific block.\n\n> All `APPLIES_ON_*` values are exported from the `plugin-config` module of this package.\n\n`@1`: is the `enum` block. Use `APPLIES_ON_ENUM` to configure this block.\n\n`@1.i` to `@1.iii` makes up the `enum_value` block. Use `APPLIES_ON_ENUM_VALUE` to configure this block\n\n`@2` to `@6` are the `class` blocks. Use `APPLIES_ON_CLASS ` to configure these blocks.\n\nThere are 2 types of factory constructors in each class:\n\n1. The Default Factory Constructor: Created automatically for each GraphQL Type.\n   Use `APPLIES_ON_DEFAULT_FACTORY` to configure these blocks.\n   `@2.a` to `@5.a` are the default factory constructors.\n\n2. The Named Factory: There are 2 types of named factory constructors:\n\n- Merged Factory Constructors: created manually by merging two different GraphQL Types in the config.\n  See `config.mergeTypes` above. Use `APPLIES_ON_MERGED_FACTORY` to configure these block\n  `@2.b` and `@4.b` are the merged factory constructors.\n\n- Union Factory Constructors: created automatically from a GraphQL Union Type.\n  Each GraphQL Type in the Union is generated as a named factory in the class of the GraphQL Union Type.\n  Use `APPLIES_ON_UNION_FACTORY` to configure these factories\n  `@6.a`, `@6.b` and `@6.c` are the merged factory constructors.\n\nUse `APPLIES_ON_NAMED_FACTORY ` to configure both merged and union factories.\n\nUse `APPLIES_ON_FACTORY ` to configure all factories.\n\n> Each `class` block has exactly one default factory constructor and maybe one or more named factory constructors.\n\nThe fields of the GraphQL Type are generated as parameters to the factory constructors:\n\nThere are 3 types of parameters are generated depending on the type of factory constructors:\n\n1. Parameters found in the default_factory are called `default_factory_parameter`.\n   Use `APPLIES_ON_DEFAULT_FACTORY_PARAMETERS` to configure these parameters\n   The following are all default factory parameters:\n\n- `@2.a.i` to `@2.a.iii`\n- `@3.a.i` to `@3.a.iii`\n- `@4.a.i` to `@4.a.v`\n- `@5.a.i` to `@5.a.v`\n\n2. Parameters found on the merged_factory are called `merged_factory_parameter`.\n   Use `APPLIES_ON_MERGED_FACTORY_PARAMETERS` to configure these parameters\n   The following are all merged factory parameters:\n\n- `@2.b.i` to `@2.b.v`\n- `@4.b.i` and `@4.b.ii`\n\n3. Parameters found in the union_factory are called `union_factory_parameter`.\n   Use `APPLIES_ON_UNION_FACTORY_PARAMETERS` to configure these parameters.\n   The following are all merged factory parameters:\n\n- `@6.a.i` to `@6.a.v`\n- `@6.b.i` to `@6.b.v`\n- `@6.c.i` to `@6.c.iii`\n\nUse `APPLIES_ON_NAMED_FACTORY_PARAMETERS ` to configure both merged and union factor parameters\n\nUse `APPLIES_ON_PARAMETERS ` to configure all parameters\n\n## Patterns\n\nA compact string of patterns used in the config for granular configuration for each Graphql Type and/or its fieldNames\n\nThe string can contain more than one pattern, each pattern ends with a semi-colon (`;`).\n\nA dot (`.`) separates the TypeName from the FieldNames in each pattern\n\nTo apply an option to all Graphql Types or fields, use the allTypeNames (`@*TypeNames`) and allFieldNames (`@*FieldNames`) tokens respectively\n\nWherever you use the allTypeNames and the allFieldNames, know very well that you can make some exceptions. After all, to every rule, there is an exception\n\nA **square bracket** (`[]`) is used to specify what should be included and a **negated square bracket** (`-[]`) is used to specify what should be excluded\n\nManually typing out a pattern may be prone to typos and invalid patterns therefore the [`TypeFieldName`]() class exports some builder methods which you can use in your plugin config file.\n\nThe patterns themselves are readable and easy to manually type it out in the config but its RECOMMENDED that you the builder methods. However, along with builder methods, the [`TypeFieldName`]() class also exports the Regular Expression(RegExp) used to test the patterns for a match as well as matcher methods. You can use these to find out if you manually typed out patterns would work with this plugin.\n\n## Usage for Graphql Types\n\n### Configuring specific Graphql Types\n\nYou can explicitly list out the names of the Graphql Types that you want to configure.\n\n```ts\nconst pattern = Pattern.forTypeNames([Droid, Starship])\nconsole.log(pattern) // \"Droid;Starship;\"\n```\n\n### Configuring all Graphql Types\n\nInstead of manually listing out **all** the types in the Graphql Schema, use the allTypeNames (`@*TypeNames`) to configure all the Graphql Types in the Schema\n\n```ts\nconst pattern = Pattern.forAllTypeNames()\nconsole.log(pattern) // \"@*TypeNames;\"\n```\n\n### Configuring all Graphql Types except those specified in the exclusion list of TypeNames\n\nYou can configure all GraphQL Types except those specified.\n\nThe example below configures all the Graphql Types in the Schema except the `Droid` and `Starship` Graphql Types\n\n```ts\nconst pattern = Pattern.forAllTypeNamesExcludeTypeNames([Droid, Starship])\nconsole.log(pattern) // \"@*TypeNames-[Droid,Starship];\"\n```\n\n## Usage for fields of Graphql Types\n\n### Configuring specific fields of a specific Graphql Type\n\nYou can explicitly list out the names of the fields of the Graphql Types that you want to configure.\n\n```ts\nconst pattern = Pattern.forFieldNamesOfTypeName([\n  [Droid, [id, name, friends]],\n  [Human, [id, name, title]],\n  [Starship, [name, length]]\n])\nconsole.log(pattern) // \"Droid.[id,name,friends];Human.[id,name,title];Starship.[name,length];\"\n```\n\n### Configuring all fields of a specific Graphql Type\n\nInstead of manually listing out **all the fields** of the Graphql Type, use the allFieldNames (`@*FieldNames`) to configure all the fields of the Graphql Type.\n\n```ts\nconst pattern = Pattern.forAllFieldNamesOfTypeName([Droid, Movie])\nconsole.log(pattern) // \"Droid.@*FieldNames;Movie.@*FieldNames;\"\n```\n\n### Configuring all fields except those specified in the exclusion list of FieldNames for a specific GraphQL Type\n\nIn the example below, the `id` and the `name` fields will be excluded from the configuration while all the remaining fields of the `Droid` Graphql Type will be configured\n\n```ts\nconst pattern = Pattern.forAllFieldNamesExcludeFieldNamesOfTypeName([\n  [Droid, [id, name, friends]],\n  [Human, [id, name, title]],\n  [Starship, [name, length]]\n])\nconsole.log(pattern) // \"Droid.@*FieldNames-[id,name,friends];Human.@*FieldNames-[id,name,title];Starship.@*FieldNames-[name,length];\"\n```\n\n### Configuring specific fields of all Graphql Types\n\nWhen you use the allTypeNames (`@*TypeNames`), you can specify the fields to be configured. If field name that doesn't exists for a given Graphql Type, it would simply be ignored.\n\nThe example below configures the `id` and `name` fields of all Graphql Types\n\n```ts\nconst pattern = Pattern.forFieldNamesOfAllTypeNames([id, name, friends])\nconsole.log(pattern) // \"@*TypeNames.[id,name,friends];\"\n```\n\n### Configuring all fields of all Graphql Types\n\nUsing the allFieldNames (`@*FieldNames`) on the allTypeNames (`@*TypeNames`), you can configure all fields of all the Graphql Types in the Schema\n\n```ts\nconst pattern = Pattern.forAllFieldNamesOfAllTypeNames()\nconsole.log(pattern) // \"@*TypeNames.@*FieldNames;\"\n```\n\n### Configuring all fields except those specified in the exclusion list of FieldNames for all GraphQL Types\n\nAs always, you can make some exception when you use the allFieldNames (`@*FieldNames`) to except some fields from the configuration.\n\nIn the example below, the `id` and the `name` fields will be excluded from the configuration while all the remaining fields of all Graphql Type will be configured\n\n```ts\nconst pattern = Pattern.forAllFieldNamesExcludeFieldNamesOfAllTypeNames([id, name, friends])\nconsole.log(pattern) // \"@*TypeNames.@*FieldNames-[id,name,friends];\"\n```\n\n### Configuring specific fields of all GraphQL Types except those specified in the exclusion list of TypeNames\n\nIn the example below, the `id` and `name` fields will be configured for all the Graphql Types in the Schema except`Droid` and `Starship`\n\n```ts\nconst pattern = Pattern.forFieldNamesOfAllTypeNamesExcludeTypeNames([Droid, Human], [id, name, friends])\nconsole.log(pattern) // \"@*TypeNames-[Droid,Human].[id,name,friends];\"\n```\n\n### Configuring all fields of all GraphQL Types except those specified in the exclusion list of TypeNames\n\nIn the example below, all fields of all Graphql Types in the Schema except for the fields of `Droid` and `Starship` will be excluded from the configuration while all the remaining fields of all Graphql Type will be configured\n\n```ts\n * const pattern = Pattern.forAllFieldNamesOfAllTypeNamesExcludeTypeNames([Droid, Human]);\n * console.log(pattern); // \"@*TypeNames-[Droid,Human].@*FieldNames;\"\n```\n\n### Configuring all fields except those specified in the exclusion list of FieldNames of all GraphQL Types except those specified in the exclusion list of TypeNames\n\nIn the example below, the `id` and the `name` fields of `Droid` or `Starship` will be excluded from the configuration while all the **remaining fields** of all Graphql Types(including `Droid` and `Starship`) will be configured\n\n```ts\nconst pattern = Pattern.forAllFieldNamesExcludeFieldNamesOfAllTypeNamesExcludeTypeNames(\n  [Droid, Human],\n  [id, name, friends]\n)\nconsole.log(pattern) // \"@*TypeNames-[Droid,Human].@*FieldNames-[id,name,friends];\"\n```\n\n## PRs are welcomed\n\nThis started as a plugin but eventually we hope to make it way easier to use GraphQL in your Flutter apps.\n\nFor more advanced configuration, please refer to the [plugin documentation](/plugins/dart/flutter-freezed).\n\nFor a different organization of the generated files, please refer to the [\"Generated files colocation\"](/docs/advanced/generated-files-colocation) page.\n"
  },
  {
    "path": "website/src/pages/docs/guides/further-reading.mdx",
    "content": "---\ndescription: GraphQL Code Generator is a tool for generating code from your GraphQL schema and operations. It's a great way to get type-safety and auto-completion in your code.\n---\n\n# Further Reading\n\nOur guides helps you getting started with the most popular frameworks, GraphQL clients and servers.\n\nHowever, many topics such as Prisma integration or Fragment-based component architecture, deserve to be covered.\n\nYou will find below a curated list of article and documentation links that will help you to get the best of GraphQL Code Generator.\n\n## For front-end applications\n\n### Leverage GraphQL Fragments\n\nAs stated in our [React and Vue guide](/docs/guides/react-vue), we recommend to leverage Fragments to properly declare your UI-components data dependencies.\n\nTo get more information on this topic, we highly recommend to read our article covering this topic in depth: [\"Unleash the power of Fragments with GraphQL Codegen\"](https://www.the-guild.dev/blog/unleash-the-power-of-fragments-with-graphql-codegen).\n\n### Angular projects\n\n- [Using Apollo GraphQL with Angular in an Nx Workspace](https://blog.nrwl.io/using-apollo-graphql-with-angular-in-an-nx-workspace-9ad0155c1914?gi=603641d4b51a) by [Philip Fulcher](https://medium.com/@philipjfulcher?source=post_page-----9ad0155c1914-----------------------------------)\n\n<br />\n\n<br />\n\n## For GraphQL servers\n\n- How to get types to work with Prisma: [the-guild.dev/blog/graphql-code-generator-and-prisma](https://www.the-guild.dev/blog/graphql-code-generator-and-prisma)\n- How to properly configure Models types for your resolvers: [the-guild.dev/blog/better-type-safety-for-resolvers-with-graphql-codegen#use-your-model-types](https://www.the-guild.dev/blog/better-type-safety-for-resolvers-with-graphql-codegen#use-your-model-types)\n- The many ways to implement error handling in GraphQL and its impact on types generation: [the-guild.dev/blog/graphql-error-handling-with-fp](https://the-guild.dev/blog/graphql-error-handling-with-fp)\n- [Working with GraphQL Code Generator and GraphCMS](https://graphcms.com/blog/working-with-graphql-code-generator-and-graphcms) by Jamie Barton\n- [GraphQL Code Generator for WPGraphQL](https://developers.wpengine.com/blog/graphql-code-generator-for-wpgraphql) by Kellen Mace\n- [Gatsby and GraphQL Code Generator - A Perfect Match](https://talohana.com/blog/gatsby-graphql-code-generator) by [Tal Ohana](https://talohana.com)\n\n<br />\n\n<br />\n\n## Stay up-to-date with GraphQL\n\n- [Subscribe to The Guild monthly newsletter](https://www.getrevue.co/profile/TheGuild) to ge the last best practices and all of our libraries updates\n- [graphql.wtf](https://graphql.wtf) by [Jamie Barton](https://twitter.com/notrab) is a set of video tutorials around GraphQL\n- [GraphQL Weekly](https://www.graphqlweekly.com/) newsletter\n"
  },
  {
    "path": "website/src/pages/docs/guides/graphql-modules.mdx",
    "content": "---\ndescription: GraphQL Code Generator's `@graphql-codegen/graphql-modules-preset` plugin helps to generate resolvers type for each module of a GraphQL Modules GraphQL API.\n---\n\n# Guide: GraphQL Modules\n\nGraphQL Code Generator's `@graphql-codegen/graphql-modules-preset` plugin helps to\ngenerate resolvers type for each module of a GraphQL Modules GraphQL API.\n\nGiven the following GraphQL API structure using GraphQL Modules:\n\n```\n- src/\n  - modules/\n    - user/\n      - resolvers.ts\n      - typedefs/\n        - user.graphql\n    - product/\n      - resolvers.ts\n      - typedefs/\n        - product.graphql\n```\n\nJust a few configuration steps are required to get the resolvers types generated:\n\n### Install\n\n```sh npm2yarn\nnpm i -D @graphql-codegen/graphql-modules-preset @graphql-codegen/typescript-resolvers @graphql-codegen/typescript\n```\n\n### Configure the plugin\n\nCreate or update your `codegen.ts` file as follows:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: './src/modules/**/typedefs/*.graphql',\n  generates: {\n    './server/src/modules/': {\n      preset: 'graphql-modules',\n      presetConfig: {\n        baseTypesPath: '../generated-types/graphql.ts',\n        filename: 'generated-types/module-types.ts'\n      },\n      plugins: [\n        {\n          add: {\n            content: '/* eslint-disable */'\n          }\n        },\n        'typescript',\n        'typescript-resolvers'\n      ]\n    }\n  }\n}\nexport default config\n```\n\n### Run the codegen and update your code\n\nAssuming that, as recommended, your `package.json` has the following script:\n\n```json filename=\"package.json\"\n{\n  \"scripts\": {\n    \"generate\": \"graphql-codegen\"\n  }\n}\n```\n\nRunning the following generates the `graphql/generated.tsx` file.\n\n```sh npm2yarn\nnpm run generate\n```\n\nThe User module resolvers would be:\n\n```ts filename=\"src/modules/user/resolvers.ts\"\nimport { UsersModule } from './generated-types/module-types'\n\nexport const resolvers: UsersModule.Resolvers = {\n  // Here, you can implement only the types and fields defined in your module!\n}\n```\n\nA complete article, written by Arda Tanrikulu from The Guild, is available on our blog: [Writing a GraphQL TypeScript project w/ GraphQL-Modules and GraphQL-Code-Generator](https://the-guild.dev/blog/graphql-typescript-modules-codegen).\n\nFor more advanced configuration (models or context typing), please refer to the [plugin documentation](/plugins/graphql-modules-preset).\n"
  },
  {
    "path": "website/src/pages/docs/guides/graphql-server-apollo-yoga-with-server-preset.mdx",
    "content": "---\ndescription: GraphQL Code Generator's server preset, `@eddeee888/gcg-typescript-resolver-files`, helps GraphQL APIs work at any scale by enforcing best practices such as type-safety and schema module conventions.\n---\n\nimport { Callout, Tabs } from '@theguild/components'\n\n# Guide: GraphQL Yoga / Apollo Server with Server Preset\n\nGraphQL Code Generator's server preset, `@eddeee888/gcg-typescript-resolver-files`, helps GraphQL APIs work at any scale by enforcing best practices such as type-safety and schema module conventions.\n\n## Guide\n\nA GraphQL API such as GraphQL Yoga or Apollo Server is the central system where many teams develop their own features without blocking other teams. However, teams may have different standards and practices that can lead to friction. The server preset has features to help solve these issues:\n\n- **Type safety:** Resolvers are strictly generated and typed to eliminate the chance of unimplemented resolvers.\n- **Schema module conventions:** These conventions make ownership clear at domain and code levels to help teams focus.\n\n### Setup\n\n#### 1. Create Schema Modules\n\nThe server preset works best when the schema is split into smaller modules. This approach keeps each module small and maintainable. So, instead of one schema file, you can split it into smaller schema modules:\n\n```text\n├── src/\n│   ├── schema/\n│   │   ├── base/\n│   │   │   ├── schema.graphql\n│   │   ├── user/\n│   │   │   ├── schema.graphql\n│   │   ├── book/\n│   │   │   ├── schema.graphql\n```\n\nHere's the content of each schema module:\n\n```graphql\n# src/schema/base/schema.graphql\ntype Query\ntype Mutation\n\n# src/schema/user/schema.graphql\nextend type Query {\n  user(id: ID!): User\n}\ntype User {\n  id: ID!\n  fullName: String!\n  isAdmin: Boolean!\n}\n\n# src/schema/book/schema.graphql\nextend type Query {\n  book(id: ID!): Book\n}\nextend type Mutation {\n  markBookAsRead(id: ID!): Book!\n}\ntype Book {\n  id: ID!\n  isbn: String!\n}\n```\n\n#### 2. Install Server Preset\n\n```sh npm2yarn\nnpm i -D @graphql-codegen/cli @eddeee888/gcg-typescript-resolver-files\n```\n\n#### 3. Configure Codegen Config\n\nCreate or update your Codegen config as follows:\n\n<Tabs items={['codegen.ts','codegen.ts (GraphQL Yoga with File Uploads)','codegen.yml']}>\n\n<Tabs.Tab>\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\nimport { defineConfig } from '@eddeee888/gcg-typescript-resolver-files'\n\nconst config: CodegenConfig = {\n  schema: '**/schema.graphql',\n  generates: {\n    'src/schema': defineConfig()\n  }\n}\nexport default config\n```\n\n</Tabs.Tab>\n\n<Tabs.Tab>\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\nimport { defineConfig } from '@eddeee888/gcg-typescript-resolver-files'\n\nconst config: CodegenConfig = {\n  schema: '**/schema.graphql',\n  generates: {\n    'src/schema': defineConfig({\n      // The following config is designed to work with GraphQL Yoga's File uploads feature\n      // https://the-guild.dev/graphql/yoga-server/docs/features/file-uploads\n      scalarsOverrides: {\n        File: { type: 'File' }\n      },\n      resolverGeneration: {\n        query: '*',\n        mutation: '*',\n        subscription: '*',\n        scalar: '!*.File',\n        object: '*',\n        union: '',\n        interface: ''\n      }\n    })\n  }\n}\nexport default config\n```\n\n</Tabs.Tab>\n\n<Tabs.Tab>\n\n```yaml filename=\"codegen.yml\"\nschema: '**/schema.graphql'\ngenerates:\n  src/schema:\n    preset: '@eddeee888/gcg-typescript-resolver-files'\n    watchPattern: '**/*.mappers.ts'\n```\n\n</Tabs.Tab>\n\n</Tabs>\n\n<Callout type=\"info\">\n\n**Remove existing `@graphql-codegen/typescript` and `@graphql-codegen/typescript-resolvers` config**\n\nThe server preset comes with these plugins built-in with stricter defaults. You can override the defaults using the [typesPluginsConfig option](https://github.com/eddeee888/graphql-code-generator-plugins/tree/master/packages/typescript-resolver-files#config).\n\n</Callout>\n\n### Generate Files\n\nNow, run codegen:\n\n```sh\nnpx graphql-codegen\n```\n\nThis results in the following structure:\n\n```\n├── src/\n│   ├── schema/\n│   │   ├── base/\n│   │   │   ├── schema.graphql\n│   │   ├── user/\n│   │   │   ├── resolvers/\n│   │   │   │   ├── Query/\n│   │   │   │   │   ├── user.ts            # Generated, changes not overwritten by codegen\n│   │   │   │   ├── User.ts                # Generated, changes not overwritten by codegen\n│   │   │   ├── schema.graphql\n│   │   ├── book/\n│   │   │   ├── resolvers/\n│   │   │   │   ├── Query/\n│   │   │   │   │   ├── book.ts            # Generated, changes not overwritten by codegen\n│   │   │   │   ├── Mutation/\n│   │   │   │   │   ├── markBookAsRead.ts  # Generated, changes not overwritten by codegen\n│   │   │   │   ├── Book.ts                # Generated, changes not overwritten by codegen\n│   │   │   ├── schema.graphql\n│   │   ├── resolvers.generated.ts         # Entirely generated by codegen\n│   │   ├── typesDefs.generated.ts         # Entirely generated by codegen\n│   │   ├── types.generated.ts             # Entirely generated by codegen\n```\n\n#### Generated Files Overview\n\n- `types.generated.ts`: TypeScript types generated by `@graphql-codegen/typescript` and `@graphql-codegen/typescript-resolvers`\n- `typeDefs.generated.ts`: Static TypeScript Schema AST to be used by the server\n- `user/resolvers/Query/user.ts`, `book/resolvers/Query/book.ts`, `book/resolvers/Mutation/markBookAsRead.ts`: Typed operation resolvers of each module\n- `user/resolvers/User.ts`, `book/resolvers/Book.ts`: Typed object type resolvers of each module\n- `resolvers.generated.ts`: Resolver map that contains all generated operation and object type resolvers\n\n#### Integration With GraphQL API\n\nWe can use generated files in GraphQL API implementation:\n\n<Tabs items={['GraphQL Yoga','Apollo Server']}>\n\n<Tabs.Tab>\n\n```ts filename=\"src/server.ts\"\nimport { createYoga, createSchema } from 'graphql-yoga'\nimport { createServer } from 'http'\nimport { typeDefs } from './schema/typeDefs.generated'\nimport { resolvers } from './schema/resolvers.generated'\n\nconst yoga = createYoga({ schema: createSchema({ typeDefs, resolvers }) })\nconst server = createServer(yoga)\nserver.listen(3000)\n```\n\n</Tabs.Tab>\n\n<Tabs.Tab>\n\n```ts filename=\"src/server.ts\"\nimport { ApolloServer } from 'apollo-server'\nimport { typeDefs } from './schema/typeDefs.generated'\nimport { resolvers } from './schema/resolvers.generated'\n\nconst server = new ApolloServer({ typeDefs, resolvers })\n\n// The `listen` method launches a web server\nserver.listen().then(({ url }) => {\n  console.log(`🚀 Server ready at ${url}`)\n})\n```\n\n</Tabs.Tab>\n\n</Tabs>\n\n#### Implementing Resolvers\n\nOperation resolvers are generated like this example:\n\n```ts filename=\"src/schema/user/resolvers/Query/user.ts\"\nimport type { QueryResolvers } from './../../../types.generated'\nexport const user: NonNullable<QueryResolvers['user']> = async (_parent, _arg, _ctx) => {\n  /* Implement Query.user resolver logic here */\n}\n```\n\n<Callout type=\"info\">\n\n**Generated operation resolvers always fail TypeScript check without implementation.**\n\nThis is intentional because it eliminates unimplemented resolvers at runtime.\n\n</Callout>\n\nObject type resolvers are generated like this example:\n\n```ts filename=\"src/schema/user/resolvers/User.ts\"\nimport type { UserResolvers } from './../../types.generated'\nexport const User: UserResolvers = {\n  /* Implement User resolver logic here */\n}\n```\n\nAll operation and object type resolvers are automatically put into the generated resolver map:\n\n```ts filename=\"src/schema/resolvers.generated.ts\" {6,7,11,17}\n/* This file was automatically generated. DO NOT UPDATE MANUALLY. */\nimport type { Resolvers } from './types.generated'\nimport { book as Query_book } from './book/resolvers/Query/book'\nimport { markBookAsRead as Mutation_markBookAsRead } from './book/resolvers/Mutation/markBookAsRead'\nimport { Book } from './book/resolvers/Book'\nimport { user as Query_user } from './user/resolvers/Query/user'\nimport { User } from './user/resolvers/User'\nexport const resolvers: Resolvers = {\n  Query: {\n    book: Query_book,\n    user: Query_user\n  },\n  Mutation: {\n    markBookAsRead: Mutation_markBookAsRead\n  },\n\n  Book: Book,\n  User: User\n}\n```\n\nThe server preset handles all resolver types and imports. So, you only need to implement your resolver logic.\n\n### Conventions to Support Schema Modules\n\n<Callout type=\"info\">\n\n**The server preset has module-centric conventions**\n\nThis means instead of updating the `codegen.ts` config file, you make changes in each module. This keeps the GraphQL API maintainable at any scale.\n\nRead more about this concept on our blog: [Scalable APIs with GraphQL Server Codegen Preset](https://the-guild.dev/blog/scalable-apis-with-graphql-server-codegen-preset)\n\n</Callout>\n\n<Callout type=\"info\">\n\n**All conventions are customizable**\n\nCheck out the [documentation](https://github.com/eddeee888/graphql-code-generator-plugins/tree/master/packages/typescript-resolver-files#config) for more options.\n\n</Callout>\n\n#### Adding Custom GraphQL Scalars\n\nGraphQL does not have a lot of scalars by default. Luckily, [graphql-scalars](https://github.com/Urigo/graphql-scalars) has an extensive list of scalars.\n\nThe server preset automatically uses scalar implementation from `graphql-scalars` if it finds a matching name.\n\nFirst, install `graphql-scalars`:\n\n```sh npm2yarn\nnpm i graphql-scalars\n```\n\nThen, add a scalar to your schema:\n\n```graphql filename=\"src/schema/base.graphql\" {4,5}\ntype Query\ntype Mutation\n\n# https://github.com/Urigo/graphql-scalars/blob/master/src/scalars/iso-date/DateTime.ts\nscalar DateTime\n```\n\nRunning codegen automatically imports the scalar implementation into the resolver map:\n\n```ts filename=\"src/schema/resolvers.generated.ts\" {7,19}\nimport type { Resolvers } from './types.generated'\nimport { book as Query_book } from './book/resolvers/Query/book'\nimport { markBookAsRead as Mutation_markBookAsRead } from './book/resolvers/Mutation/markBookAsRead'\nimport { Book } from './book/resolvers/Book'\nimport { user as Query_user } from './user/resolvers/Query/user'\nimport { User } from './user/resolvers/User'\nimport { DateTimeResolver } from 'graphql-scalars'\nexport const resolvers: Resolvers = {\n  Query: {\n    book: Query_book,\n    user: Query_user\n  },\n  Mutation: {\n    markBookAsRead: Mutation_markBookAsRead\n  },\n\n  Book: Book,\n  User: User,\n  DateTime: DateTimeResolver\n}\n```\n\nFurthermore, the type is updated to use the recommended type from `graphql-scalars`:\n\n```ts filename=\"src/schema/types.generated.ts\" {9}\n// ... other generated types\n\nexport type Scalars = {\n  ID: { input: string; output: string | number }\n  String: { input: string; output: string }\n  Boolean: { input: boolean; output: boolean }\n  Int: { input: number; output: number }\n  Float: { input: number; output: number }\n  DateTime: { input: Date | string; output: Date | string } // Type comes from graphql-scalars\n}\n\n// ... other generated types\n```\n\nThe type of any custom scalar is `any` by default. Without the server preset, you have to configure the `DateTime` type by manually updating `codegen.ts`.\n\n#### Adding Mappers To Chain Resolvers\n\nBy default, the generated types make resolvers return objects that match the schema types. However, this means we must handle all field mapping in the root-level resolvers.\n\nThis is where we can use [mappers](https://the-guild.dev/graphql/codegen/plugins/typescript/typescript-resolvers#use-your-model-types-mappers) to enable resolver chaining. When a mapper is used this way, it can be returned in one resolver, and become the `parent` argument in the next resolver in the chain.\n\nWith the server preset, you can add mappers by exporting interfaces or types with `Mapper` suffix from `*.mappers.ts` files in appropriate modules:\n\n```ts filename=\"src/schema/user/schema.mappers.ts\"\nexport interface UserMapper {\n  id: string\n  firstName: string\n  lastName: string\n  isAdmin: 'YES' | 'NO'\n}\n```\n\nRunning codegen again does a few things:\n\n1. automatically imports and uses this mapper in schema types\n\n```ts filename=\"src/schema/types.generated.ts\" {2,6,11}\n// ... other imports\nimport { UserMapper } from './user/schema.mappers'\n\nexport type ResolversTypes = {\n  // ... other types\n  User: ResolverTypeWrapper<UserMapper>\n}\n\nexport type ResolversParentTypes = {\n  // ... other types\n  User: UserMapper\n}\n```\n\n2. automatically compares schema type and mapper type to create required field resolvers\n\n```ts filename=\"src/schema/user/resolvers/User.ts\" {3-5,7-10}\nimport type { UserResolvers } from './../../types.generated'\nexport const User: UserResolvers = {\n  fullName: async (_parent, _arg, _ctx) => {\n    /* User.fullName resolver is required because User.fullName exists but UserMapper.fullName does not */\n  },\n\n  isAdmin: ({ isAdmin }, _arg, _ctx) => {\n    /* User.isAdmin resolver is required because User.isAdmin and UserMapper.isAdmin are not compatible */\n    return isAdmin\n  }\n}\n```\n\nYou can now update your resolvers to use the mapper interface:\n\n```ts\n// src/schema/user/resolvers/Query/user.ts\nimport type { QueryResolvers } from './../../../types.generated'\nexport const user: NonNullable<QueryResolvers['user']> = async (_parent, _arg, _ctx) => {\n  return { id: '001', firstName: 'Bart', lastName: 'Simpson', isAdmin: 'YES' }\n}\n\n// src/schema/user/resolvers/User.ts\nimport type { UserResolvers } from './../../types.generated'\nexport const User: UserResolvers = {\n  fullName: ({ firstName, lastName }) => `${firstName} ${lastName}`\n  isAdmin: ({ isAdmin }) => isAdmin === 'YES'\n}\n```\n"
  },
  {
    "path": "website/src/pages/docs/guides/graphql-server-apollo-yoga.mdx",
    "content": "---\ndescription: GraphQL Code Generator's `@graphql-codegen/typescript-resolvers` plugin generates TypeScript types for your GraphQL API's resolvers.\n---\nimport { Tabs, Callout } from '@theguild/components'\n\n# Guide: GraphQL Yoga / Apollo Server\n\nGraphQL Code Generator's `@graphql-codegen/typescript-resolvers` plugin generates TypeScript types for your GraphQL API's resolvers.\n\n<Callout type=\"info\">\n  The GraphQL Codegen server preset configures `@graphql-codegen/typescript-resolvers` and comes with features to streamline the developer experience such as better server integration, type-safety, generated resolvers, and more!\n\n  Read how to [set up GraphQL Server with server preset](/docs/guides/graphql-server-apollo-yoga-with-server-preset)\n</Callout>\n\n## Video tutorial\n\n[Episode #26 of `graphql.wtf`](https://graphql.wtf/episodes/26-type-safe-resolvers-with-graphql-code-generator) is a great introduction to `@graphql-codegen/typescript-resolvers`:\n\n<iframe src=\"https://youtube.com/embed/tHMaNmqPIC4\" />\n\n<Callout>\n  [More weekly episodes are available in `graphql.wtf`](https://graphql.wtf) by [Jamie\n  Barton](https://twitter.com/notrab).\n</Callout>\n\n## Guide\n\nMost GraphQL API resolvers remain untyped or wrongly typed, which leads to multiple issues:\n\n- resolvers not compliant with the Schema definition\n\n- unhandled scenarios\n\n- typos in the resolvers' function type signature\n\nFor this reason, GraphQL Code Generator provides `@graphql-codegen/typescript-resolvers` that help automate the generation of resolvers' typings.\n\nJust a few configuration steps are required to get the resolvers types generated:\n\n**1. Move your GraphQL Schema declaration in dedicated `.graphql` files**\n\n```graphql filename=\"schema.graphql\"\ntype Author {\n  id: Int!\n  firstName: String!\n  lastName: String!\n  posts(findTitle: String): [Post]\n}\n\ntype Post {\n  id: Int!\n  title: String!\n  author: Author\n}\n\ntype Query {\n  posts: [Post]\n}\n```\n\n**2. Install the `@graphql-codegen/typescript-resolvers` plugin**\n\n```sh npm2yarn\nnpm i -D @graphql-codegen/cli @graphql-codegen/typescript-resolvers @graphql-codegen/typescript\n```\n\n**3. Configure the plugin**\n\nCreate or update your `codegen.ts` file as follows:\n\n<Tabs items={['Apollo Server', 'GraphQL Yoga']}>\n<Tabs.Tab>\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  generates: {\n    './resolvers-types.ts': {\n      config: {\n        useIndexSignature: true,\n      },\n      plugins: ['typescript', 'typescript-resolvers'],\n    },\n  },\n};\nexport default config;\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  generates: {\n    './resolvers-types.ts': {\n      plugins: ['typescript', 'typescript-resolvers'],\n    },\n  },\n};\nexport default config;\n```\n</Tabs.Tab>\n</Tabs>\n\n**4. Run the codegen and update your code**\n\nAssuming that, as recommended, your `package.json` has the following script:\n\n```json filename=\"package.json\"\n{\n  \"scripts\": {\n    \"generate\": \"graphql-codegen\"\n  }\n}\n```\n\nRunning the following generates the `graphql/generated.tsx` file.\n\n```sh npm2yarn\nnpm run generate\n```\n\nWe can now write/migrate our GraphQL API implementation as follows:\n\n<Tabs items={['Apollo Server', 'GraphQL Yoga']}>\n<Tabs.Tab>\n```ts\nimport { readFileSync } from 'node:fs'\nimport { ApolloServer } from 'apollo-server'\nimport { Resolvers } from './resolvers-types'\n\nconst typeDefs = readFileSync('./schema.graphql', 'utf8')\n\nconst resolvers: Resolvers = {\n  Query: {\n    // typed resolvers\n  }\n}\n\nconst server = new ApolloServer({ typeDefs, resolvers })\n\n// The `listen` method launches a web server\nserver.listen().then(({ url }) => {\n  console.log(`🚀  Server ready at ${url}`)\n})\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```ts\nimport { readFileSync } from 'node:fs'\nimport { createYoga, createSchema } from 'graphql-yoga';\nimport { createServer } from 'http';\nimport { Resolvers } from './resolvers-types'\n\nconst typeDefs = readFileSync('./schema.graphql', 'utf8')\n\nconst resolvers: Resolvers = {\n  Query: {\n    // typed resolvers\n  }\n}\n\nconst schema = createSchema({ typeDefs, resolvers })\nconst yoga = createYoga({ schema })\nconst server = createServer(yoga)\n\nserver.listen(3000)\n```\n</Tabs.Tab>\n</Tabs>\n\nA complete tutorial, written by The Guild's CTO, Dotan Simha, is available on our blog: [Better Type Safety for your GraphQL resolvers with GraphQL Codegen](https://the-guild.dev/blog/better-type-safety-for-resolvers-with-graphql-codegen).\n\nFor more advanced configuration (models or context typing), please refer to the [plugin documentation](/plugins/typescript-resolvers).\n"
  },
  {
    "path": "website/src/pages/docs/guides/react-query.mdx",
    "content": "---\ndescription: Execute GraphQL queries type-safe in React Query with GraphQL Code Generator.\n---\n\n# GraphQL Codegen with React Query\n\nIn this guide, we will learn how to use the GraphQL Code Generator client preset with React Query to generate type-safe operations and wire it up to a GraphQL server that supports the\nGraphQL over HTTP protocol.\n\n## Prerequisites\n\nFor this guide, we assume that you are querying your GraphQL server from within a Browser environment.\nSo you already have your Vite, Next.js, Node.js or any other vanilla\nproject with TypeScript setup.\n\nWe are going to use the public [Star Wars GraphQL API](https://swapi-graphql.netlify.app/) as our\nGraphQL endpoint.\n\n## Setting up GraphQL Code Generator\n\nThe GraphQL Code Generator client preset is the preferred and built-in way to generate type-safe\noperations for any GraphQL client library and also vanilla JavaScript.\n\nTo get started, install the following dependencies\n\n- **`@graphql-codegen/cli`**: Codegen CLI for running code generation\n- **`@parcel/watcher`**: Enable watch mode for the codegen CLI\n- **`@graphql-codegen/schema-ast`**: Plugin for generating the schema file from the GraphQL API\n  endpoint (optional if you already have a schema file)\n- **`@0no-co/graphqlsp`**: TypeScript language server plugin for GraphQL auto-complete (optional)\n\nFeel free to omit the optional dependencies if you don't need them.\n\n```sh npm2yarn\nnpm install --save-dev @graphql-codegen/cli @parcel/watcher\nnpm install --save-dev @graphql-codegen/schema-ast\nnpm install --save-dev @0no-co/graphqlsp\n```\n\nAfter that, we can create a `codegen.ts` file in the root of our project with the following\ncontents:\n\n```typescript filename=\"GraphQL Codegen Configuration\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.{ts,tsx}'],\n  ignoreNoDocuments: true,\n  generates: {\n    './src/graphql/': {\n      preset: 'client',\n      config: {\n        documentMode: 'string'\n      }\n    },\n    './schema.graphql': {\n      plugins: ['schema-ast'],\n      config: {\n        includeDirectives: true\n      }\n    }\n  }\n}\n\nexport default config\n```\n\nNext, we adjust our `tsconfig.json` to load `@0no-co/graphqlsp`.\n\n```json filename=\"tsconfig.json\"\n{\n  \"compilerOptions\": {\n    \"plugins\": [\n      {\n        \"name\": \"@0no-co/graphqlsp\",\n        \"schema\": \"./schema.graphql\"\n      }\n    ]\n  }\n}\n```\n\nFinally, we also need to prompt Visual Studio Code to use the local TypeScript version by creating a\n`.vscode/settings.json` file with the following contents:\n\n```json filename=\".vscode/settings.json\"\n{\n  \"typescript.tsdk\": \"node_modules/typescript/lib\",\n  \"typescript.enablePromptUseWorkspaceTsdk\": true\n}\n```\n\n## Running the Code Generator\n\nNow we can run the following command to generate the `schema.graphql` file and the GraphQL Code\nGenerator client code. **Note:** We are not yet writing GraphQL operations in our codebase, we just\ngenerate the client boilerplate code.\n\n```sh filename=\"Run GraphQL Code Generator\"\nnpx graphql-codegen --config codegen.ts\n```\n\nAfter running the command, you should see a new `schema.graphql` file in the root of your project\nand a new folder `src/graphql` with the generated client code.\n\nYou almost never need to touch the files within `src/graphql` as they are generated and overwritten\nby GraphQL Code generator.\n\nWe will now use the generated client code to write our type-safe GraphQL operations.\n\n## Writing GraphQL Operations\n\nLet's start GraphQL Code Generator in watch mode to generate the client code whenever we write our\ncode.\n\n```sh filename=\"Run GraphQL Code Generator in watch mode\"\nnpx graphql-codegen --config codegen.ts --watch\n```\n\nNext within any file in our projects `src` folder, we will import the `graphql` function from within\n`src/graphql`.\n\n```typescript filename=\"src/index.ts\"\nimport { graphql } from './graphql'\n```\n\nThis function allows us to define a GraphQL operation.\n\nThanks to the TypeScript GraphQL LSP plugin, we get auto-complete for our GraphQL operations while\nwriting them.\n\n![GraphQLSP in Action, giving us auto-complete on the selection set](/assets/pages/docs/guides/vanilla-typescript/graphql-lsp-autocomplete.png)\n\nWith that, we will write a simple query operation to get the total count of people in the Star Wars\nuniverse.\n\n```typescript filename=\"src/index.ts\"\nimport { graphql } from './graphql'\n\nconst PeopleCountQuery = graphql(`\n  query PeopleCount {\n    allPeople {\n      totalCount\n    }\n  }\n`)\n```\n\nAs we now save the file in our editor, the GraphQL Code Generator will generate the corresponding\ntypes, and as you hover over the `PeopleCountQuery` variable, you will see the following:\n\n![GraphQLSP in Action, giving us auto-complete on the selection set](/assets/pages/docs/guides/vanilla-typescript/typescript-typed-result.png)\n\n`TypedDocumentString` is a container type that holds the query operation string and also the\nTypeScript type for that operations response.\n\nWe can now leverage this to build a type-safe function that executes the GraphQL operation against\nour GraphQL server.\n\n## Type-Safe GraphQL Operation Execution\n\nWe can build a simple wrapper around `fetch` that takes a `TypedDocumentString` parameter and\nreturns a typed response.\n\n```typescript filename=\"src/graphql/execute.ts\"\nimport type { TypedDocumentString } from './graphql'\n\nexport async function execute<TResult, TVariables>(\n  query: TypedDocumentString<TResult, TVariables>,\n  ...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]\n) {\n  const response = await fetch('https://graphql.org/graphql/', {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      Accept: 'application/graphql-response+json'\n    },\n    body: JSON.stringify({\n      query,\n      variables\n    })\n  })\n\n  if (!response.ok) {\n    throw new Error('Network response was not ok')\n  }\n\n  return response.json() as TResult\n}\n```\n\nWe can now use this function to execute our `PeopleCountQuery` operation.\n\n```typescript filename=\"src/index.ts\"\nimport { graphql } from './graphql'\nimport { execute } from './graphql/execute'\n\nconst PeopleCountQuery = graphql(`\n  query PeopleCount {\n    allPeople {\n      totalCount\n    }\n  }\n`)\n\nexecute(PeopleCountQuery).then(data => {\n  console.log(data)\n})\n```\n\nWhen we now hover over the `data` parameter in the `then` callback, we can see that the response is\nfully typed.\n\n![Fully typed GraphQL execution result](/assets/pages/docs/guides/vanilla-typescript/typescript-typed-result.png)\n\n## Executing Query Operations with React Query\n\nWe can now leverage the `execute` function to execute our GraphQL operations with React Query.\n\n```tsx filename=\"Example usage of executing a Query Operation with React Query\"\nimport { useQuery } from '@tanstack/react-query'\nimport { graphql } from './graphql'\nimport { execute } from './graphql/execute'\n\nconst PeopleCountQuery = graphql(`\n  query PeopleCount {\n    allPeople {\n      totalCount\n    }\n  }\n`)\n\nfunction App() {\n  const { data } = useQuery({\n    queryKey: ['films'],\n    queryFn: () => execute(PeopleCountQuery)\n  })\n\n  return <div>There are {data?.allPeople.totalCount} people</div>\n}\n```\n\n## Conclusion\n\nIn this article, we learned how to use GraphQL Code Generator preset with React Query.\n\nIf you want to learn more about GraphQL Code Generator, check out the\n[client preset documentation](/plugins/presets/preset-client).\nE.g. you want to reduce bundle size by using the\n[client preset babel plugin](/plugins/presets/preset-client#reducing-bundle-size)\nor enable\n[persisted documents](/plugins/presets/preset-client#persisted-documents)\nin production for security and performance reasons.\n"
  },
  {
    "path": "website/src/pages/docs/guides/react-vue.mdx",
    "content": "---\ndescription: GraphQL Code Generator is a tool that generates code from your GraphQL schema and operations. It can generate TypeScript, Flow, Swift, Kotlin, and more.\n---\n\nimport { Tabs, Callout } from '@theguild/components'\n\n# Guide: React and Vue\n\nGraphQL Code Generator provides a unified way to get TypeScript types from GraphQL operations for [most modern GraphQL clients and frameworks](#appendix-ii-compatibility).\n\nThis guide is built using the [Star wars films demo API](https://graphql.org/graphql/).\n\nWe will build a simple GraphQL front-end app using the following Query to fetch the list of Star Wars films:\n\n```graphql\nquery allFilmsWithVariablesQuery($first: Int!) {\n  allFilms(first: $first) {\n    edges {\n      node {\n        ...FilmItem\n      }\n    }\n  }\n}\n```\n\nand its `FilmItem` Fragment definition:\n\n```graphql\nfragment FilmItem on Film {\n  id\n  title\n  releaseDate\n  producers\n}\n```\n\n<Callout type=\"info\">\n\nAll the below code examples are available in our [repository `examples` folder](https://github.com/dotansimha/graphql-code-generator/blob/master/examples).\n\n</Callout>\n\n## Installation\n\nFor most GraphQL clients and frameworks (React, Vue), install the following packages:\n\n```sh npm2yarn\nnpm install graphql\nnpm install --save-dev typescript @graphql-codegen/cli @parcel/watcher\n```\n\n<br />\n\nThen provide the corresponding framework-specific configuration:\n\n<Tabs items={['React project', 'Vue project']}>\n\n<Tabs.Tab>\n\n```ts filename=\"codegen.ts\" {5}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.tsx'],\n  ignoreNoDocuments: true, // for better experience with the watcher\n  generates: {\n    './src/gql/': {\n      preset: 'client'\n    }\n  }\n}\n\nexport default config\n```\n\n</Tabs.Tab>\n\n<Tabs.Tab>\n\n```ts filename=\"codegen.ts\" {1, 5, 9-11}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.vue'],\n  ignoreNoDocuments: true, // for better experience with the watcher\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      config: {\n        useTypeImports: true\n      }\n    }\n  }\n}\n\nexport default config\n```\n\n</Tabs.Tab>\n\n</Tabs>\n\n> **Note**: For React Query, please refer to our [dedicated guide](/docs/guides/react-query).\n\n<br />\n\n## Writing GraphQL Queries\n\nFirst, start GraphQL Code Generator in watch mode:\n\n```sh npm2yarn\nnpm run graphql-codegen --watch\n```\n\n_Using GraphQL Code Generator will type your GraphQL Query and Mutations as you write them ⚡️_\n\nNow, we can start implementing our first query with the `graphql()` function, generated in `src/gql/`:\n\n<Tabs items={['React Apollo', 'React Query', 'React URQL', 'Vue URQL', 'Vue Apollo']}>\n\n<Tabs.Tab>\n\n```ts filename=\"src/App.tsx\" {6,8-18,22}\nimport React from 'react'\nimport { useQuery } from '@apollo/client'\n\nimport './App.css'\nimport Film from './Film'\nimport { graphql } from '../src/gql'\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`)\n\nfunction App() {\n  // `data` is typed!\n  const { data } = useQuery(allFilmsWithVariablesQueryDocument, { variables: { first: 10 } })\n  return (\n    <div className=\"App\">\n      {data && <ul>{data.allFilms?.edges?.map((e, i) => e?.node && <Film film={e?.node} key={`film-${i}`} />)}</ul>}\n    </div>\n  )\n}\n\nexport default App\n```\n\n</Tabs.Tab>\n\n<Tabs.Tab>\n\n```ts filename=\"src/App.tsx\" {7, 8-18, 23-27}\nimport React from 'react'\nimport request from 'graphql-request'\nimport { useQuery } from '@tanstack/react-query'\n\nimport './App.css'\nimport Film from './Film'\nimport { graphql } from '../src/gql'\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`)\n\nfunction App() {\n  // `data` is typed!\n  const { data } = useQuery(['films'], async () =>\n    request('https://graphql.org/graphql/', allFilmsWithVariablesQueryDocument, {\n      first: 10 // variables are typed too!\n    })\n  )\n\n  return (\n    <div className=\"App\">\n      {data && <ul>{data.allFilms?.edges?.map((e, i) => e?.node && <Film film={e?.node} key={`film-${i}`} />)}</ul>}\n    </div>\n  )\n}\n\nexport default App\n```\n\n</Tabs.Tab>\n\n<Tabs.Tab>\n\n```ts filename=\"src/App.tsx\" {6,8-18,22-27}\nimport React from 'react'\nimport { useQuery } from 'urql'\n\nimport './App.css'\nimport Film from './Film'\nimport { graphql } from '../src/gql'\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`)\n\nfunction App() {\n  // `data` is typed!\n  const [{ data }] = useQuery({\n    query: allFilmsWithVariablesQueryDocument,\n    variables: {\n      // variables are typed too!\n      first: 10\n    }\n  })\n\n  return (\n    <div className=\"App\">\n      {data && <ul>{data.allFilms?.edges?.map((e, i) => e?.node && <Film film={e?.node} key={`film-${i}`} />)}</ul>}\n    </div>\n  )\n}\n\nexport default App\n```\n\n</Tabs.Tab>\n\n<Tabs.Tab>\n\n```vue filename=\"src/App.vue\" {6,9-21,24}\n<script setup lang=\"ts\">\nimport { useQuery } from '@urql/vue'\nimport { computed } from 'vue'\n\nimport FilmItem from './components/FilmItem.vue'\nimport { graphql } from '../src/gql'\n\nconst { data } = useQuery({\n  query: graphql(/* GraphQL */ `\n    query allFilmsWithVariablesQuery($first: Int!) {\n      allFilms(first: $first) {\n        edges {\n          node {\n            ...FilmItem\n          }\n        }\n      }\n    }\n  `),\n  // variables are typed!\n  variables: { first: 10 }\n})\n// `films` is typed!\nconst films = computed(() => data.value?.allFilms?.edges?.map(e => e?.node!))\n</script>\n\n<template>\n  <ul>\n    <li v-for=\"film of films\"><FilmItem :film=\"film\" /></li>\n  </ul>\n</template>\n```\n\n</Tabs.Tab>\n\n<Tabs.Tab>\n\n```vue filename=\"src/App.vue\" {6,9-21,24}\n<script setup lang=\"ts\">\nimport { useQuery } from '@vue/apollo-composable'\nimport { computed } from 'vue'\n\nimport FilmItem from './components/FilmItem.vue'\nimport { graphql } from '../src/gql'\n\nconst { result } = useQuery(\n  graphql(/* GraphQL */ `\n    query allFilmsWithVariablesQuery($first: Int!) {\n      allFilms(first: $first) {\n        edges {\n          node {\n            ...FilmItem\n          }\n        }\n      }\n    }\n  `),\n  // variables are typed!\n  { first: 10 }\n)\n// `films` is typed!\nconst films = computed(() => result.value?.allFilms?.edges?.map(e => e?.node!))\n</script>\n\n<template>\n  <ul>\n    <li v-for=\"film of films\"><FilmItem :film=\"film\" /></li>\n  </ul>\n</template>\n```\n\n</Tabs.Tab>\n\n</Tabs>\n\n<Callout type=\"info\">\n\n**Be cautious**, anonymous Queries and Mutations will be ignored.\n\n</Callout>\n\nSimply use the provided `graphql()` function (from `../src/gql/`) to define your GraphQL Query or Mutation, then, get instantly typed-variables and result just by passing your GraphQL document to your favorite client ✨\n\nLet's now take a look at how to define our `<Film>` component using the `FilmItem` fragment and its corresponding TypeScript type.\n\n## Writing GraphQL Fragments\n\nAs showcased [in one of our recent blog posts](https://www.the-guild.dev/blog/unleash-the-power-of-fragments-with-graphql-codegen), GraphQL Fragments help build better isolated and reusable UI components.\n\nLet's look at the implementation of our `Film` UI component in React or Vue:\n\n<Tabs items={['React (Apollo, React Query, URQL)', 'Vue (Apollo, URQL)']}>\n\n<Tabs.Tab>\n\n```ts filename=\"src/Film.tsx\" {4-11,15,17}\nimport { FragmentType, useFragment } from './gql/fragment-masking'\nimport { graphql } from '../src/gql'\n\nexport const FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`)\n\nconst Film = (props: {\n  /* `film` property has the correct type 🎉 */\n  film: FragmentType<typeof FilmFragment>\n}) => {\n  const film = useFragment(FilmFragment, props.film)\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  )\n}\n\nexport default Film\n```\n\n</Tabs.Tab>\n\n<Tabs.Tab>\n\n```vue filename=\"src/components/FilmItem.vue\" {5-12,14,17}\n<script setup lang=\"ts\">\nimport { graphql } from '.../src/gql'\nimport { type FragmentType, useFragment } from '../gql/fragment-masking'\n\nconst FilmFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`)\nconst props = defineProps<{\n  film: FragmentType<typeof FilmFragment>\n}>()\n// `filmObj` is typed!\nconst filmObj = useFragment(FilmFragment, props.film)\n</script>\n\n<template>\n  <div>\n    <h3>{{ filmObj.title }}</h3>\n    <p>{{ filmObj.releaseDate }}</p>\n  </div>\n</template>\n```\n\n</Tabs.Tab>\n\n</Tabs>\n\n<Callout type=\"info\">\n\nExamples for SWR (React), `graphql-request` and Villus (Vue) are available in our [repository `examples` folder](https://github.com/dotansimha/graphql-code-generator/blob/master/examples).\n\n</Callout>\n\nYou will notice that our `<FilmItem>` component leverages 2 imports from our generated code (from `../src/gql`): the `FragmentType<T>` type helper and the `useFragment()` function.\n\n- we use `FragmentType<typeof FilmFragment>` to get the corresponding Fragment TypeScript type\n- later on, we use `useFragment()` to retrieve the `film` property\n\nLeveraging `FragmentType<typeof FilmFragment>` and `useFragment()` helps keep your UI component isolated and avoids inheriting the parent GraphQL Query's typings.\n\n<br />\n\n> By using GraphQL Fragments, you are explicitly declaring your UI component's data dependencies and safely accessing only the data it needs.\n\n<br />\n\nFinally, unlike most GraphQL Client setups, you don't need to append the Fragment definition document to the related Query. You simply need to reference it in your GraphQL Query, as shown below:\n\n```ts {6}\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`)\n```\n\n<br />\n\nCongratulations, you now have the best GraphQL front-end experience with fully-typed Queries and Mutations!\n\nFrom simple Queries to more advanced Fragments-based ones, GraphQL Code Generator has you covered with a simple TypeScript configuration file, and without impact on your application bundle size! 🚀\n\n**What's next?**\n\nTo get the best GraphQL development experience, we recommend installing the [GraphQLSP](https://github.com/0no-co/GraphQLSP) package to get:\n\n- syntax highlighting\n- autocomplete suggestions\n- validation against schema\n- quick-info on hover\n\n![GraphQLSP](/assets/pages/docs/guides/react-vue/graphqlsp.png)\n\n`GraphQLSP`s a TypeScript LSP plugin for GraphQL, to get it working, we need to add the following to your `tsconfig.json`\nafter installing the package (`npm i -D @0no-co/graphqlsp`):\n\n```json filename=\"tsconfig.json\"\n{\n  \"compilerOptions\": {\n    \"plugins\": [\n      {\n        \"name\": \"@0no-co/graphqlsp\",\n        \"schema\": \"./schema.graphql\"\n      }\n    ]\n  }\n}\n```\n\nLast but not least you need to ensure that when you're using `VSCode` that the workspace version of TS is used, the following\nconfig will make a prompt appear to switch it when visiting a TS file\n\n```json filename=\".vscode/settings.json\"\n{\n  \"typescript.tsdk\": \"node_modules/typescript/lib\",\n  \"typescript.enablePromptUseWorkspaceTsdk\": true\n}\n```\n\nAlso, make sure to follow GraphQL best practices by using [`graphql-eslint`](https://github.com/B2o5T/graphql-eslint) and the [ESLint VSCode extension](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) to visualize errors and warnings inlined in your code correctly.\n\nFeel free to continue playing with this demo project, available in all flavors, in our [repository `examples` folder](https://github.com/dotansimha/graphql-code-generator/blob/master/examples).\n\n<br />\n\n---\n\n<br />\n\n## Config API\n\nThe `client` preset allows the following `config` options:\n\n- [`scalars`](/plugins/typescript/typescript#scalars): Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\n- [`defaultScalarType`](/plugins/typescript/typescript#defaultscalartype): Allows you to override the type that unknown `scalars` will have. Defaults to `any`.\n- [`strictScalars`](/plugins/typescript/typescript#strictscalars): If `scalars` are found in the schema that are not defined in scalars an error will be thrown during codegen.\n- [`namingConvention`](/plugins/typescript/typescript#namingconvention): Available case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`.\n- [`useTypeImports`](/plugins/typescript/typescript#usetypeimports): Will use `import type {}` rather than `import {}` when importing only types. This gives compatibility with TypeScript's [`\"importsNotUsedAsValues\": \"error\"`](https://www.typescriptlang.org/tsconfig#importsNotUsedAsValues) option.\n- [`skipTypename`](/plugins/typescript/typescript#skiptypename): Does not add `__typename` to the generated types, unless it was specified in the selection set.\n- [`arrayInputCoercion`](/plugins/typescript/typescript-operations#arrayinputcoercion): The [GraphQL spec](https://spec.graphql.org/draft/#sel-FAHjBJFCAACE_Gh7d) allows arrays and a single primitive value for list input. This allows to deactivate that behavior to only accept arrays instead of single values.\n- [`enumsAsTypes`](/plugins/typescript/typescript#enumsastypes): Generates enum as TypeScript string union `type` instead of an `enum`. Useful if you wish to generate `.d.ts` declaration file instead of `.ts`, or if you want to avoid using TypeScript enums due to bundle size concerns.\n- [`enumsAsConst`](/plugins/typescript/typescript#enumsasconst): Generates enum as TypeScript const assertions instead of enum. This can even be used to enable enum-like patterns in plain JavaScript code if you choose not to use TypeScript’s enum construct.\n- [`enumValues`](/plugins/typescript/typescript#enumvalues): Overrides the default value of enum values declared in your GraphQL schema. You can also map the entire enum to an external type by providing a string that of module#type.\n- [`nonOptionalTypename`](/plugins/typescript/typescript#nonoptionaltypename): Automatically adds `__typename` field to the generated types, even when they are not specified in the selection set, and makes it non-optional.\n- [`avoidOptionals`](/plugins/typescript/typescript#avoidoptionals): This will cause the generator to avoid using TypeScript optionals (`?`) on types.\n\n<br />\n\n---\n\n<br />\n\n## Appendix I: React Query with a custom fetcher setup\n\nThe use of `@tanstack/react-query` along with `graphql-request@^5` is highly recommended due to GraphQL Code Generator integration with `graphql-request@^5`.\n\nCreate a file with the following helper function within your project:\n\n```ts filename=\"useGraphQL helper function\"\nimport request from 'graphql-request'\nimport { type TypedDocumentNode } from '@graphql-typed-document-node/core'\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query'\n\nexport function useGraphQL<TResult, TVariables>(\n  document: TypedDocumentNode<TResult, TVariables>,\n  ...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]\n): UseQueryResult<TResult> {\n  return useQuery([(document.definitions[0] as any).name.value, variables], async ({ queryKey }) =>\n    request('https://graphql.org/graphql/', document, queryKey[1] ? queryKey[1] : undefined)\n  )\n}\n```\n\nThen write type-safe code like the following:\n\n```ts filename=\"Application Code\"\nimport { useGraphQL } from './use-graphql.js'\nimport { graphql } from './generated/gql.js'\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          title\n        }\n      }\n    }\n  }\n`)\n\nfunction App() {\n  // `data` is properly typed, inferred from `allFilmsWithVariablesQueryDocument` type\n  const { data } = useGraphQL(\n    allFilmsWithVariablesQueryDocument,\n    // variables are also properly type-checked.\n    { first: 10 }\n  )\n\n  // ... further component code\n}\n```\n\nIn case you do not want to use `graphql-request` with `@tanstack/react-query`, you can write and type your own custom fetcher function.\n\nGraphQL Code Generator, via the `client` preset, generates GraphQL documents similar to the following:\n\n```ts\nconst query: TypedDocumentNode<{ greetings: string }, never | Record<any, never>> = parse(/* GraphQL */ `\n  query greetings {\n    greetings\n  }\n`)\n```\n\nA `TypedDocumentNode<R, V>` type carry 2 Generic arguments: the type of the GraphQL result `R` and the type of the GraphQL operation variables `V`.\n\nTo implement your own React Query fetcher while preserving the GraphQL document type inference, it should implement a function signature that extract the result type and use it as a return type, as showcased below:\n\n```ts filename=\"Custom fetcher function and useGraphQL hook implementation\"\nimport { type TypedDocumentNode } from '@graphql-typed-document-node/core'\nimport { useQuery, type UseQueryResult } from '@tanstack/react-query'\nimport { print, type ExecutionResult } from 'graphql'\n\n/** Your custom fetcher function */\nasync function customFetcher<TResult, TVariables>(\n  url: string,\n  document: TypedDocumentNode<TResult, TVariables>,\n  ...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]\n): Promise<TResult> {\n  const response = await fetch(url, {\n    method: 'POST',\n    headers: {\n      'content-type': 'application/json'\n    },\n    body: JSON.stringify({\n      query: print(document),\n      variables\n    })\n  })\n  if (response.status !== 200) {\n    throw new Error(`Failed to fetch: ${response.statusText}. Body: ${await response.text()}`)\n  }\n\n  return await response.json()\n}\n\nexport function useGraphQL<TResult, TVariables>(\n  document: TypedDocumentNode<TResult, TVariables>,\n  ...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]\n): UseQueryResult<ExecutionResult<TResult>> {\n  return useQuery([(document.definitions[0] as any).name.value, variables], () =>\n    customFetcher('https://graphql.org/graphql/', document, variables)\n  )\n}\n```\n\nThen write type-safe code like the following:\n\n```ts filename=\"Application Code\"\nimport { useGraphQL } from './use-graphql.js'\nimport { graphql } from './generated/gql.js'\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          title\n        }\n      }\n    }\n  }\n`)\n\nfunction App() {\n  // `data` is properly typed, inferred from `allFilmsWithVariablesQueryDocument` type\n  const { data } = useGraphQL(\n    allFilmsWithVariablesQueryDocument,\n    // variables are also properly type-checked.\n    { first: 10 }\n  )\n\n  // ... further component code\n}\n```\n\n<br />\n\n---\n\n<br />\n\n## Appendix II: Compatibility\n\nGraphQL Code Generator `client` preset (`@graphql-codegen/client-preset`) is compatible with the following GraphQL clients and frameworks:\n\n- **React**\n\n  - `@apollo/client` (since `3.2.0`, not when using React Components (`<Query>`))\n  - `@urql/core` (since `1.15.0`)\n  - `@urql/preact` (since `1.4.0`)\n  - `urql` (since `1.11.0`)\n  - `graphql-request` (since `5.0.0`)\n  - `react-query` (with `graphql-request@5.x`)\n  - `swr` (with `graphql-request@5.x`)\n\n- **Vue**\n  - `@vue/apollo-composable` (since `4.0.0-alpha.13`)\n  - `villus` (since `1.0.0-beta.8`)\n  - `@urql/vue` (since `1.11.0`)\n\nIf your stack is not listed above, please refer to other guides ([Angular](/docs/guides/angular), [Svelte](/docs/guides/svelte)) or to [our plugins directory](/plugins).\n"
  },
  {
    "path": "website/src/pages/docs/guides/svelte.mdx",
    "content": "---\ndescription: Generate typed code for SvelteKit and Apollo. GraphQL Code Generator and the community provide typed code generation for Apollo, SvelteKit _native_, and other clients.\n---\n\nimport { Callout } from '@theguild/components'\n\n# Guide: Svelte / Kit\n\nGraphQL Code Generator and the community provide typed code generation for Apollo, SvelteKit _native_, and other clients.\n\nPlugins and available options vary depending on the selected codegen; for this reason, you will find guides for each of them below:\n\n- [Svelte Apollo](#svelte-apollo)\n- [SvelteKit Native](#sveltekit-native)\n\nAll the following guides query the schema below:\n\n```graphql filename=\"schema.graphql\"\ntype Author {\n  id: Int!\n  firstName: String!\n  lastName: String!\n  posts(findTitle: String): [Post]\n}\n\ntype Post {\n  id: Int!\n  title: String!\n  author: Author\n}\n\ntype Query {\n  posts: [Post]\n}\n```\n\n## Svelte Apollo\n\nThank to the [community-built plugin](https://github.com/ticruz38/graphql-codegen-svelte-apollo#readme) `graphql-codegen-svelte-apollo`, GraphQL Code Generator generates full-typed Apollo GraphQL services for Svelte.\n\nand the following reference script:\n\n```svelte\n<script lang=\"ts\">\n  import { query } from 'svelte-apollo'\n\n  const postsQueryDocument = gql`\n    query Posts {\n      posts {\n        id\n        title\n        author {\n          id\n          firstName\n          lastName\n        }\n      }\n    }\n  `\n\n  const posts = query(postsQueryDocument)\n</script>\n\n<!-- UI … -->\n{posts.data}\n```\n\nJust a few configuration steps are required to get observable Apollo queries with Typescript typings:\n\n**1. Install the `graphql-codegen-svelte-apollo` plugin**\n\n```sh npm2yarn\nnpm i -D graphql-codegen-svelte-apollo @graphql-codegen/typescript @graphql-codegen/typescript-operations @graphql-codegen/cli typescript graphql\n```\n\n**2. Configure the plugin**\n\nCreate or update your `codegen.ts` file as follows:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://my-graphql-api.com/graphql',\n  documents: './src/**/*.gql',\n  generates: {\n    './graphql/generated.ts': {\n      plugins: ['typescript', 'typescript-operations', 'graphql-codegen-svelte-apollo']\n    }\n  }\n}\nexport default config\n```\n\n<Callout>\n**`schema` and `documents` values**\n\n`schema` can be:\n\n- your target GraphQL API URL (`\"/graphql\"` included)\n- your SDL file. (eg: `./src/schema.graphql`)\n\n`documents` is a glob expression to your `.graphql`, `.gql` files.\n\n</Callout>\n\n**3. Run the codegen and update your code**\n\nAssuming that, as recommended, your `package.json` has the following script:\n\n```json filename=\"package.json\"\n{\n  \"scripts\": {\n    \"generate\": \"graphql-codegen\"\n  }\n}\n```\n\nRunning the following generates the `graphql/generated.ts` file.\n\n```sh npm2yarn\nnpm run generate\n```\n\nWe can now update our code as follows:\n\n```svelte\n<script lang=\"ts\">\n  import { Posts } from '../graphql/generated'\n\n  $: posts = Posts()\n  // `posts` is fully typed!\n</script>\n\n<!-- UI … -->\n{$posts.data}\n```\n\nFor more advanced configuration (ex: async queries), please refer to the [plugin documentation](/plugins/typescript-svelte-apollo) and the [GitHub repository README](https://github.com/ticruz38/graphql-codegen-svelte-apollo).\n\nFor a different organization of the generated files, please refer to the [\"Generated files colocation\"](/docs/advanced/generated-files-colocation) page.\n\n## SvelteKit Native\n\n![logoKitQL](https://raw.githubusercontent.com/jycouet/kitql/main/logo.svg)\n\nWith [KitQL Codegen](https://github.com/jycouet/kitql/tree/main/packages/graphql-codegen), you get SSR (Server Side Rendering) & Caching out-of-the-box with svelte stores.\n\nJust a few configuration steps are required to get SvelteKit stores fully typed + All Operations fully typed:\n\n**1. Install the plugin**\n\n```sh npm2yarn\nnpm i @kitql/client\nnpm i -D @kitql/graphql-codegen\n```\n\n**2. Configure the plugin**\n\nCreate or update your `codegen.ts` file as follows:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://my-graphql-api.com/graphql',\n  documents: './src/**/*.gql',\n  generates: {\n    './graphql/generated.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typed-document-node', '@kitql/graphql-codegen']\n    }\n  }\n}\nexport default config\n```\n\n**3. Run the codegen and update your code**\n\nAssuming that, as recommended, your `package.json` has the following script:\n\n```json filename=\"package.json\"\n{\n  \"scripts\": {\n    \"generate\": \"graphql-codegen\"\n  }\n}\n```\n\nRunning the following generates the `graphql/generated.ts` file.\n\n```sh npm2yarn\nnpm run generate\n```\n\nWe can now update our code as follows:\n\n```svelte\n<script context=\"module\" lang=\"ts\">\n  import { PostsQuery } from '../graphql/generated'\n\n  export async function load({ fetch }) {\n    await PostsQuery({ fetch }) // This line do the query in SSR mode\n    // now you have `PostsQueryStore` store available and fully typed!\n    return {}\n  }\n</script>\n\n<!-- UI … -->\n{$PostsQueryStore.data}\n```\n\nFor more advanced configuration, please refer to the [KitQL documentation](https://github.com/jycouet/kitql/tree/main/packages/graphql-codegen).\n\nFor a different organization of the generated files, please refer to the [\"Generated files colocation\"](/docs/advanced/generated-files-colocation) page.\n"
  },
  {
    "path": "website/src/pages/docs/guides/vanilla-typescript.mdx",
    "content": "---\ndescription: Execute GraphQL queries type-safe in vanilla TypeScript with GraphQL Code Generator.\n---\n\n# GraphQL Codegen with Vanilla TypeScript\n\nGraphQL client libraries such as Apollo Client, Relay, and Urql are popular choices that allows\nbuilding powerful features for querying but come with a few drawbacks:\n\n- **Bundle Size**: All GraphQL Client GraphQL clients come with one or more of AST parsers/\n  printers, a normalized cache, network layer abstractions, and other features that can increase the\n  bundle size of your application.\n- **Complexity**: GraphQL clients can be complex to set up and use, especially for beginners.\n  Sometimes you just want to write type-safe GraphQL operations without having to learn about\n  normalized caches and network layers. Maybe this is even the reason you ended up being here.\n\nIn this guide, we will learn how to use the GraphQL Code Generator client preset with vanilla\nTypeScript to generate type-safe operations and wire it up to a GraphQL server that supports the\nGraphQL over HTTP protocol.\n\nThis approach is framework/runtime (React, Vue, Svelte, Node.js, Bun) agnostic and the function for\nexecuting GraphQL operations will be a simple Type-Safe `fetch` wrapper.\n\n## Prerequisites\n\nFor this guide, we assume that you are querying your GraphQL server from within a Browser or\nNode.js/Bun/etc. environment. So you already have your Vite, Next.js, Node.js or any other vanilla\nproject with TypeScript setup.\n\nThis guide will work on any JavaScript environment that supports `fetch` API.\n\nWe are going to use the public [Star Wars GraphQL API](https://swapi-graphql.netlify.app/) as our\nGraphQL endpoint.\n\n## Setting up GraphQL Code Generator\n\nThe GraphQL Code Generator client preset is the preferred and built-in way to generate type-safe\noperations for any GraphQL client library and also vanilla JavaScript.\n\nTo get started, install the following dependencies\n\n- **`@graphql-codegen/cli`**: Codegen CLI for running code generation\n- **`@parcel/watcher`**: Enable watch mode for the codegen CLI\n- **`@graphql-codegen/schema-ast`**: Plugin for generating the schema file from the GraphQL API\n  endpoint (optional if you already have a schema file)\n- **`@0no-co/graphqlsp`**: TypeScript language server plugin for GraphQL auto-complete (optional)\n\nFeel free to omit the optional dependencies if you don't need them.\n\n```sh npm2yarn\nnpm install --save-dev @graphql-codegen/cli @parcel/watcher\nnpm install --save-dev @graphql-codegen/schema-ast\nnpm install --save-dev @0no-co/graphqlsp\n```\n\nAfter that, we can create a `codegen.ts` file in the root of our project with the following\ncontents:\n\n```typescript filename=\"GraphQL Codegen Configuration\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'https://graphql.org/graphql/',\n  documents: ['src/**/*.ts'],\n  ignoreNoDocuments: true,\n  generates: {\n    './src/graphql/': {\n      preset: 'client',\n      config: {\n        documentMode: 'string'\n      }\n    },\n    './schema.graphql': {\n      plugins: ['schema-ast'],\n      config: {\n        includeDirectives: true\n      }\n    }\n  }\n}\n\nexport default config\n```\n\nNext, we adjust our `tsconfig.json` to load `@0no-co/graphqlsp`.\n\n```json filename=\"tsconfig.json\"\n{\n  \"compilerOptions\": {\n    \"target\": \"ES6\", // Requires ES6 and above\n    \"plugins\": [\n      {\n        \"name\": \"@0no-co/graphqlsp\",\n        \"schema\": \"./schema.graphql\"\n      }\n    ]\n  }\n}\n```\n\nFinally, we also need to prompt Visual Studio Code to use the local TypeScript version by creating a\n`.vscode/settings.json` file with the following contents:\n\n```json filename=\".vscode/settings.json\"\n{\n  \"typescript.tsdk\": \"node_modules/typescript/lib\",\n  \"typescript.enablePromptUseWorkspaceTsdk\": true\n}\n```\n\n## Running the Code Generator\n\nNow we can run the following command to generate the `schema.graphql` file and the GraphQL Code\nGenerator client code. **Note:** We are not yet writing GraphQL operations in our codebase, we just\ngenerate the client boilerplate code.\n\n```sh filename=\"Run GraphQL Code Generator\"\nnpx graphql-codegen --config codegen.ts\n```\n\nAfter running the command, you should see a new `schema.graphql` file in the root of your project\nand a new folder `src/graphql` with the generated client code.\n\nYou almost never need to touch the files within `src/graphql` as they are generated and overwritten\nby GraphQL Code generator.\n\nWe will now use the generated client code to write our type-safe GraphQL operations.\n\n## Writing GraphQL Operations\n\nLet's start GraphQL Code Generator in watch mode to generate the client code whenever we write our\ncode.\n\n```sh filename=\"Run GraphQL Code Generator in watch mode\"\nnpx graphql-codegen --config codegen.ts --watch\n```\n\nNext within any file in our projects `src` folder, we will import the `graphql` function from within\n`src/graphql`.\n\n```typescript filename=\"src/index.ts\"\nimport { graphql } from './graphql'\n```\n\nThis function allows us to define a GraphQL operation.\n\nThanks to the TypeScript GraphQL LSP plugin, we get auto-complete for our GraphQL operations while\nwriting them.\n\n![GraphQLSP in Action, giving us auto-complete on the selection set](/assets/pages/docs/guides/vanilla-typescript/graphql-lsp-autocomplete.png)\n\nWith that, we will write a simple query operation to get the total count of people in the Star Wars\nuniverse.\n\n```typescript filename=\"src/index.ts\"\nimport { graphql } from './graphql'\n\nconst PeopleCountQuery = graphql(`\n  query PeopleCount {\n    allPeople {\n      totalCount\n    }\n  }\n`)\n```\n\nAs we now save the file in our editor, the GraphQL Code Generator will generate the corresponding\ntypes, and as you hover over the `PeopleCountQuery` variable, you will see the following:\n\n![GraphQLSP in Action, giving us auto-complete on the selection set](/assets/pages/docs/guides/vanilla-typescript/typescript-typed-result.png)\n\n`TypedDocumentString` is a container type that holds the query operation string and also the\nTypeScript type for that operations response.\n\nWe can now leverage this to build a type-safe function that executes the GraphQL operation against\nour GraphQL server.\n\n## Type-Safe GraphQL Operation Execution\n\nWe can build a simple wrapper around `fetch` that takes a `TypedDocumentString` parameter and\nreturns a typed response.\n\n```typescript filename=\"src/graphql/execute.ts\"\nimport type { ExecutionResult } from 'graphql'\nimport type { TypedDocumentString } from './graphql'\n\nexport async function execute<TResult, TVariables>(\n  query: TypedDocumentString<TResult, TVariables>,\n  ...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]\n) {\n  const response = await fetch('https://graphql.org/graphql/', {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      Accept: 'application/graphql-response+json'\n    },\n    body: JSON.stringify({\n      query,\n      variables\n    })\n  })\n\n  if (!response.ok) {\n    throw new Error('Network response was not ok')\n  }\n\n  return response.json() as ExecutionResult<TResult>\n}\n```\n\nWe can now use this function to execute our `PeopleCountQuery` operation.\n\n```typescript filename=\"src/index.ts\"\nimport { graphql } from './graphql'\nimport { execute } from './graphql/execute'\n\nconst PeopleCountQuery = graphql(`\n  query PeopleCount {\n    allPeople {\n      totalCount\n    }\n  }\n`)\n\nexecute(PeopleCountQuery).then(data => {\n  console.log(data)\n})\n```\n\nWhen we now hover over the `data` parameter in the `then` callback, we can see that the response is\nfully typed.\n\n![Fully typed GraphQL execution result](/assets/pages/docs/guides/vanilla-typescript/typescript-typed-result.png)\n\nAnd that's it! We have successfully set up a type-safe GraphQL operation execution within a Vanilla\nTypeScript project.\n\n## Conclusion\n\nIn this article, we learned how to use GraphQL Code Generator with vanilla\nTypeScript.\n\nWe set up the GraphQL Code Generator for clients and wrote a simple operation that is fully typed.\n\nYou could now integrate the `execute` function into\n[TanStack Query (React Query)](https://tanstack.com/query) or SWR.\n\nIf you want to learn more about GraphQL Code Generator, check out the\n[client preset documentation](/plugins/presets/preset-client).\nE.g. you want to reduce bundle size by using the\n[client preset babel plugin](/plugins/presets/preset-client#reducing-bundle-size)\nor enable\n[persisted documents](/plugins/presets/preset-client#persisted-documents)\nin production for security and performance reasons.\n"
  },
  {
    "path": "website/src/pages/docs/integrations/_meta.ts",
    "content": "export default {\n  vscode: 'VSCode Extension',\n  prettier: 'Prettier & Linters',\n  federation: 'Apollo Federation',\n  'apollo-local-state': 'apollo-local-state',\n  'create-react-app': 'create-react-app',\n  gatsby: 'Gatsby',\n};\n"
  },
  {
    "path": "website/src/pages/docs/integrations/apollo-local-state.mdx",
    "content": "---\ndescription: Apollo Local State. Suppose you are using apollo-client >2.5 or older, with apollo-link-state to manage your app state with GraphQL. In that case, you're probably using a client-side only GraphQL schema and client-side directives such as `@client`.\n---\n\n# Apollo Local State\n\nSuppose you are using [apollo-client](https://apollographql.com/docs/react/v2/data/local-state) >2.5 (or older, with [apollo-link-state](https://apollographql.com/docs/link/links/state.html)) to manage your app state with GraphQL. In that case, you're probably using a client-side only GraphQL schema and client-side directives such as `@client`.\n\nThe client-side only GraphQL schema and client-side directives are not part of your remote GraphQL schema.\nThis prevents them from being included in your existing GraphQL Code Generator configuration:\n\nFor example:\n\n```graphql\nquery myQuery {\n  todos {\n    id\n    title\n    checked\n    selected @client\n  }\n}\n```\n\nIf you wish to get better integration and fully type-safe types for your client-side schema as well, you can create a `.graphql` file for your local schema, for example:\n\n```graphql\ntype Todo {\n  selected: Boolean!\n}\n```\n\nAnd then, you can merge this part of the schema with your remote schema by specifying it as part of your `schema` field:\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: ['http://my-remote-schema/graphql', 'my-client-schema.graphql']\n}\nexport default config\n```\n\nThis way, the GraphQL Code Generator will generate complete typings that match both your client fields and server fields.\n\nIf you only plan to perform a query with Apollo's local state, simply extend the `Query` type and add the field (query field) you're trying to call in your local `schema`:\n\n```graphql\nextend type Query {\n  todos: Todo\n}\n```\n"
  },
  {
    "path": "website/src/pages/docs/integrations/create-react-app.mdx",
    "content": "---\ndescription: Codegen for React Apollo with TypeScript. Generates React Hooks and TypeScript types.\n---\n\n# Create-React-App\n\nSince v2 of [Create-React-App](https://github.com/facebook/create-react-app), you can use TypeScript without the need to eject from the basic scripts packages.\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://my-server/graphql',\n  documents: 'src/**/*.graphql',\n  generates: {\n    'components.tsx': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo']\n    }\n  }\n}\nexport default config\n```\n"
  },
  {
    "path": "website/src/pages/docs/integrations/federation.mdx",
    "content": "---\ndescription: Generate TypeScript resolvers signatures for your GraphQL schema. Supports Apollo Federation.\n---\n\n# Apollo Federation\n\nThe `typescript-resolvers` plugin also supports [Apollo Federation](https://apollographql.com/docs/apollo-server/federation/introduction).\n\nTo use it, add `federation: true{:ts}` to your configuration:\n\n```ts {6-7}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  generates: {\n    './src/types.ts': {\n      plugins: ['typescript', 'typescript-resolvers'],\n      config: { federation: true }\n    }\n  }\n}\nexport default config\n```\n\nIt will add the required GraphQL directives to your codegen schema and generate a compatible resolvers signature for [Apollo Federation](https://the-guild.dev/graphql/hive/federation).\n"
  },
  {
    "path": "website/src/pages/docs/integrations/gatsby.mdx",
    "content": "---\ndescription: GraphQL Code Generator is a tool for generating code based on your GraphQL schema and operations.\n---\n\n# Gatsby\n\nIf you build apps using [Gatsby](https://gatsbyjs.com), you can use its built-in feature called [GraphQL Typegen](https://gatsbyjs.com/docs/how-to/local-development/graphql-typegen). Under the hood it uses the GraphQL Code Generator to generate TypeScript types, but you don't need to set anything up other than enabling an option.\n\nIt also sets up everything needed for [GraphQL Config](https://graphql-config.com).\n\n## Community Plugins\n\nGatsby's GraphQL Typegen feature is solving most common use cases. If you find yourself limited by its features you should open a feature request or trying using one of these community plugins:\n\n- [gatsby-plugin-typegen](https://github.com/cometkim/gatsby-plugin-typegen)\n"
  },
  {
    "path": "website/src/pages/docs/integrations/prettier.mdx",
    "content": "---\ndescription: Learn how to use Prettier and other linters with GraphQL Code Generator to apply your custom code style and formatting rules.\n---\n\nimport { Callout } from '@theguild/components'\n\n# Prettier & Linters\n\nThe codegen supports lifecycle hooks, and you can use those for integration with Prettier or other linters, to apply your custom code style and formatting rules.\n\nBefore adding a hook, consider the alternative of having codegen ignored in your linting.\nCodegen files should not be edited manually and formatting them slows down your codegen considerably.\nDifferences can be measured in several seconds for every run on big projects.\n\n[You can read the complete documentation of lifecycle hooks here](/docs/config-reference/lifecycle-hooks)\n\n## Prettier\n\n<Callout type=\"warning\">\n\n**Using `--check` dry-run mode with prettyfied generated files**\n\nBecause the [`--check` dry-run mode](/docs/config-reference/codegen-config#dry-run-mode) is comparing local files with in-memory generated content, projects that runs Prettier on files generated with codegen will always end-up returning\nall files as stale.\n\n</Callout>\n\nYou can run it per each file:\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  hooks: { afterOneFileWrite: ['prettier --write'] }\n  // ...\n}\nexport default config\n```\n\nOr, for all files together:\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  hooks: { afterAllFileWrite: ['prettier --write'] }\n  // ...\n}\nexport default config\n```\n\nConsider this method if you're using `near-operation-file` preset as this has better performance when writing many files.\n\n## TSLint\n\nYou can run it per each file:\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  hooks: { afterOneFileWrite: ['tslint --fix'] }\n  // ...\n}\nexport default config\n```\n\nOr, for all files together:\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  hooks: { afterAllFileWrite: ['tslint --fix'] }\n  // ...\n}\nexport default config\n```\n\n## ESLint\n\nYou can run it per each file:\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  hooks: { afterOneFileWrite: ['eslint --fix'] }\n  // ...\n}\nexport default config\n```\n\nOr, for all files together:\n\n```ts\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  hooks: { afterAllFileWrite: ['eslint --fix'] }\n  // ...\n}\nexport default config\n```\n"
  },
  {
    "path": "website/src/pages/docs/integrations/vscode.mdx",
    "content": "---\ndescription: Code generation for your GraphQL operations. Generate code from your GraphQL queries, mutations, subscriptions, fragments, and schema.\n---\n\n# VSCode\n\nIn VSCode, you can install a lightweight extension to get your codegen on every save effortlessly.\n\nIt uses your `node_modules/` to prevent any issues with mismatching versions and works well with the `near-operation-file` preset.\n\n- [Extension github](https://github.com/capaj/graphql-codegen-vscode)\n- [Extension marketplace page](https://marketplace.visualstudio.com/items?itemName=capaj.graphql-codegen-vscode)\n"
  },
  {
    "path": "website/src/pages/docs/migration/_meta.ts",
    "content": "export default {\n  'graphql-cli': 'GraphQL-CLI Deprecation',\n  'from-0-18': 'v0.18 -> v1.0',\n  'from-0-13': 'v0.13 -> v0.17',\n  'from-4-0': 'v4.0 -> v5.0',\n  'operations-and-client-preset-from-5-0': 'typescript-operations and client-preset v5.0 -> v6.0',\n  'apollo-tooling': 'Apollo Tooling -> GraphQL Code Generator',\n};\n"
  },
  {
    "path": "website/src/pages/docs/migration/apollo-tooling.mdx",
    "content": "---\ndescription: Migrating from Apollo Tooling (apollo client:codegen) to GraphQL Code Generator. What has changed? How to migrate? What configuration options replace Apollo Tooling's behaviour?\n---\n\nimport { Callout, Tabs } from '@theguild/components'\n\n# Migrating from Apollo Tooling to GraphQL Code Generator\n\n[Apollo Tooling](https://github.com/apollographql/apollo-tooling) (the `apollo` CLI, specifically `apollo client:codegen`) is a code generation tool that generates TypeScript types from GraphQL operations for use with Apollo Client.\n\nThis guide explains how to replace it with [GraphQL Code Generator](https://the-guild.dev/graphql/codegen), which is actively maintained, more flexible, and supports a broader range of use cases.\n\n<Callout>\n  This setup is available in the next major version of `graphql-code-generator` and `graphql-code-generator-community`.\n</Callout>\n\n## Installation\n\nRemove Apollo Tooling and install GraphQL Code Generator:\n\n<Tabs items={['Before', 'After']}>\n<Tabs.Tab>\n```sh npm2yarn\nnpm uninstall apollo\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```sh npm2yarn\nnpm i -D @graphql-codegen/cli @graphql-codegen/typescript-operations @graphql-codegen/near-operation-file-preset\n```\n</Tabs.Tab>\n</Tabs>\n\n### Required packages\n\n| Package                                       | Description                                                        |\n| --------------------------------------------- | ------------------------------------------------------------------ |\n| `@graphql-codegen/cli`                        | Core CLI that runs the code generator                              |\n| `@graphql-codegen/typescript-operations`      | Plugin that generates TypeScript types for GraphQL operations      |\n| `@graphql-codegen/near-operation-file-preset` | Preset that places generated files next to their source operations |\n\n```json filename=\"package.json\"\n{\n  \"devDependencies\": {\n    ...\n    \"@graphql-codegen/cli\": \"...\",\n    \"@graphql-codegen/typescript-operations\": \"...\",\n    \"@graphql-codegen/near-operation-file-preset\": \"...\"\n    ...\n  }\n}\n```\n\n## Configuration\n\nApollo Tooling is configured via `apollo.config.js` (or `apollo.config.ts`) and invoked with `apollo client:codegen`. GraphQL Code Generator uses a `codegen.ts` file and is invoked with `graphql-codegen`.\n\n<Tabs items={['Before', 'After']}>\n<Tabs.Tab>\n```js filename=\"apollo.config.js\"\nmodule.exports = {\n  client: {\n    service: {\n      name: 'my-service',\n      localSchemaFile: './schema.graphql',\n    },\n    includes: ['./src/**/*.tsx', './src/**/*.ts'],\n  },\n}\n```\n\n```sh\napollo client:codegen --target=typescript --outputFlat src/__generated__/types.ts\n```\n\n</Tabs.Tab>\n\n<Tabs.Tab>\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: './schema.graphql',\n  documents: ['./src/**/*.{ts,tsx}', '!./src/**/__generated__/**'],\n  generates: {\n    './src/': {\n      preset: 'near-operation-file',\n      presetConfig: {\n        extension: '.ts',\n        folder: '__generated__',\n        filePerOperation: true,\n        inGeneratesOnly: true\n      },\n      plugins: ['typescript-operations'],\n      config: {\n        namingConvention: 'keep',\n        extractAllFieldsToTypesCompact: true,\n        printFieldsOnNewLines: true,\n        enumType: 'native',\n        nonOptionalTypename: true,\n        skipTypeNameForRoot: true,\n        omitOperationSuffix: true,\n        fragmentSuffix: '',\n        generatesOperationTypes: true,\n        defaultScalarType: 'any'\n      }\n    }\n  }\n}\n\nexport default config\n```\n\n```sh\ngraphql-codegen\n```\n\n</Tabs.Tab>\n</Tabs>\n\nAdd a script to your `package.json` to run the code generator:\n\n```json filename=\"package.json\"\n{\n  \"scripts\": {\n    \"codegen\": \"graphql-codegen\"\n  }\n}\n```\n\n## Per-file generation with `near-operation-file`\n\nApollo Tooling's default behaviour is to generate one TypeScript file per graphql operation, placed in a `__generated__` folder next to the source.\nFor example, given `src/Component.ts` containing a query `GetUser`, Apollo Tooling produces `src/__generated__/GetUser.ts`.\n\nGraphQL Code Generator replicates this with the [`near-operation-file` preset](https://the-guild.dev/graphql/codegen/plugins/presets/near-operation-file-preset).\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: './schema.graphql',\n  documents: ['./src/**/*.{ts,tsx}', '!./src/**/__generated__/**'],\n  generates: {\n    './src/': {\n      preset: 'near-operation-file',\n      presetConfig: {\n        extension: '.ts', // Extension for generated files\n        folder: '__generated__', // Generated files go into __generated__/ subfolder\n        filePerOperation: true, // Generate type files per-operation (not per-component)\n        inGeneratesOnly: true // Only generate files defined in `generates` scan paths (don't generate for all `documents`)\n      },\n      plugins: ['typescript-operations']\n    }\n  }\n}\n\nexport default config\n```\n\nWith this configuration, `src/Component.ts` → `src/__generated__/GetUser.ts`, matching Apollo Tooling's output structure exactly.\n\nIf you need to generate files per-component (default to GraphQL Codegen), remove the following\nconfig option: `filePerOperation: true` (or set it to `false`). Then, the output will be:\n`src/Component.ts` → `src/__generated__/Component.ts`\n\n## Type naming conventions\n\nApollo Tooling generates type names using **only field names**, omitting the GraphQL object type name:\n\n```ts\n// Apollo Tooling output\nexport type GetUserQuery_user = { ... };\nexport type GetUserQuery_user_address = { ... };\n```\n\nTo achieve similar naming with GraphQL Codegen use the `extractAllFieldsToTypesCompact: true` configuration option:\n\n```ts filename=\"codegen.ts\"\nconst config: CodegenConfig = {\n  schema: './schema.graphql',\n  documents: ['./src/**/*.{ts,tsx}', '!./src/**/__generated__/**'],\n  generates: {\n    './src/': {\n      preset: 'near-operation-file',\n      presetConfig: {\n        extension: '.ts',\n        folder: '__generated__',\n        filePerOperation: true,\n        inGeneratesOnly: true\n      },\n      plugins: ['typescript-operations'],\n      config: {\n        extractAllFieldsToTypesCompact: true\n      }\n    }\n  }\n}\n```\n\n## Enum types\n\nApollo Tooling generates enums as native TypeScript `enum` declarations and references them directly by name (without any namespace prefix):\n\n```ts\n// Apollo Tooling output\nexport enum UserManagerRoleType {\n  ROLE_TYPE_1 = 'ROLE_TYPE_1',\n  ROLE_TYPE_2 = 'ROLE_TYPE_2',\n  ROLE_TYPE_3 = 'ROLE_TYPE_3'\n}\n\nexport type GetUserQuery_user_manager = {\n  roleType: UserManagerRoleType\n}\n```\n\nGraphQL Code Generator generates string literal union types by default. To produce native `enum` declarations matching Apollo Tooling's output, set `enumType: 'native'`:\n\n```ts filename=\"codegen.ts\"\nconst config: CodegenConfig = {\n  schema: './schema.graphql',\n  documents: ['./src/**/*.{ts,tsx}', '!./src/**/__generated__/**'],\n  generates: {\n    './src/': {\n      preset: 'near-operation-file',\n      presetConfig: {\n        extension: '.ts',\n        folder: '__generated__',\n        filePerOperation: true,\n        inGeneratesOnly: true\n      },\n      plugins: ['typescript-operations'],\n      config: {\n        extractAllFieldsToTypesCompact: true,\n        namingConvention: 'keep',\n        enumType: 'native'\n      }\n    }\n  }\n}\n```\n\n<Callout type=\"warning\">\n  Native TypeScript `enum` declarations incur a runtime cost (they compile to JavaScript objects). If you only need\n  type-level checking, consider using the default `string-literal` enum type instead:\n\n```ts\ntype UserManagerRoleType = 'ROLE_TYPE_1' | 'ROLE_TYPE_2' | 'ROLE_TYPE_3'\n```\n\nSee the [typescript-operations configuration reference](https://the-guild.dev/graphql/codegen/plugins/typescript/typescript-operations#enumtype) for all available enum type options.\n\n</Callout>\n\n## Recommended configuration\n\nBelow is a configuration that produces output closely matching Apollo Tooling's behaviour, including per-file generation, enum output, and type naming:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: './schema.graphql',\n  documents: ['./src/**/*.{ts,tsx}', '!./src/**/__generated__/**'],\n  generates: {\n    './src/': {\n      preset: 'near-operation-file',\n      presetConfig: {\n        extension: '.ts',\n        folder: '__generated__',\n        // Generate type files per-operation (not per-component)\n        filePerOperation: true,\n        // Only generate files defined in `generates` scan paths (don't generate for all `documents`)\n        inGeneratesOnly: true\n      },\n      plugins: ['typescript-operations'],\n      config: {\n        // Keep original naming as-is (no camelCase conversion)\n        namingConvention: 'keep',\n        // Extract nested field types to named types (matches Apollo Tooling naming)\n        extractAllFieldsToTypesCompact: true,\n        // Print each field on its own line for readability\n        printFieldsOnNewLines: true,\n        // Use native TypeScript enums (matches Apollo Tooling enum output)\n        enumType: 'native',\n        // Always include __typename in result types\n        nonOptionalTypename: true,\n        // Don't add __typename to root query/mutation/subscription types\n        skipTypeNameForRoot: true,\n        // Don't add 'Query'/'Mutation'/'Subscription' suffixes to operation result types\n        omitOperationSuffix: true,\n        // Don't add 'Fragment' suffix to fragment result types\n        fragmentSuffix: '',\n        generatesOperationTypes: true,\n        // Default is 'unknown'; to match Apollo tooling we need to put 'any'\n        defaultScalarType: 'any'\n      }\n    }\n  }\n}\n\nexport default config\n```\n\n## Manual changes\n\nThe setup above closely mimics Apollo Tooling but isn’t an exact match. The following items may require manual fixes:\n\n1. Nested field types naming.\n\nIn very rare cases, the names generated by GraphQL Codegen don’t match Apollo Tooling’s. Update these cases manually.\n\n2. Enum file location.\n\nOccasionally, GraphQL Codegen places enums in a different file then Apollo Tooling. If an enum is missing, check nearby generated files and adjust your imports accordingly.\n\n3. `is possibly null` and `has any type` typecheck bugs.\n\nThese bugs has to be fixed.\n\nFor `is possibly null` bug, asserting for not null or adding `!` will fix most cases:\n\n```\n  getUser.name -> getUser!.name\n```\n\nFor `has any type` bug - a proper type needs to be determined.\n\n4. Mismatch between `Type | null` and `Type | null | undefined`.\n\nExperiment with the following configuration options to keep your codebase changes to a minimum:\n\n```\n  maybeValue: defaults to 'T | null', set to 'T | null | undefined' if necessary\n  inputMaybeValue: defaults to 'Maybe<T>', set to 'T | null | undefined' if necessary\n  avoidOptionals: Replaces ? optional modifier with explicit Maybe<T>. Supports granular control via object form.\n  allowUndefinedQueryVariables: Adds | undefined to Query operation variable types (not Mutation/Subscription)\n  optionalResolveType: Makes __resolveType optional (__resolveType?) in resolver types.\n  nullability:  When errorHandlingClient: true, adjusts nullability for fields marked with @semanticNonNull directive (requires graphql-sock).\n```\n\n5. Extra `__typename` present, or required `__typename` missing.\n\nExperiment with the following configuration options to keep your codebase changes to a minimum:\n\n```\n  skipTypename: prevents adding __typename to generated types unless explicitly in the selection set.\n  skipTypeNameForRoot: skips __typename specifically for root types (Query, Mutation, Subscription). Ignored if __typename is explicitly in the selection set\n  nonOptionalTypename: always adds __typename and makes it a required (non-optional) field.\n  addTypenameToSelectionSets: injects __typename directly into the generated document node selection sets.\n  resolversNonOptionalTypename: makes __typename non-optional in resolver mappings without affecting base types. Supports granular control via object form.\n```\n\n## Further reading\n\n- [GraphQL Code Generator configuration reference](https://the-guild.dev/graphql/codegen/docs/config-reference/codegen-config)\n- [typescript-operations plugin documentation](https://the-guild.dev/graphql/codegen/plugins/typescript/typescript-operations)\n- [near-operation-file preset documentation](https://the-guild.dev/graphql/codegen/plugins/presets/near-operation-file-preset)\n"
  },
  {
    "path": "website/src/pages/docs/migration/from-0-13.mdx",
    "content": "---\ndescription: Migrating from 0.13 to 0.18. What has changed? How to migrate? What are the new features?\n---\n\nimport { Callout } from '@theguild/components'\n\n# Migration from 0.13 to 0.18\n\n## What has changed?\n\nIn >= 0.14 we changed the way you pass configuration to GraphQL Code Generator.\n\nIn the previous versions of the code-generator, the configuration was confusing and passed through 3 ways: CLI flags, config file `gql-gen.json` and environment variables.\n\nIt became very confusing and difficult to use, so we decided to merge all existing configurations into a single `.yml` file – `codegen.yml`.\n\n## How to migrate?\n\nTo migrate from GraphQL Code Generator v0.13 API to >=0.14, just start by installing the latest version of `graphql-code-generator` from NPM.\n\nThen, run your existing `gql-gen …` command as is. You'll see a warning about your current usage.\n\nThe new CLI makes it much easier – it will show you how your `codegen.yml` file should look according to your usage with the old API:\n\n![CLI Migration](/assets/img/v13-migration-cli.gif)\n\nNow, create a file called `codegen.yml` with the content that the codegen suggests for you.\n\nNext, update your NPM scripts to run `graphql-codegen` only, without any cli-flags:\n\n```json filename=\"package.json\"\n{\n  \"name\": \"my-project\",\n  \"scripts\": {\n    \"generate\": \"graphql-codegen\"\n  }\n}\n```\n\nNow, replace your deprecated `templates` packages with the new `plugins` packages.\n\nFor example, if you were using `graphql-codegen-typescript-template`, you should replace it with: `graphql-codegen-typescript`, and `graphql-codegen-typescript-operations`.\n\n<Callout>\n  Note sure which new packages you need to use now? [You can take a look\n  here](https://github.com/dotansimha/graphql-code-generator/tree/master/packages/old-templates). Under each directory\n  you'll find a `package.json` pointing to the new packages names.\n</Callout>\n"
  },
  {
    "path": "website/src/pages/docs/migration/from-0-18.mdx",
    "content": "---\ndescription: Migrating to 1.0.0. What has changed? How to migrate? What are the new features?\n---\n\nimport { Callout, Tabs } from '@theguild/components'\n\n# Migration to 1.0.0\n\n## What has changed?\n\nOur goals (and achievements) for 1.0.0 release was:\n\n- Rename all package from `graphql-codegen-…` to scoped packages `@graphql-codegen/…`\n- Stabilize the core package and the YML configuration file\n- Remove the old, deprecated code from this repository (everything related to `flattenDocuments` and `buildSchemaContext`)\n- Separate the CLI package from the core package, and create an easy-to-use and easy-to-consume core package\n- Add better support for running the codegen in non-node environments, by clearing unused dependencies and add support for tree shaking\n- Remove the dependency for Handlebars from this repository\n- Introduce a new, easy-to-use common base for plugins, based on `Visitor` pattern, that uses `visit` from `graphql` package\n- Better unit tests for all plugins packages, by use TypeScript compiler to compile each test result- makes it much easier to detect mismatches and invalid output\n- Refactor the entire TypeScript plugin, and create better and optimized output\n- Fix most of the GitHub issues\n- Update website and documentation for all plugins\n\n### New TypeScript Libraries\n\nDuring the refactor, we rewrote all TypeScript-related plugins. By doing that, we introduced some breaking changes.\n\nBefore those changes, you had to depend on `typescript-common` plugin, and add `typescript-server` and `typescript-client` (and others) on top of it.\n\nNow, `typescript` plugin is the plugin you need to use for backend (it combines `typescript-common` and `typescript-server`), and use `typescript-operations` on top of it for the client-side.\n\nThe reason for this change is the fact that now `typescript-operations` uses `Pick<>` to create the client-side types, instead of generating tons of `namespace`s and `interface`s.\n\n## How to migrate?\n\nFirst, the new packages have a different name, that means that you need to manually update those packages names, and not just it's version.\n\nThe `graphql-code-generator` package is now `@graphql-codegen/cli` and all other packages has been changes from `graphql-codegen-…` to `@graphql-codegen/…`.\n\nSo start by updating your `package.json`:\n\n<Tabs items={['Before', 'After']}>\n<Tabs.Tab>\n```json filename=\"package.json\"\n{\n  \"devDependencies\": {\n    \"graphql-code-generator\": \"0.18.0\",\n    \"graphql-codegen-typescript-common\": \"0.18.0\",\n    \"graphql-codegen-typescript\": \"0.18.0\",\n    \"graphql-codegen-typescript-documents\": \"0.18.0\"\n  }\n}\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```json filename=\"package.json\"\n{\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^1.0.0\",\n    \"@graphql-codegen/typescript\": \"^1.0.0\",\n    \"@graphql-codegen/typescript-operations\": \"^1.0.0\"\n  }\n}\n```\n</Tabs.Tab>\n</Tabs>\n\nAlso, make sure to update your YML config file:\n\n<Tabs items={['Before', 'After']}>\n<Tabs.Tab>\n```yaml\n./my-file.ts:\n  schema: schema.json\n  plugins:\n    - typescript-common\n    - typescript-server\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```yaml\n./my-file.ts:\n  schema: schema.json\n  plugins:\n    - typescript\n```\n</Tabs.Tab>\n</Tabs>\n\nAnd for client-side:\n\n<Tabs items={['Before', 'After']}>\n<Tabs.Tab>\n```yaml\n./my-file.ts:\n  schema: schema.json\n  plugins:\n    - typescript-common\n    - typescript-client\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```yaml\n./my-file.ts:\n  schema: schema.json\n  plugins:\n    - typescript\n    - typescript-operations\n```\n</Tabs.Tab>\n</Tabs>\n\n## Breaking Changes & Semver\n\nWe tried to avoid breaking changes, but it's not always possible. We had a lot of issues we couldn't fix before because we didn't want to introduce breaking changes.\n\nIt was very hard for us to track breaking changes in the past, but it it's easier for us, and we promise to be semver-compatible.\n\nYou can find a list of all breaking changes in [GitHub Releases page](https://github.com/dotansimha/graphql-code-generator/releases).\n\nWe also created a new plugin, called `typescript-compatibility` that generates backward compatibility for the `typescript-operations` and `typescript-react-apollo` plugins.\nIt will generates for you types that are pointing to the new form of types. It supports _most_ of the use-cases.\n\nTo use it, start by installing from NPM:\n\n```sh npm2yarn\nnpm i -D @graphql-codegen/typescript-compatibility\n```\n\nThen, add it to your codegen configuration:\n\n```yaml\n./my-file.ts:\n  schema: schema.json\n  plugins:\n    - typescript\n    - typescript-operations\n    - typescript-compatibility\n```\n\n<Callout>\n  If `typescript-react-apollo` plugin also specified in your config file, it will generate backward-compatibility for\n  it.\n</Callout>\n"
  },
  {
    "path": "website/src/pages/docs/migration/from-4-0.mdx",
    "content": "---\ndescription: Migrating to 5.0.0. What has changed? How to migrate? What are the new features?\n---\n\nimport { Tabs } from '@theguild/components'\n\n# Migration to 5.0.0\n\n## What has changed?\n\nThere was an outstanding issue with `@parcel/watcher` which prevented it to be installed in certain environments, or needed an extra amount of dependencies to be built.\nThis release focuses on improving the usage of `@graphql-codegen/cli` in those environments by making it an optional peer dependency.\nNPM (or Yarn) will not emit errors when an optional peer dependency is missing.\n\n## How to migrate?\n\nTo use `@graphql-codegen/cli`'s watch mode (based on @parcel/watcher) you need to provide it in a package that uses `@graphql-codegen/cli` from now on.\n\nStart by updating your package.json\n\n<Tabs items={['Before', 'After']}>\n<Tabs.Tab>\n```json filename=\"package.json\"\n{\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^1.0.0\",\n    \"@graphql-codegen/typescript\": \"^1.0.0\",\n    \"@graphql-codegen/typescript-operations\": \"^1.0.0\"\n  }\n}\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```json filename=\"package.json\"\n{\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^1.0.0\",\n    \"@graphql-codegen/typescript\": \"^1.0.0\",\n    \"@graphql-codegen/typescript-operations\": \"^1.0.0\",\n    \"@parcel/watcher\": \"^2.1.0\"\n  }\n}\n```\n</Tabs.Tab>\n</Tabs>\n\nIf you had issues with `@parcel/watcher` previously, you can make NPM and Yarn silently discard any build errors, by using `optionalDependencies` instead:\n\n<Tabs items={['Before', 'After', 'After (Alternative)']}>\n<Tabs.Tab>\n```json filename=\"package.json\"\n{\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^1.0.0\",\n    \"@graphql-codegen/typescript\": \"^1.0.0\",\n    \"@graphql-codegen/typescript-operations\": \"^1.0.0\"\n  }\n}\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```json filename=\"package.json\"\n{\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^1.0.0\",\n    \"@graphql-codegen/typescript\": \"^1.0.0\",\n    \"@graphql-codegen/typescript-operations\": \"^1.0.0\"\n  },\n  \"optionalDependencies\": {\n    \"@parcel/watcher\": \"^2.1.0\"\n  }\n}\n```\n</Tabs.Tab>\n\n<Tabs.Tab>\n```json filename=\"package.json\"\n{\n  \"devDependencies\": {\n    \"@graphql-codegen/cli\": \"^1.0.0\",\n    \"@graphql-codegen/typescript\": \"^1.0.0\",\n    \"@graphql-codegen/typescript-operations\": \"^1.0.0\",\n    \"@parcel/watcher\": \"^2.1.0\"\n  },\n  \"dependenciesMeta\": {\n    \"@parcel/watcher\": {\n      \"optional\": true\n    }\n  }\n}\n```\n</Tabs.Tab>\n</Tabs>\n"
  },
  {
    "path": "website/src/pages/docs/migration/graphql-cli.mdx",
    "content": "import { Callout } from '@theguild/components'\n\n# GraphQL-CLI Deprecation\n\nThe `GraphQL-CLI` is no longer maintained, and we recommend using the `GraphQL-Codegen` CLI directly instead.\n\n<Callout type=\"warning\">The plugin `@graphql-cli/codegen` is deprecated, and no longer maintained!</Callout>\n\n## Migrating from GraphQL-CLI to Codegen CLI\n\nThe Codegen plugin for `GraphQL-CLI` was wrapping the commands implemented in GraphQL-CLI, in order to provide a unified experience. You can switch to use GraphQL-Codegen CLI directly.\n\nRemove `@graphql-cli/codegen` and [install the GraphQL Codegen CLI (`@graphql-codegen/cli`)](/docs/getting-started/installation). Then migration your commands to use the Codegen CLI directly:\n\nBefore:\n\n```\ngraphql generate\n```\n\nAfter:\n\n```\ngraphql-codegen\n```\n"
  },
  {
    "path": "website/src/pages/docs/migration/operations-and-client-preset-from-5-0.mdx",
    "content": "---\ndescription: Migrating `typescript-operations` and `client-preset` from v5 to v6. What has changed? How to migrate? What are the new features?\n---\n\n<style global jsx>\n  {`\n    [data-highlighted-line-id='lineremoved'] {\n      background: #7f1d1d4d;\n    }\n  `}\n</style>\n\nimport { Callout } from '@theguild/components'\n\n# Migrating to `typescript-operations` and `client-preset` v6.0\n\n<Callout type=\"default\">\n  This major version has not been released yet. You can find upcoming changes and alpha releases in the [feature\n  branch](https://github.com/dotansimha/graphql-code-generator/pull/10496).\n</Callout>\n\n## What's new?\n\n`typescript-operations` and `client-preset` v6.0 come with a major overhaul of type generation and config to improve developer experience.\n\n1. Type generation and usage changes\n2. Configuration and dependency changes\n3. Other bug fixes and quality of life improvements\n\nFor the most important changes, read the [Breaking changes](#breaking-changes) section.\n\nFor a full list of changes, see the CHANGELOG.\n\n## Installation\n\nInstall the latest versions of the official plugins in your dependencies:\n\n```sh npm2yarn\nnpm i -D @graphql-codegen/cli@latest @graphql-codegen/typescript-operations@latest @graphql-codegen/client-preset@latest\n```\n\n<Callout type=\"warning\">\n  GraphQL Codegen packages share a lot of code internally, so if you have explicitly installed other official packages\n  (such as `@graphql-codegen/visitor-plugin-common` or `@graphql-codegen/typescript-resolvers`) in the same repo, be\n  sure to update them at the same time to avoid unexpected issues.\n</Callout>\n\n## Migration\n\n### `client-preset`\n\n`client-preset` already applies the recommended setup, so you won't have to make any changes to the default config:\n\n```typescript filename=\"codegen.ts\"\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'src/gql/': {\n      preset: 'client'\n    }\n  }\n}\n```\n\n### `typescript-operations`\n\n`typescript-operations` can be used in a variety of custom setups. This section explains the changes in the most popular setup.\n\n#### One-file setup\n\nPreviously, this setup required the `typescript` plugin and generated all schema and Operation types into a single file.\n\nNow, you can remove the `typescript` plugin, as `typescript-operations` works by itself. It also only generates Input, Enum, and Operation types that are actually used.\n\n```typescript filename=\"codegen.ts\" {5}#lineremoved {6}\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'src/graphql/types.generated.ts': {\n      plugins: ['typescript', 'typescript-operations'],\n      plugins: ['typescript-operations']\n    }\n  }\n}\n```\n\n#### Multi-file setup\n\nSome repos may have multiple Codegen projects, each generating types for operations within its scope. In such cases, users may want to reuse the base Input and Enum types generated by the `typescript` plugin with the [import-types preset](https://the-guild.dev/graphql/codegen/plugins/presets/import-types-preset):\n\n```typescript filename=\"codegen.ts\"\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'src/graphql/base-types.generated.ts': {\n      plugins: ['typescript']\n    },\n    'src/project-1/types.generated.ts': {\n      documents: 'src/project-1/**/*.graphql.ts',\n      preset: 'import-types',\n      plugins: ['typescript-operations'],\n      presetConfig: {\n        typesPath: '../graphql/base-types.generated.ts'\n      }\n    },\n    'src/project-2/types.generated.ts': {\n      documents: 'src/project-2/**/*.graphql.ts',\n      preset: 'import-types',\n      plugins: ['typescript-operations'],\n      presetConfig: {\n        typesPath: '../graphql/base-types.generated.ts'\n      }\n    }\n  }\n}\n```\n\nNow, it is possible to do this with just `typescript-operations`, as it supports this approach using its own `generateOperationTypes` and `importSchemaTypesFrom` options:\n\n```typescript filename=\"codegen.ts\" {8} {15} {22}\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'src/graphql/base-types.generated.ts': {\n      documents: 'src/**/*.graphql.ts' // Parses all files with GraphQL documents to generate Enum and Input types that are used by every project\n      plugins: ['typescript-operations'],\n      config: {\n        generateOperationTypes: false, // `generateOperationTypes:false` means only Input, Enum and shared utility types are generated\n      }\n    },\n    'src/project-1/types.generated.ts': {\n      documents: 'src/project-1/**/*.graphql.ts', // Only parses GraphQL documents within project-1's scope\n      plugins: ['typescript-operations'],\n      config: {\n        importSchemaTypesFrom: 'src/shared/base-types.generated.ts', // this path is relative to Codegen config location (unlike `typesPath` in the old setup)\n      }\n    },\n    'src/project-2/types.generated.ts': {\n      documents: 'src/project-2/**/*.graphql.ts', // Only parses GraphQL documents within project-2's scope\n      plugins: ['typescript-operations'],\n      config: {\n        importSchemaTypesFrom: 'src/shared/base-types.generated.ts',\n      },\n    }\n  }\n}\n```\n\n#### near-operation-file-preset setups\n\n[near-operation-file-preset](https://the-guild.dev/graphql/codegen/plugins/presets/near-operation-file-preset) is commonly used to generate a file next to operation document a.k.a. near-operation file.\n\nPreviously, shared types were always generated into a shared file using the `typescript` plugin, and reused in every near-operation file:\n\n```typescript filename=\"codegen.ts\"\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'src/graphql/base-types.generated.ts': {\n      plugins: ['typescript']\n    },\n    'src/': {\n      preset: 'near-operation-file',\n      presetConfig: {\n        baseTypesPath: './graphql/base-types.generated.ts'\n      },\n      plugins: ['typescript-operations']\n    }\n  }\n}\n```\n\nNow, it is still possible to reuse shared types, but with the decoupling from the `typescript` plugin, we can just use `typescript-operations` for both base type and operation type generation.\n\n```typescript filename=\"codegen.ts\"\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'src/graphql/base-types.generated.ts': {\n      plugins: ['typescript-operations'],\n      config: {\n        generateOperationTypes: false\n      }\n    },\n    'src/': {\n      preset: 'near-operation-file',\n      plugins: ['typescript-operations'],\n      config: {\n        importSchemaTypesFrom: 'src/graphql/base-types.generated.ts'\n      }\n    }\n  }\n}\n```\n\nAlternatively, base types and operation types can all be generated into every near-operation file:\n\n```typescript filename=\"codegen.ts\"\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'src/': {\n      preset: 'near-operation-file',\n      plugins: ['typescript-operations']\n    }\n  }\n}\n```\n\n## Breaking changes\n\n### 1. Object types are no longer generated\n\nPreviously, Object types from the schema were generated via the `typescript` plugin, for example:\n\n```ts\n// Example of a schema User Object type being previously generated\nexport type User = {\n  __typename?: 'User'\n  id: Scalars['ID']['output']\n  name: Scalars['String']['output']\n}\n```\n\nThese types contain _all_ the fields from the schema. However, GraphQL operations are _not_ expected to fetch all fields, so Object types should never be used. Instead, Operation types (Variables and Result) are generated based on the fields in the documents so these should be used.\n\nIn reality, generated Object types were often used (intentionally or accidentally) in application code because they were generated.\n\nNow, Object types are no longer generated. This prevents accidental misuse of schema types in client code and ensures all types accurately reflect actual query selections.\n\nIf you need schema types for any reason, please generate them using the `typescript` plugin in a separate file.\n\n### 2. Args types are no longer generated\n\nArgs types are only used for server use cases, so they are no longer generated for client use cases.\n\n### 3. Scalar types are no longer generated as a reusable type\n\nPreviously, Scalar types from the schema were generated into an object and reused in Variables types:\n\n```typescript\n// All native and custom scalars found in the schema were previously generated\nexport type Scalars = {\n  ID: { input: string | number; output: string }\n  String: { input: string; output: string }\n  Boolean: { input: boolean; output: boolean }\n  Int: { input: number; output: number }\n  Float: { input: number; output: number }\n}\n```\n\nNow, scalars in Input and Variables types are consistently inlined (similar to Result types) to avoid the `Scalar` utility type:\n\n```typescript filename=\"types.generated.ts\" {1-7}#lineremoved {10}#lineremoved {11} {15}#lineremoved {16}\nexport type Scalars = {\n  ID: { input: string | number; output: string }\n  String: { input: string; output: string }\n  Boolean: { input: boolean; output: boolean }\n  Int: { input: number; output: number }\n  Float: { input: number; output: number }\n}\n\nexport type UserInput = {\n  id: Scalars['ID']['input']\n  id: string | number\n}\n\nexport type UserVariables = Exact<{\n  id: Scalars['ID']['input']\n  id: string | number\n}>\n```\n\n### 4. Input and Enum types are only generated when used\n\nPreviously, all Input and Enum types were generated, even if they were not used. This could increase bundle size when Enums that incur runtime cost (e.g. native TypeScript enum or const enum) are used.\n\nNow, only Input and Enum types used in operations are generated.\n\n### 5. `__typename` is only generated when used\n\nPreviously, `__typename` fields in Result types are generated as optional by default, even when they were not requested:\n\n```graphql\nquery User {\n  user {\n    # Note: __typename is not in the selection set\n    id\n  }\n}\n```\n\nPreviously, the above operation resulted in a type with optional `__typename`:\n\n```typescript {3}\nexport type UserQuery = {\n  user: {\n    __typename?: 'User'\n    id: string\n  }\n}\n```\n\nNow, `__typename` is not generated by default when it is not in the selection set:\n\n```typescript {3}#lineremoved\nexport type UserQuery = {\n  user: {\n    __typename?: 'User'\n    id: string\n  }\n}\n```\n\n<Callout>\n  Some clients, such as Apollo Client, automatically request `__typename`. To achieve the same behaviour, you can\n  continue to use `skipTypeNameForRoot` and `nonOptionalTypename` options to configure expected type behaviours.\n</Callout>\n\n### 6. Document field types are generated to correctly match runtime expectations\n\nPreviously, nullable fields in Result types were generated as optional by default:\n\n```typescript {3}\nexport type UserQuery = {\n  user: {\n    age?: string | null\n  }\n}\n```\n\nNow, nullable fields in Result types are never optional (except in some cases e.g. when `@defer`, `@skip`, or `@include` are used)\n\n```typescript {3}#lineremoved {4}\nexport type UserQuery = {\n  user: {\n    age?: string | null\n    age: string | null\n  }\n}\n```\n\n### 7. Enum config options are consolidated and the default value is changed\n\nPreviously, there were 4 boolean options to set which Enum variant to generate. When combined, these options overrode one another, leading to unexpected and confusing behaviour.\n\nNow, `enumType` is the only config option to use. The default has also been changed to `string-literal`, as it is the only option that does not incur runtime cost.\n\n| Enum type      | Examples                                                                     | Previous config              | New config                            |\n| -------------- | ---------------------------------------------------------------------------- | ---------------------------- | ------------------------------------- |\n| String literal | `type UserRole = 'Admin' \\| 'Customer'`                                      | `{enumsAsTypes:true}`        | `{}` or `{enumType:'string-literal'}` |\n| Const          | `export const UserRole = { Admin: 'ADMIN', Customer: 'CUSTOMER' } as const;` | `{enumsAsConst:true}`        | `{enumType:'const'}`                  |\n| Native         | `export enum UserRole { Admin = 'ADMIN', Customer = 'CUSTOMER' };`           | `{}` or `{constEnums:false}` | `{enumType:'native'}`                 |\n| Native const   | `export const enum UserRole { Admin = 'ADMIN', Customer = 'CUSTOMER' };`     | `{constEnums:true}`          | `{enumType:'native-const'}`           |\n| Native numeric | `export enum UserRole { Admin = 0, Customer = 1 }`                           | `{numericEnums:true}`        | `{enumType:'native-numeric'}`         |\n\n### 8. `avoidOptionals` option is updated to only handle Operation types\n\nPreviously, `avoidOptionals` was shared with the [typescript plugin](https://the-guild.dev/graphql/codegen/plugins/typescript/typescript#avoidoptionals). As a result, some inner options did not affect Operation types (such as `avoidOptionals.resolvers`, `avoidOptionals.query`, `avoidOptionals.mutation`, `avoidOptionals.subscription`).\n\nNow, there are only 3 inner options, and when enabled, each forces the respective use case to pass non-optional values.\n\n- `avoidOptionals.variableValue`\n- `avoidOptionals.inputValue`\n- `avoidOptionals.defaultValue`\n\nNote that the default is `false`, and you can still use `avoidOptionals:true` to turn on all options, without having to set each one individually.\n\n### 9. `preResolveTypes` option is removed\n\nThe `preResolveTypes` option was used to generate Result types inline (`preResolveTypes:false`) or use the ones generated by the `typescript` plugin (`preResolveTypes:true`). This approach had several drawbacks:\n\n1. it added dependency to the `typescript` plugin\n2. `true` and `false` had no functional difference for users\n3. keeping this option doubled the maintenance overhead with no real benefits\n\n`preResolveTypes:true` has been the default (and very stable) for a long time. It should be used by the majority of users by now. So, removing this option is expected to have zero or minimal impact on users and reduce the maintenance burden.\n\nIf you are seeing problems, please create an issue [here](https://github.com/dotansimha/graphql-code-generator/issues).\n\n### 10. Legacy utility types are removed\n\nThe following utility types have been removed:\n\n- `Maybe`: used to handle nullability types of fields in Result types. However, field types have been pre-resolved and inlined for a long time, so this type is no longer needed.\n- `InputMaybe`: used to handle nullability types of Input. Input types are now inlined, so this type is no longer needed.\n- `MakeOptional`, `MakeMaybe` and `MakeEmpty`: used to handle `preResolveTypes:false`. However, `preResolveTypes` has been removed, so these types are no longer needed.\n\n### 11. Make `unknown` the default type for custom scalars instead of `any`\n\nPreviously, the default custom Scalars type was `any`, which bypassed typechecking.\n\nNow, the default type is `unknown` to ensure data is handled carefully by users.\n\n### 12. Make `string | number` the default type for the native `ID` scalar\n\nPreviously, one set of default Scalar types was shared between client and server plugins via the `typescript` plugin dependency. This meant it was not possible to set the default for client, as it would complicate the server config, and vice versa. See this [PR for more details](https://github.com/dotansimha/graphql-code-generator/pull/9497).\n\nNow, the `typescript` plugin is no longer a dependency. So, we can set the default type as `string | number`, which is the correct type for client use cases. For more details on how Scalar coercion works here, please read [The Complete GraphQL Scalar Guide](https://the-guild.dev/graphql/hive/blog/the-complete-graphql-scalar-guide#scalar-value-coercion).\n"
  },
  {
    "path": "website/src/pages/index.mdx",
    "content": "---\ntitle: Home\n---\n\nexport { IndexPage as default, getStaticProps } from '../components/index-page'\n"
  },
  {
    "path": "website/src/pages/plugins/_meta.ts",
    "content": "export default {\n  '*': {\n    theme: {\n      layout: 'default',\n    },\n  },\n  typescript: 'TypeScript',\n  presets: 'Presets',\n  java: 'Java',\n  'c-sharp': 'C-Sharp',\n  flow: 'Flow',\n};\n"
  },
  {
    "path": "website/src/pages/plugins/c-sharp/_meta.ts",
    "content": "export default {\n  'c-sharp-operations': 'operations',\n};\n"
  },
  {
    "path": "website/src/pages/plugins/c-sharp/c-sharp-operations.mdx",
    "content": "---\ntitle: c-sharp-operations\ndescription: C# operations plugin. Generates C# methods for the resolvers' signature. Works with GraphQL.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<PluginHeader />\n\nThe `c-sharp-operations` plugin generates C# methods for the resolvers' signature.\n\nIt works with [GraphQL.Client](https://nuget.org/packages/GraphQL.Client) library and methods can be invoked through the `GraphQLHttpClient`.\n\nExample code:\n\n```c#\nusing GraphQL.Client.Http;\nusing GraphQL.Client.Serializer.Newtonsoft;\n\n  ...\n  using var client = new GraphQLHttpClient(\"https://gqlserver\", new NewtonsoftJsonSerializer());\n  var response = await client.SendQueryAsync<Types.Query>(UsersGQL.Request());\n```\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/dart/flutter-freezed.mdx",
    "content": "---\ntitle: flutter-freezed\ndescription: Flutter plugin for generating Dart classes from GraphQL queries. It uses the freezed package.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\nThe `flutter-freezed` plugin generates [Freezed] models using a GraphQL Schema.\n\nPlease refer the [Flutter Freezed Guide](/docs/guides/flutter-freezed) for how to get started with this plugin.\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/flow/_meta.ts",
    "content": "export default {\n  'flow-operations': 'operations',\n  'flow-resolvers': 'resolvers',\n};\n"
  },
  {
    "path": "website/src/pages/plugins/flow/flow-operations.mdx",
    "content": "---\ntitle: flow-operations\ndescription: Flow Operations plugin. This plugin allows you to create and manage operations in your Flow blockchain.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<PluginHeader />\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/flow/flow-resolvers.mdx",
    "content": "---\ntitle: flow-resolvers\ndescription: Flow plugin for GraphQL Code Generator. Generates Flow types for your GraphQL resolvers.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\n<Callout>\n**Quick Start with `flow-resolvers`**\n\nYou can find [a blog post we wrote about using and customizing this plugin here](https://the-guild.dev/blog/better-type-safety-for-resolvers-with-graphql-codegen), it refers to `typescript-resolvers` but everything there is relevant to `flow-resolvers` as well.\n\n</Callout>\n\n## Enum Resolvers\n\n[Apollo-Server](https://apollographql.com/docs/apollo-server) and schemas built with [`graphql-tools`](https://graphql-tools.com) supports creating resolvers for GraphQL `enum`s.\n\nThis is helpful because you can have internal values that are different from the public enum values, and you can use the internal values in your resolvers.\n\nCodegen allows you to specify either `mappers` or `enumValues` to map enums in your resolvers, and if you are using it for enums, you'll get a resolver signature for the enum resolvers as well.\n\n### Usage Example\n\nWith the following schema:\n\n```graphql\ntype Query {\n  favoriteColor: Color!\n}\n\nenum Color {\n  RED\n  BLUE\n}\n```\n\n```yaml\nschema: schema.graphql\ngenerates:\n  ./resolvers-types.js:\n    config:\n      enumValues:\n        Color: ./enums#ColorsCode\n    plugins:\n      - flow\n      - flow-resolvers\n```\n\n```ts filename=\"enums.ts\"\nexport enum ColorsCode {\n  MY_RED = '#FF0000',\n  MY_BLUE = '#0000FF'\n}\n```\n\n```ts filename=\"resolvers.ts\"\nimport type { Resolvers } from './resolvers-types'\nimport { ColorsCode } from './enums'\n\nconst resolvers: Resolvers = {\n  Color: {\n    RED: ColorsCode.MY_RED,\n    BLUE: ColorsCode.MY_BLUE\n  },\n  Query: {\n    favoriteColor: () => ColorsCode.MY_RED // Now you cn return this, and it will be mapped to your actual GraphQL enum\n  }\n}\n```\n\nYou can also define the same with explicit enum values:\n\n```yaml {7-8}\nschema: schema.graphql\ngenerates:\n  ./resolvers-types.js:\n    config:\n      enumValues:\n        Color:\n          RED: '#FF0000'\n          BLUE: '#0000FF'\n    plugins:\n      - flow\n      - flow-resolvers\n```\n\nOr, with `mappers`:\n\n```yaml {5-6}\nschema: schema.graphql\ngenerates:\n  ./resolvers-types.js:\n    config:\n      mappers:\n        Color: ./enums#ColorsCode\n    plugins:\n      - flow\n      - flow-resolvers\n```\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/java/_meta.ts",
    "content": "export default {\n  java: 'java',\n  'java-apollo-android': 'java-apollo-android',\n  'java-resolvers': 'java-resolvers',\n  kotlin: 'kotlin',\n};\n"
  },
  {
    "path": "website/src/pages/plugins/java/java-apollo-android.mdx",
    "content": "---\ntitle: java-apollo-android\ndescription: GraphQL Code Generator plugin for generating Java code for Apollo Android.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\n## Prepare your env\n\nTo get started with these plugins and preset, make sure you have the following installed:\n\n- Node.js (10 or later)\n- NPM or Yarn\n\nRun the following in your Android project:\n\n```sh npm2yarn\nnpm init --yes\nnpm install graphql\nnpm install -D @graphql-codegen/cli @graphql-codegen/java-apollo-android\n```\n\nThen, create `codegen.yml` with the following configuration:\n\n```yaml\nschema: POINT_TO_YOUR_SCHEMA\ndocuments: POINT_TO_YOUR_GRAPHQL_OPERATIONS\ngenerates:\n  ./app/src/main/java/:\n    preset: java-apollo-android\n    config:\n      package: 'com.my.app.generated.graphql'\n      fragmentPackage: 'com.my.app.generated.graphql'\n      typePackage: 'type'\n    plugins:\n      - java-apollo-android\n```\n\n<Callout>Also, make sure to add `node_modules` to your `.gitignore` file.</Callout>\n\nTo integrate with your Gradle build, you can add the following to your app Gradle file:\n\n```\npreBuild.doFirst {\n  def proc = \"yarn graphql-codegen\".execute()\n  proc.waitForProcessOutput(System.out, System.err)\n}\n\nbuild.dependsOn preBuild\n```\n\nThis will make sure to run and generate output before each time you build your project.\n\n## Usage\n\nYou can find a [repository with a working example using AppSync](https://github.com/dotansimha/graphql-codegen-appsync-android-example).\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/java/java-resolvers.mdx",
    "content": "---\ntitle: java-resolvers\ndescription: Java Resolvers Plugin. Generate Java interfaces for your resolvers. Works with graphql-java library.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport JavaInstallation from '@/components/java-installation.mdx'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\nThe `java-resolvers` plugin creates Java `interface`s for the resolvers' signature.\n\nIt works with `graphql-java` library, and it uses it's `DataFetcher` API.\n\nYou can use this plugin to generate interfaces and later implement them, this way you can always tell if one of the fields is missing a resolvers:\n\n```java\nimport com.my.app.generated.Resolvers;\nimport com.my.app.models.User;\nimport graphql.schema.DataFetcher;\n\nexport class QueryResolvers implements Resolvers.Query {\n  public DataFetcher<String> id() {\n    return environment -> environment.<User>getSource().getId();\n  }\n}\n```\n\n<JavaInstallation />\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/java/java.mdx",
    "content": "---\ntitle: java\ndescription: Java plugin. Generate Java classes from your GraphQL schema. Use it in your resolvers.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport JavaInstallation from '@/components/java-installation.mdx'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n<JavaInstallation />\n\n## How to use\n\nYou can use it directly to transform your `input` in your resolvers:\n\n```graphql\ntype Query {\n  user(id: ID!): User!\n}\n\ntype User {\n  id: ID\n}\n```\n\nThen, in your resolver:\n\n```java\nimport com.my.app.generated.Types;\nimport com.my.app.models.User;\nimport graphql.schema.DataFetcher;\n\nexport class QueryResolvers {\n  public DataFetcher<User> user() {\n    return env -> {\n      Types.QueryUserArgs args = new Types.QueryUserArgs(env.getArguments());\n      String userId = args.getId();\n\n      // rest of the code\n    };\n  }\n}\n```\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/java/kotlin.mdx",
    "content": "---\ntitle: kotlin\ndescription: Kotlin plugin for GraphQL Code Generator. Generate Kotlin classes for Enums and Input types.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\nThe `kotlin` plugin generates Kotlin `classes` for Enums and Input types.\n\nYou can use this plugin to generate Java enums based on your GraphQL schema, and it also generates a type-safe Kotlin transformer for GraphQL `input` types.\n\n## Prepare your environment\n\nTo get started with these plugins and preset, make sure you have the following installed:\n\n- Node.js (10 or later)\n- NPM or Yarn\n\nRun the following in your Android project:\n\n```sh npm2yarn\nnpm init --yes\nnpm install graphql\nnpm install -D @graphql-codegen/cli @graphql-codegen/kotlin\n```\n\nThen, create `codegen.yml` with the following configuration:\n\n```yaml\nschema: POINT_TO_YOUR_SCHEMA\ndocuments: POINT_TO_YOUR_GRAPHQL_OPERATIONS\ngenerates:\n  ./app/src/Types.kt:\n    plugins:\n      - kotlin\n```\n\n<Callout>Also, make sure to add `node_modules` to your `.gitignore` file.</Callout>\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/other/_meta.ts",
    "content": "export default {\n  add: 'add',\n  'fragment-matcher': 'fragment-matcher',\n  'hasura-allow-list': 'hasura-allow-list',\n  introspection: 'introspection',\n  jsdoc: 'jsdoc',\n  'reason-client': 'reason-client',\n  'schema-ast': 'schema-ast',\n  time: 'time',\n  'urql-introspection': 'urql-introspection',\n};\n"
  },
  {
    "path": "website/src/pages/plugins/other/add.mdx",
    "content": "---\ntitle: add\ndescription: Adds custom text to your output file. You can use this plugin to add custom code, imports, comments and more to your output file.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\n`add` plugin adds custom text to your output file.\n\nYou can use this plugin to add custom code, imports, comments and more to your output file.\n\n## Examples\n\n```ts filename=\"codegen.ts\" {8-10}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file.ts': {\n      plugins: [\n        {\n          add: {\n            content: '/* eslint-disable */'\n          }\n        },\n        'typescript'\n      ]\n    }\n  }\n}\nexport default config\n```\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file.ts': {\n      plugins: [\n        {\n          add: {\n            content: ['declare namespace GraphQL {']\n          }\n        },\n        {\n          add: {\n            placement: 'append',\n            content: '}'\n          }\n        },\n        'typescript'\n      ]\n    }\n  }\n}\nexport default config\n```\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/other/fragment-matcher.mdx",
    "content": "---\ntitle: fragment-matcher\ndescription: Generate fragment matcher for Apollo Client. This plugin is required for using fragments with Apollo Client.\n---\n\nimport { Callout, Tabs } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\n## How to use?\n\n<Tabs items={['Usage with Apollo Client 3', 'Usage with Apollo Client 2']}>\n<Tabs.Tab>\nIf you are using Apollo Client 3, update your codegen config accordingly, and then use it in your Apollo cache instance:\n\n```ts\nimport { InMemoryCache } from '@apollo/client'\n\n// generated by Fragment Matcher plugin\nimport generatedIntrospection from '../introspection-result'\n\nconst cache = new InMemoryCache({ possibleTypes: generatedIntrospection.possibleTypes })\n```\n\n<Callout>\n[Read more about fragment matcher and its usage on Apollo Client](https://apollographql.com/docs/react/data/fragments/#defining-possibletypes-manually).\n</Callout>\n</Tabs.Tab>\n\n<Tabs.Tab>\nIf you are using version 2 of Apollo-Client, you need to specify the `apolloClientVersion: 2{:ts}` configuration, and then use it like that:\n\n```ts\nimport { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory'\n\n// generated by Fragment Matcher plugin\nimport introspectionQueryResultData from '../introspection-result'\n\nconst fragmentMatcher = new IntrospectionFragmentMatcher({\n  introspectionQueryResultData\n})\n\nconst cache = new InMemoryCache({ fragmentMatcher })\n```\n\n</Tabs.Tab>\n</Tabs>\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/other/hasura-allow-list.mdx",
    "content": "---\ntitle: hasura-allow-list\ndescription: Generate hasura allow list metadata from graphql files.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\nGenerate hasura allow list metadata from graphql files\n\nYou can use this plugin to generate an [allow list](https://hasura.io/docs/latest/graphql/cloud/security/allow-lists.html) for your [hasura](https://hasura.io) project.\n\nThis can be useful to keep your allow list and front end code in sync.\n\n## Examples\n\n```ts filename=\"codegen.ts\" {7}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/metadata/allow_list.yaml': {\n      plugins: ['hasura-allow-list']\n    }\n  }\n}\nexport default config\n```\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/other/introspection.mdx",
    "content": "---\ntitle: introspection\ndescription: Introspection plugin for Prisma. This plugin allows you to introspect your database and generate a Prisma schema from it.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/other/jsdoc.mdx",
    "content": "---\ntitle: jsdoc\ndescription: This plugin generates types in the form of JSDoc comments based on your GraphQLSchema.\n---\n\nimport { PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\n_developed by [`CarloPalinckx`](https://github.com/CarloPalinckx)_\n\nThis plugin generates types in the form of JSDoc comments based on your GraphQLSchema.\n"
  },
  {
    "path": "website/src/pages/plugins/other/reason-client.mdx",
    "content": "---\ntitle: reason-client\ndescription: GraphQL Code Generator plugin for ReasonML types. A plugin for GraphQL Codegen to generate ReasonML types based on your GraphQL schema for use in a client application.\n---\n\nimport { PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\n_Built and maintained by [kgoggin](https://github.com/kgoggin)_.\n\nA plugin for GraphQL Codegen to generate ReasonML types based on your GraphQL schema for use in a client application.\n\n## Examples\n\nSet up your project per the GraphQL Codegen Docs, and specify this plugin in your `codegen.yml`:\n\n```yaml\nschema: http://path.to.your.app\ngenerates:\n  src/GraphQLTypes.re:\n    - reason-client\n```\n\n## Usage & Documentation\n\nFor the complete documentation, please refer to [kgoggin/graphql-codegen-reason](https://github.com/kgoggin/graphql-codegen-reason) repository.\n"
  },
  {
    "path": "website/src/pages/plugins/other/schema-ast.mdx",
    "content": "---\ntitle: schema-ast\ndescription: Generate an AST representation of your GraphQL schema. This plugin is used internally by other plugins.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\n## Examples\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  schema: ['http://localhost:3000/graphql', './src/**/*.graphql', 'scalar MyCustomScalar'],\n  generates: {\n    'path/to/file.graphql': {\n      plugins: ['schema-ast']\n    }\n  }\n}\nexport default config\n```\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/other/time.mdx",
    "content": "---\ntitle: time\ndescription: Plugin for time. This plugin is used to get the current time.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/other/urql-introspection.mdx",
    "content": "---\ntitle: urql-introspection\ndescription: Introspection plugin for urql. Generates a JSON file with the GraphQL schema. This file can be used to create a schema-aware cache.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\n## How to use?\n\n```ts\n// generated by the plugin\nimport schema from './generated-introspection.json'\nconst cache = cacheExchange({ schema })\n```\n\n<Callout>\n  [Read more about Schema Awareness](https://formidable.com/open-source/urql/docs/graphcache/schema-awareness)\n</Callout>\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/presets/_meta.ts",
    "content": "export default {\n  'preset-client': 'client-preset',\n  'graphql-modules-preset': 'graphql-modules',\n  'import-types-preset': 'import-types',\n  'near-operation-file-preset': 'near-operation-file',\n};\n"
  },
  {
    "path": "website/src/pages/plugins/presets/graphql-modules-preset.mdx",
    "content": "---\ntitle: graphql-modules-preset\ndescription: GraphQL Code Generator preset for graphql-modules. It generates a single file with all the modules and their dependencies.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\nThe `@graphql-codegen/graphql-modules-preset` generates `.ts` file with TypeScript types, per each directory that contains GraphQL SDL definitions.\n\nThe generates files will be generated based on each module definition, and based on the GraphQL schema defined in that specific module, allowing you to write type-safe resolvers, while keeping modules types boundaries.\n\n<Callout type=\"warning\">\n**Usage Requirements**\n\nThis preset generates code for `graphql-modules` @ `v1` / `v2` (previous versions are not supported) by default.\n\nIf you are not using `graphql-modules`, you can set `useGraphQLModules: false{:yaml}` to disable this behaviour.\n\n</Callout>\n\n## Usage Example\n\nGiven a folder structure with the following files:\n\n```\n- src/\n  - modules/\n    - user/\n      - resolvers.ts\n      - typedefs/\n        - user.graphql\n    - product/\n      - resolvers.ts\n      - typedefs/\n        - product.graphql\n```\n\nHere's a short example for generating types and resolvers for 2 modules:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: './src/modules/**/typedefs/*.graphql',\n  generates: {\n    './src/modules/': {\n      preset: 'graphql-modules',\n      presetConfig: {\n        baseTypesPath: '../generated-types/graphql.ts',\n        filename: 'generated-types/module-types.ts'\n      },\n      plugins: [\n        {\n          add: {\n            content: '/* eslint-disable */'\n          }\n        },\n        'typescript',\n        'typescript-resolvers'\n      ]\n    }\n  }\n}\nexport default config\n```\n\nThis will generate a file called `module-types.ts` under each module you have.\n\nTo use the generates resolvers, you can use `Resolvers` signature and apply it to your resolvers object within the module:\n\n```ts filename=\"src/modules/user/resolvers.ts\"\nimport { MyModule } from './generated-types/module-types'\n\nexport const resolvers: MyModule.Resolvers = {\n  // Here you can implement only the types and fields defined in your module!\n}\n```\n\n<Callout>\n  You can find [an example project\n  here](https://github.com/dotansimha/graphql-code-generator/tree/master/dev-test/modules).\n</Callout>\n\n## Using without GraphQL-Modules\n\nBy default, this preset it generating code for `graphql-modules`, but if you are not using it, you can set `useGraphQLModules: false{:yaml}` in your preset configuration to generate fully agnostic types that are based on folder structure only.\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/presets/import-types-preset.mdx",
    "content": "---\ntitle: import-types-preset\ndescription: This preset generates a file per each operation file, and allow to import types from another file.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\nThis preset generates a file per each operation file, and allow to import types from another file.\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/presets/near-operation-file-preset.mdx",
    "content": "---\ntitle: near-operation-file-preset\ndescription: GraphQL Code Generator - Near Operation File Preset. Generates a file per each operation file.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename);\n\n<PluginHeader />\n\nThis preset generates a file per each operation file.\n\n## Example\n\nIn order to use this preset, you need to add 2 outputs to your `codegen.yml` file:\n\n- The first, is the base types, generated by `typescript` plugin.\n- The second, is the one that is in charge of generating types per operation.\n\nThis following example generates operation typings and `react-apollo` component per each operation file, near the original file of the operation:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli';\n\nconst config: CodegenConfig = {\n  schema: 'src/schema.json',\n  documents: 'src/**/*.graphql',\n  generates: {\n    'src/types.ts': { plugins: ['typescript'] },\n    'src/': {\n      preset: 'near-operation-file',\n      presetConfig: {\n        extension: '.generated.tsx',\n        baseTypesPath: 'types.ts',\n      },\n      plugins: ['typescript-operations', 'typescript-react-apollo'],\n    },\n  },\n};\nexport default config;\n```\n\n**How does it work?**\n\nThe first output is simple, and it only generates the base schema types to `src/types.ts`.\n\nThe second output refers to the base directory of the project (`./src/`) and it uses the `near-operation-file` preset to generate a file per each operation found under `./src/**/*.graphql`.\n\nThe `presetConfig` section contains a key for setting the output files extension (in our case, `.generated.tsx` because of `react-apollo`), and the location of the base schema types file we created in the first section of this file (it will look for it in the base directory).\n\n<Callout>\nNote: If you're loading your `documents` from files with the same extension as the generated files, make sure the glob you use excludes the generated files. For example, if your original glob was `src/**/*.{ts,tsx}`, use `src/**/!(*.generated).{ts,tsx}` instead.\n</Callout>\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/presets/preset-client.mdx",
    "content": "---\ntitle: client-preset\ndescription: The client preset provides typed GraphQL operations (Query, Mutation and Subscription) by perfectly integrating with your favorite GraphQL clients.\n---\n\nimport { Callout, FileTree } from '@theguild/components'\nimport { PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\n---\n\nThe `client-preset` provides typed GraphQL operations (Query, Mutation and Subscription) by perfectly integrating with your favorite GraphQL clients:\n\n- **React**\n\n  - `@apollo/client` (since `3.2.0`, not when using React Components (`<Query>`))\n  - `@urql/core` (since `1.15.0`)\n  - `@urql/preact` (since `1.4.0`)\n  - `urql` (since `1.11.0`)\n  - `graphql-request` (since `5.0.0`)\n  - `react-query` (with `graphql-request@5.x`)\n  - `swr` (with `graphql-request@5.x`)\n\n- **Vue**\n  - `@vue/apollo-composable` (since `4.0.0-alpha.13`)\n  - `villus` (since `1.0.0-beta.8`)\n  - `@urql/vue` (since `1.11.0`)\n\nIf your stack is not listed above, please refer to our framework/language specific plugins in the left navigation.\n\n## Getting started\n\nFor step-by-step instructions, please [refer to our dedicated guide](/docs/guides/react-vue).\n\n## Config API\n\n<Callout type=\"info\">\n  The `client` preset only exposes a set of underlying plugin's config options. The preset is somewhat opinionated and\n  crafted carefully for an optimal developer experience.\n</Callout>\n\nThe `client` preset allows the following `config` options:\n\n- [`scalars`](/plugins/typescript/typescript#scalars): Extends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\n- [`defaultScalarType`](/plugins/typescript/typescript#defaultscalartype): Allows you to override the type that unknown `scalars` will have. Defaults to `any`.\n- [`strictScalars`](/plugins/typescript/typescript#strictscalars): If `scalars` are found in the schema that are not defined in scalars an error will be thrown during codegen.\n- [`namingConvention`](/plugins/typescript/typescript#namingconvention): Available case functions in `change-case-all` are `camelCase`, `capitalCase`, `constantCase`, `dotCase`, `headerCase`, `noCase`, `paramCase`, `pascalCase`, `pathCase`, `sentenceCase`, `snakeCase`, `lowerCase`, `localeLowerCase`, `lowerCaseFirst`, `spongeCase`, `titleCase`, `upperCase`, `localeUpperCase` and `upperCaseFirst`.\n- [`useTypeImports`](/plugins/typescript/typescript#usetypeimports): Will use `import type {}` rather than `import {}` when importing only types. This gives compatibility with TypeScript's [`\"importsNotUsedAsValues\": \"error\"`](https://www.typescriptlang.org/tsconfig#importsNotUsedAsValues) option.\n- [`immutableTypes`](/plugins/typescript/typescript#immutabletypes): Generates immutable types by adding `readonly` to properties and `ReadonlyArray` for lists.\n- [`skipTypename`](/plugins/typescript/typescript#skiptypename): Does not add `__typename` to the generated types, unless it was specified in the selection set.\n- [`arrayInputCoercion`](/plugins/typescript/typescript-operations#arrayinputcoercion): The [GraphQL spec](https://spec.graphql.org/draft/#sel-FAHjBJFCAACE_Gh7d) allows arrays and a single primitive value for list input. This allows to deactivate that behavior to only accept arrays instead of single values.\n- [`enumsAsTypes`](/plugins/typescript/typescript#enumsastypes): Generates enum as TypeScript string union `type` instead of an `enum`. Useful if you wish to generate `.d.ts` declaration file instead of `.ts`, or if you want to avoid using TypeScript enums due to bundle size concerns.\n- [`enumsAsConst`](/plugins/typescript/typescript#enumsasconst): Generates enum as TypeScript const assertions instead of enum. This can even be used to enable enum-like patterns in plain JavaScript code if you choose not to use TypeScript’s enum construct.\n- [`enumValues`](/plugins/typescript/typescript#enumvalues): Overrides the default value of enum values declared in your GraphQL schema. You can also map the entire enum to an external type by providing a string that of module#type.\n- [`futureProofEnums`](/plugins/typescript/typescript#futureproofenums): Adds a catch-all entry to enum type definitions for values that may be added in the future.\n- [`nonOptionalTypename`](/plugins/typescript/typescript#nonoptionaltypename): Automatically adds `__typename` field to the generated types, even when they are not specified in the selection set, and makes it non-optional.\n- [`avoidOptionals`](/plugins/typescript/typescript#avoidoptionals): This will cause the generator to avoid using TypeScript optionals (`?`) on types.\n- [`documentMode`](#documentmode): Allows you to control how the documents are generated.\n- [`skipTypeNameForRoot`](/plugins/typescript/typescript-operations#skiptypenameforroot): Avoid adding `__typename` for root types. This is ignored when a selection explicitly specifies `__typename`.\n- [`onlyOperationTypes`](/plugins/typescript/typescript#onlyoperationtypes): This will cause the generator to emit types required for operations only i.e. only enums and scalars.\n- [`onlyEnums`](/plugins/typescript/typescript#onlyenums): This will cause the generator to emit types for enums only.\n- [`customDirectives`](/plugins/typescript/typescript-operations#customdirectives): Configures behavior for use with custom directives from various GraphQL libraries, such as Apollo Client's [@unmask](https://www.apollographql.com/docs/react/data/directives#unmask).\n- [`nullability`](/plugins/typescript/typescript-operations#nullability): Indicate the client capabilities to get stronger types with [semantic nullability](https://github.com/graphql/graphql-wg/blob/main/rfcs/SemanticNullability.md)-enabled schemas.\n\nFor more information or feature request, please [refer to the repository discussions](https://github.com/dotansimha/graphql-code-generator/discussions).\n\n## Fragment Masking\n\nAs explained in [our guide](/docs/guides/react-vue), the `client-preset` comes with Fragment Masking enabled by default.\n\nThis section covers this concept and associated options in detail.\n\n### Embrace Fragment Masking principles\n\nFragment Masking helps express components' data dependencies with GraphQL Fragments.\n\nBy doing so, we ensure that the tree of data is properly passed down to the components without \"leaking\" data.\nIt also allows to colocate the Fragment definitions with their components counterparts:\n\n```tsx filename=\"src/Film.tsx\" {4-11}\nimport { FragmentType, useFragment } from './gql/fragment-masking'\nimport { graphql } from '../src/gql'\n\nexport const FilmItemFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`)\n\nconst Film = (props: { film: FragmentType<typeof FilmItemFragment> }) => {\n  const film = useFragment(FilmItemFragment, props.film)\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  )\n}\n\nexport default Film\n```\n\nFor a deeper and more visual explanation of Fragment Masking, please refer to [Laurin](https://twitter.com/n1rual)'s article: [Unleash the power of Fragments with GraphQL Codegen\n](https://the-guild.dev/blog/unleash-the-power-of-fragments-with-graphql-codegen)\n\nFor an introduction on how to design your GraphQL Query to leverage Fragment Masking, please refer to [our guide](/docs/guides/react-vue).\n\n#### The `FragmentType<T>` type\n\nAs explained in [our guide](/docs/guides/react-vue), the top-level GraphQL Query should include the fragment (`...FilmItem`) and pass down the data to child components.\n\nAt the component props definition level, the `FragmentType<T>` type ensures that the passed data contains the required fragment (here: `FilmItemFragment` aka `FilmItem` in GraphQL).\n\n```tsx filename=\"src/Film.tsx\" {14-15}\nimport { FragmentType, useFragment } from './gql/fragment-masking'\nimport { graphql } from '../src/gql'\n\nexport const FilmItemFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`)\n\nconst Film = (props: {\n  /* the passed `film` property contains a valid `FilmItem` fragment 🎉 */\n  film: FragmentType<typeof FilmItemFragment>\n}) => {\n  const film = useFragment(FilmItemFragment, props.film)\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  )\n}\n\nexport default Film\n```\n\n<Callout type=\"warning\">\n**`FragmentType<T>` is not the Fragment's type**\n\nA common misconception is to mix `FragmentType<T>` and the Fragment's type.\nFor example, for helper functions, testing, or if you don't use Fragment Masking,\nyou should get the Fragment's type directly. In this scenario, you must import\nit from the generated files or extract it from the Fragment's definition,\nas described in [the next section](#getting-a-fragments-type).\n\n</Callout>\n\n#### The `useFragment()` helper\n\nThe `useFragment()` function helps narrow down the Fragment type from a given data object (ex: `film` object to a `FilmItemFragment` object):\n\n```tsx filename=\"src/Film.tsx\" {14-15}\nimport { FragmentType, useFragment } from './gql/fragment-masking'\nimport { graphql } from '../src/gql'\n\nexport const FilmItemFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`)\n\nconst Film = (props: { film: FragmentType<typeof FilmItemFragment> }) => {\n  const film = useFragment(FilmItemFragment, props.film)\n  // `film` is of type `FilmItemFragment` 🎉\n  return (\n    <div>\n      <h3>{film.title}</h3>\n      <p>{film.releaseDate}</p>\n    </div>\n  )\n}\n\nexport default Film\n```\n\n<Callout type=\"info\">\n**`useFragment()` is not a React hook**\n\n`useFragment()` can be used without following React's rules of hooks.\nTo avoid any issue with ESLint, we recommend changing its naming to `getFragmentData()` by setting the proper `unmaskFunctionName` value:\n\n```ts filename=\"codegen.ts\" {9-11}\nimport { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  documents: ['src/**/*.tsx', '!src/gql/**/*'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      presetConfig: {\n        fragmentMasking: { unmaskFunctionName: 'getFragmentData' }\n      }\n    }\n  }\n}\n\nexport default config\n```\n\n</Callout>\n\n### Getting a Fragment's type\n\nGetting a Fragment's type is achieved by importing the type that corresponds to your fragment, which is named based on the fragment name with a `Fragment` suffix:\n\n```tsx filename=\"src/Film.tsx\" {1, 8, 15}\nimport { FilmItemFragment } from './gql'\n\nconst allFilmsWithVariablesQueryDocument = graphql(/* GraphQL */ `\n  query allFilmsWithVariablesQuery($first: Int!) {\n    allFilms(first: $first) {\n      edges {\n        node {\n          ...FilmItem\n        }\n      }\n    }\n  }\n`)\n\nfunction myFilmHelper(film: FilmItemFragment) {\n  // ...\n}\n```\n\nOr, if you have access to the Fragment's definition, you can extract the type from it without having to \"guess\" the name:\n\n```tsx filename=\"src/Film.tsx\" {1, 3, 12}\nimport { ResultOf } from '@graphql-typed-document-node/core'\n\nexport const FilmItemFragment = graphql(/* GraphQL */ `\n  fragment FilmItem on Film {\n    id\n    title\n    releaseDate\n    producers\n  }\n`)\n\nfunction myFilmHelper(film: ResultOf<typeof FilmItemFragment>) {\n  // ...\n}\n```\n\n### Fragment Masking with nested Fragments\n\nWhen dealing with nested Fragments, the `useFragment()` should also be used in a \"nested way\".\n\nYou can find a complete working example here: [Nested Fragment example on GitHub](https://github.com/charlypoly/codegen-repros/blob/master/client-preset-nested-fragments-interface/src/App.tsx).\n\n### Fragment Masking with @defer Directive\n\nIf you use the `@defer` directive and have a Fragment Masking setup, you can use an `isFragmentReady` helper to check if the deferred fragment data is already resolved.\nThe `isFragmentReady` function takes three arguments: the query document, the fragment definition, and the data returned by the\nquery. You can use it to conditionally render components based on whether the data for a deferred\nfragment is available, as shown in the example below:\n\n```jsx\n// index.tsx\nimport { useQuery } from '@apollo/client';\nimport { useFragment, graphql, FragmentType, isFragmentReady } from './gql';\n\nconst OrdersFragment = graphql(`\n  fragment OrdersFragment on User {\n    orders {\n      id\n      total\n    }\n  }\n`)\nconst GetUserQueryWithDefer = graphql(`\n  query GetUser($id: ID!) {\n    user(id: $id) {\n      id\n      name\n      ...OrdersFragment @defer\n    }\n  }\n`)\n\nconst OrdersList = (props: { data: FragmentType<typeof OrdersFragment> }) => {\n  const data = useFragment(OrdersFragment, props.data);\n  return (\n    // render orders list\n  )\n};\n\nfunction App() {\n  const { data } = useQuery(GetUserQueryWithDefer);\n  return (\n    <div className=\"App\">\n      {data && (\n        <>\n          <span>Name: {data.name}</span>\n          <span>Id: {data.name}</span>\n          {isFragmentReady(GetUserQueryWithDefer, OrdersFragment, data) // <- HERE\n\t\t\t\t\t\t&& <OrdersList data={data} />}\n        </>\n      )}\n    </div>\n  );\n}\nexport default App;\n```\n\n### Fragment Masking and testing\n\nA React component that relies on Fragment Masking won't accept \"plain object\" as follows:\n\n```tsx filename=\"ProfileName.spec.ts\" {4}\n// ...\n\ntype ProfileNameProps = {\n  profile: FragmentType<typeof ProfileName_PersonFragmentDoc>\n}\n\nconst ProfileName = ({ profile }: ProfileNameProps) => {\n  const { name } = useFragment(ProfileName_PersonFragmentDoc, profile)\n  return (\n    <div>\n      <h1>Person Name: {name}</h1>\n    </div>\n  )\n}\n```\n\n```tsx filename=\"ProfileName.spec.ts\" {8}\n// ...\n\ndescribe('<ProfileName />', () => {\n  it('renders correctly', () => {\n    const profile = { name: 'Adam' }\n    render(\n      <ProfileName\n        profile={profile} // <-- this will throw TypeScript errors\n      />\n    )\n\n    expect(screen.getByText('Person Name: Adam')).toBeInTheDocument()\n  })\n})\n```\n\nSince the component expects to receive \"Masked data\", you will need to import the `makeFragmentData()` helper to \"build\" some masked data, as follow:\n\n```tsx filename=\"ProfileName.spec.ts\" {7}\n// ...\nimport { makeFragmentData } from '../gql'\n\ndescribe('<ProfileName />', () => {\n  it('renders correctly', () => {\n    const profile = { name: 'Adam' }\n    render(<ProfileName profile={makeFragmentData(profile, ProfileName_PersonFragmentDoc)} />)\n\n    expect(screen.getByText('Person Name: Adam')).toBeInTheDocument()\n  })\n})\n```\n\n### How to disable Fragment Masking\n\n`client-preset`'s Fragment Masking can be disabled as follow:\n\n```ts filename=\"codegen.ts\" {9-11}\nimport { type CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  documents: ['src/**/*.tsx', '!src/gql/**/*'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      presetConfig: {\n        fragmentMasking: false\n      }\n    }\n  }\n}\n\nexport default config\n```\n\n## Persisted Documents\n\nPersisted documents (often also referred to as persisted queries or persisted operations) is a technique for reducing client to server upstream traffic by sending a unique identifier instead of the full GraphQL document.\nIt is also commonly used to reduce the size of the client bundle as well as to improve security by preventing the client from sending and executing arbitrary GraphQL operations (and thus reducing attack surface).\n\n<Callout type=\"info\">\n  You can find [a functional example using GraphQL Yoga within our Codegen Examples on\n  GitHub](https://github.com/dotansimha/graphql-code-generator/tree/master/examples/persisted-documents).\n</Callout>\n\n### Enable Persisted Documents\n\nPersisted documents can be enabled by setting the `persistedDocuments` option to `true`:\n\n```ts filename=\"codegen.ts\" {9-11}\nimport { type CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      presetConfig: {\n        persistedDocuments: true\n      }\n    }\n  }\n}\n```\n\nBy enabling this option GraphQL Code Generator will generate an additional file `persisted-documents.json` within your artifacts location.\n\n<FileTree>\n  <FileTree.Folder name=\"gql\" defaultOpen>\n    <FileTree.File name=\"fragment-masking.ts\" />\n    <FileTree.File name=\"gql.ts\" />\n    <FileTree.File name=\"graphql.ts\" />\n    <FileTree.File name=\"index.ts\" />\n    <FileTree.File name=\"persisted-documents.json\" active />\n  </FileTree.Folder>\n</FileTree>\n\nThis file contains a mapping of the document's hash to the document's content.\n\n```json filename=\"persisted-documents.json\"\n{\n  \"b2c3d4e5f6g7h8i9j0a1\": \"query Hello { hello }\",\n  \"kae4fe7f6g7h8i9ej0ag\": \"mutation echo($msg: String!) { echo(message: $msg) }\"\n}\n```\n\nIn addition the document hash will be added to the generated document node as a `hash` property.\n\n```ts filename=\"app.ts\"\nimport { graphql } from './gql'\n\nconst HelloQuery = graphql(/* GraphQL */ `\n  query Hello {\n    hello\n  }\n`)\n\n// logs \"b2c3d4e5f6g7h8i9j0a1\"\nconsole.log(HelloQuery['__meta__']['hash'])\n```\n\nThis hash can be used in the network layer of your GraphQL client to send the document hash instead of the document string.\n\n<Callout type=\"info\">\n  Note that the server you sent the document hash to must be able to resolve the document hash to the document string.\n</Callout>\n\n```ts filename=\"Fetch example\"\nimport { graphql } from './gql'\n\nconst HelloQuery = graphql(/* GraphQL */ `\n  query Hello {\n    hello\n  }\n`)\n\nconst response = await fetch('http://yoga/graphql', {\n  method: 'POST',\n  headers: {\n    'content-type': 'application/json',\n    accept: 'application/json'\n  },\n  body: JSON.stringify({\n    extensions: {\n      persistedQuery: {\n        version: 1,\n        sha256Hash: HelloQuery['__meta__']['hash']\n      }\n    }\n  })\n})\n\nconsole.log(response.status)\nconsole.log(await response.json())\n```\n\n### Hashing algorithm\n\nTo override the default hash algorithm of sha1 set `persistedDocuments.hashAlgorithm`\n\n```ts filename=\"codegen.ts\" {10-12}\nimport { type CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      presetConfig: {\n        persistedDocuments: {\n          hashAlgorithm: 'sha256'\n        }\n      }\n    }\n  }\n}\n```\n\nInstead of using a preset algorithm, you can also provide your own hash function.\n\n```ts filename=\"codegen.ts\" {10-12}\nimport { type CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      presetConfig: {\n        persistedDocuments: {\n          hashAlgorithm: operation => {\n            const shasum = crypto.createHash('sha512')\n            shasum.update(operation)\n            return shasum.digest('hex')\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n### Normalized Caches (urql and Apollo Client)\n\nUrql is a popular GraphQL client that utilizes a normalized cache.\nBecause the client utilizes the `__typename` fields to normalize the cache, it is important that the `__typename` field is included in the persisted documents.\nThe `addTypenameSelectionDocumentTransform` document transform can be used for achieving this.\n\n```ts filename=\"codegen.ts\" {1,15}\nimport { type CodegenConfig } from '@graphql-codegen/cli'\nimport { addTypenameSelectionDocumentTransform } from '@graphql-codegen/client-preset'\n\nconst config: CodegenConfig = {\n  schema: './**/*.graphqls',\n  documents: ['./**/*.{ts,tsx}'],\n  ignoreNoDocuments: true,\n  generates: {\n    './gql/': {\n      preset: 'client',\n      plugins: [],\n      presetConfig: {\n        persistedDocuments: true\n      },\n      documentTransforms: [addTypenameSelectionDocumentTransform]\n    }\n  }\n}\n\nexport default config\n```\n\nAfterwards, you can send the hashes to the server.\n\n```ts filename=\"Example with urql\" {2,8-13}\nimport { createClient, cacheExchange } from '@urql/core'\nimport { persistedExchange } from '@urql/exchange-persisted'\n\nconst client = new createClient({\n  url: 'YOUR_GRAPHQL_ENDPOINT',\n  exchanges: [\n    cacheExchange,\n    persistedExchange({\n      enforcePersistedQueries: true,\n      enableForMutation: true,\n      generateHash: (_, document) => Promise.resolve(document['__meta__']['hash'])\n    })\n  ]\n})\n```\n\n## Reducing Bundle Size\n\nLarge scale projects might want to enable code splitting or tree shaking on the `client-preset` generated files.\nThis is because instead of using the map which contains all GraphQL operations in the project,\nwe can use the specific generated document types.\n\nThe `client-preset` comes with a Babel and a swc plugin that enables it.\n\n### Babel Plugin\n\nTo configure the Babel plugin, update (or create) your `.babelrc.js` as follow:\n\n```js filename=\".babelrc.js\"\nconst { babelOptimizerPlugin } = require('@graphql-codegen/client-preset')\n\nmodule.exports = {\n  presets: ['react-app'],\n  plugins: [[babelOptimizerPlugin, { artifactDirectory: './src/gql', gqlTagName: 'graphql' }]]\n}\n```\n\n### SWC Plugin\n\nThe SWC plugin is not bundled in the `client-preset` package, so you will need to install it separately:\n\n```sh npm2yarn\nnpm i -D @swc-contrib/plugin-graphql-codegen-client-preset\n```\n\n#### General\n\nTo use the SWC plugin without Next.js, update your `.swcrc` to add the following:\n\n```json5 filename=\".swcrc\"\n{\n  // ...\n  jsc: {\n    // ...\n    experimental: {\n      plugins: [\n        ['@swc-contrib/plugin-graphql-codegen-client-preset', { artifactDirectory: './src/gql', gqlTagName: 'graphql' }]\n      ]\n    }\n  }\n}\n```\n\n#### Vite React\n\nTo use the SWC plugin with Vite React, update your `vite.config.ts` to add the following:\n\n```ts filename=\"vite.config.ts\" {2,8-10}\nimport { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react-swc'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [\n    react({\n      plugins: [\n        ['@swc-contrib/plugin-graphql-codegen-client-preset', { artifactDirectory: './src/gql', gqlTagName: 'graphql' }]\n      ]\n    })\n  ]\n})\n```\n\n#### Next.js\n\nTo use the SWC plugin with Next.js, update your `next.config.js` to add the following:\n\n```js filename=\"next.config.js\"\nconst nextConfig = {\n  // ...\n  experimental: {\n    swcPlugins: [\n      ['@swc-contrib/plugin-graphql-codegen-client-preset', { artifactDirectory: './src/gql', gqlTagName: 'graphql' }]\n    ]\n  }\n}\n```\n\nNote that you will need to provide the `artifactDirectory` path that should be the same as the one configured in your `codegen.ts`\n\n## DocumentMode\n\nThe `DocumentMode` option can be used to control how the plugin will generate the document nodes.\n\nBy default, the generated documents are of type `TypedDocumentNode` which is a fully typed GraphQL operation AST. Example:\n\n```ts filename=\"out/gql.ts\"\nexport type HelloQueryVariables = Exact<{ [key: string]: never }>\n\nexport type HelloQuery = { __typename?: 'Query'; hello: string }\n\nexport const HelloDocument = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { kind: 'Name', value: 'hello' },\n      selectionSet: { kind: 'SelectionSet', selections: [{ kind: 'Field', name: { kind: 'Name', value: 'hello' } }] }\n    }\n  ]\n} as unknown as DocumentNode<HelloQuery, HelloQueryVariables>\n```\n\nThe `documentMode` option can be used to change the generated documents to `string`:\n\n```ts filename=\"codegen.ts\" {9-11}\nimport { type CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  documents: ['src/**/*.tsx'],\n  generates: {\n    './src/gql/': {\n      preset: 'client',\n      config: {\n        documentMode: 'string'\n      }\n    }\n  }\n}\n```\n\nThis will generate the following:\n\n```ts filename=\"out/gql.ts\"\nexport type HelloQueryVariables = Exact<{ [key: string]: never }>\n\nexport type HelloQuery = { __typename?: 'Query'; hello: string }\n\nexport const HelloDocument = new TypedDocumentString(`\n  query hello {\n    hello\n  }\n`) as unknown as TypedDocumentString<HelloQuery, HelloQueryVariables>\n```\n\nIt can then be used as follow:\n\n```ts filename=\"Fetch example\"\nimport { graphql } from './gql'\n\nconst helloQuery = graphql(`\n  query hello {\n    hello\n  }\n`)\n\nfetch('https:<your-graphql-api>', {\n  method: 'POST',\n  headers: {\n    'content-type': 'application/json'\n  },\n  body: JSON.stringify({\n    query: helloQuery.toString()\n  })\n})\n```\n\n### When to use a string DocumentMode?\n\nThe `string` DocumentMode is useful when you want to reduce the bundle size of your application as you will get string literals instead of typed ASTs. This is useful when your GraphQL client allows you to send a string literal as the query and you don't need to use the AST on the client, e.g. when using `graphql-request`, SWR, React Query, etc.\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/_meta.ts",
    "content": "export default {\n  'named-operations-object': 'named-operations-object',\n  'relay-operation-optimizer': 'relay-operation-optimizer',\n  'typed-document-node': 'typed-document-node',\n  typescript: 'typescript',\n  'typescript-apollo-angular': 'apollo-angular',\n  'typescript-apollo-client-helpers': 'apollo-client-helpers',\n  'typescript-apollo-next': 'apollo-next',\n  'typescript-document-nodes': 'document-nodes',\n  'typescript-fabbrica': 'fabbrica',\n  'typescript-generic-sdk': 'generic-sdk',\n  'typescript-graphql-files-modules': 'graphql-files-modules',\n  'typescript-graphql-request': 'graphql-request',\n  'typescript-mongodb': 'mongodb',\n  'typescript-msw': 'msw',\n  'typescript-oclif': 'oclif',\n  'typescript-nhost': 'nhost',\n  'typescript-operations': 'operations',\n  'typescript-react-apollo': 'react-apollo',\n  'typescript-react-query': 'react-query',\n  'typescript-resolvers': 'resolvers',\n  'typescript-rtk-query': 'rtk-query',\n  'typescript-stencil-apollo': 'stencil-apollo',\n  'typescript-svelte-apollo': 'svelte-apollo',\n  'typescript-type-graphql': 'type-graphql',\n  'typescript-urql': 'urql',\n  'typescript-validation-schema': 'validation-schema',\n  'typescript-vue-apollo': 'vue-apollo',\n  'typescript-vue-apollo-smart-ops': 'vue-apollo-smart-ops',\n  'typescript-vue-urql': 'vue-urql',\n  'typescript-mock-data': 'typescript-mock-data',\n};\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/named-operations-object.mdx",
    "content": "---\ntitle: named-operations-object\ndescription: Generates an object containing a list of all your GraphQL operations and fragments. This is useful if you are using Apollo-Client and wish to have type validation when you are using `refetchQueries`.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\nThis plugin generates an object containing a list of all your GraphQL operations and fragments. This is useful if you are using Apollo-Client and wish to have type validation when you are using `refetchQueries`.\n\nAll operations and fragments are being exported by their name (so unnamed operations are being ignored), in the following structure:\n\n```ts\nexport const namedOperations = {\n  Query: [...],\n  Mutation: [...],\n  Subscription: [...],\n  Fragment: [...]\n}\n```\n\n<PluginApiDocs />\n\n## How to use?\n\nInclude the plugin within your output (into an existing `.js`/`.ts` file, or a new file), for example:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'YOUR_SCHEMA',\n  documents: 'YOUR_OPERATIONS',\n  generates: {\n    './types.ts': {\n      plugins: ['typescript', 'typescript-operations', 'named-operations-object']\n    }\n  }\n}\nexport default config\n```\n\n### Refetch queries without input parameters\n\nFrom this point, you should be able to import `namedOperations` from that file, and use the names within your code. For example, with Apollo Client and a refetch query that has no input parameters, you can simply add the named operation to the `refetchQueries` array:\n\n```ts\nclient\n  .mutate(\n    { ... },\n    // No more typos, and you get auto-completion and build time validation\n    { refetchQueries: [namedOperations.Query.myQuery] }\n  )\n```\n\n### Refetch queries with input parameters\n\nFor refetch queries that contain input parameters, instead of adding a named operation to the `refetchQueries` array, you need to add an Apollo [`QueryOptions`](https://www.apollographql.com/docs/react/data/queries/#options) object. The `query` value inside the `QueryOptions` object **does not take one of the entries in the `namedOperations` list**. Instead, the `query` value takes a TypedDocument constant which corresponds to your query and should be generated by default.\n\nA `refetchQueries` array that contains multiple queries, some of which contain input parameters, might look something like this:\n\n```ts\nclient\n  .mutate(\n    { ... },\n    // No more typos, and you get auto-completion and build time validation\n    { refetchQueries: [\n      namedOperations.Query.myQueryWithoutInputParams,\n      {\n        query: MyQueryWithInputParamsDocument,\n        variables: { inputParam }\n      }\n    ] }\n  )\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/relay-operation-optimizer.mdx",
    "content": "---\ntitle: relay-operation-optimizer\ndescription: A GraphQL Codegen feature for bringing the benefits of Relay Compiler to any GraphQL Client using Relay Operation Optimizer.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\n_Built and maintained by [n1ru4l](https://github.com/n1ru4l)_.\n\nA GraphQL Codegen feature for bringing the benefits of Relay Compiler to any GraphQL Client using [Relay Operation Optimizer](https://graphql-tools.com/docs/relay-operation-optimizer).\n\nYou can test how relay-compiler affects your queries over on the [Relay Compiler REPL](https://relay-compiler-repl.netlify.com).\n\n## List of Features\n\n- [Optimize your Operations](https://relay.dev/docs/principles-and-architecture/compiler-architecture/#transforms) TL;DR: reduce operation complexity and size\n  - Inline Fragments\n  - Flatten Transform\n  - Skip Redundant Node Transform\n- FragmentArguments TL;DR: Make your fragments reusable with different arguments\n  - [`@argumentsDefinition`](https://relay.dev/docs/en/graphql-in-relay#argumentdefinitions)\n  - [`@arguments`](https://relay.dev/docs/en/graphql-in-relay#arguments)\n\n## Usage\n\nSet up your project per the GraphQL Codegen Docs, and add `flattenGeneratedTypes: true{:yaml}` in your `codegen.yml`:\n\n```ts filename=\"codegen.ts\" {11}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  overwrite: true,\n  schema: 'schema.graphql',\n  generates: {\n    'src/generated-types.tsx': {\n      documents: 'src/documents/**/*.graphql',\n      config: {\n        skipDocumentsValidation: true,\n        flattenGeneratedTypes: true\n      },\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo']\n    }\n  }\n}\nexport default config\n```\n\nPlease notice that you have to skip the document validation - but no worries, relay-compiler will validate your documents instead!\n\n<Callout>\n  [See Laurin Quast's blog post to learn how to use those directives in your\n  operations](https://the-guild.dev/blog/graphql-codegen-relay-compiler)\n</Callout>\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typed-document-node.mdx",
    "content": "---\ntitle: typed-document-node\ndescription: Generate TypedDocumentNode for GraphQL operations. This plugin is a wrapper for graphql-typed-document-node.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<Callout>\n  This plugin is meant to be used for low-level use cases or as building block for presets.\n  <br /> For building a **GraphQL client application** we recommend using the [`client-preset`](/plugins/presets/preset-client).\n</Callout>\n\n<PluginHeader />\n\nThese plugins generate a ready-to-use `TypedDocumentNode` (a combination of pre-compiled `DocumentNode` and the TypeScript signature it represents).\n\nWith the `typed-document-node` plugin you no longer need to reconfigure, and install different GraphQL Code Generator plugins to manage all your GraphQL client hooks. Generate a single `TypedDocumentNode` and pass it to your GraphQL client of choice.\n\nThis plugin also generates less boilerplate code for your GraphQL operations.\n\n<Callout>\n  Watch [Episode #41 of `graphql.wtf`](https://graphql.wtf/episodes/41-typed-document-node) for a quick introduction to\n  using this plugin with GraphQL Code Generator:\n</Callout>\n\n<iframe src=\"https://youtube.com/embed/cYIhx8dusa4\" title=\"Typed Document Node with GraphQL Code Generator\" />\n\n### Usage example\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'SCHEMA_FILE_OR_ENDPOINT_HERE',\n  documents: './src/**/*.graphql',\n  generates: {\n    './src/graphql-operations.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typed-document-node']\n    }\n  }\n}\nexport default config\n```\n\nThe example about will generate `TypedDocumentNode` with the needed types built-in, for example:\n\n```ts\n// Represents the variables type of the operation - generated by `typescript` + `typescript-operations` plugins\nexport type RatesQueryVariables = Exact<{\n  currency: Scalars['String'];\n}>;\n\n// Represents the result type of the operation - generated by `typescript` + `typescript-operations` plugins\nexport type RatesQuery = (\n  { __typename?: 'Query' }\n  & {\n  rates?: Maybe<Array<Maybe<(\n    { __typename?: 'ExchangeRate' }\n    & Pick<ExchangeRate, 'currency' | 'rate'>\n    )>>>\n}\n  )\n\n// Generated by this plugin - creates a pre-compiled `DocumentNode` and passes result type and variables type as generics\nexport const ratesQuery: TypedDocumentNode<RatesQuery, RatesQueryVariables> = {\n  kind: 'Document',\n  definitions: [\n    {\n      kind: 'OperationDefinition',\n      operation: 'query',\n      name: { ... }\n    }\n  ]\n}\n```\n\n<Callout>This plugin also requires `typescript` and `typescript-operations`.</Callout>\n\nFor information about the setup and usage of `TypedDocumentNode`, [please refer to the library's documentation](https://github.com/dotansimha/graphql-typed-document-node).\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-apollo-angular.mdx",
    "content": "---\ntitle: typescript-apollo-angular\ndescription: GraphQL Code Generator plugin for Angular services using Apollo Angular. It generates Angular services with observables and typed variables.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<PluginHeader />\n<PluginApiDocs />\n\n## How to use?\n\nSimply create a `.graphql` file and write a random query like so:\n\n```graphql\nquery MyFeed {\n  feed {\n    id\n    commentCount\n  }\n}\n```\n\nUsing `graphql-codegen` you can generate a file with Angular services that you can use when coding an Angular component:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/output.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-apollo-angular']\n    }\n  }\n}\nexport default config\n```\n\nThen, use it:\n\n```ts\nimport { MyFeedGQL, MyFeedQuery } from './graphql'\n// BE SURE TO USE Observable from rxjs and not from @apollo/client/core when using map\nimport { Observable } from 'rxjs'\nimport { map } from 'rxjs/operators'\n\n@Component({\n  selector: 'feed',\n  template: `\n    <h1>Feed:</h1>\n    <ul>\n      <li *ngFor=\"let item of feed | async\">{{ item.id }}</li>\n    </ul>\n  `\n})\nexport class FeedComponent {\n  feed: Observable<MyFeedQuery['feed']>\n\n  constructor(feedGQL: MyFeedGQL) {\n    this.feed = feedGQL.watch().valueChanges.pipe(map(result => result.data.feed))\n  }\n}\n```\n\n#### `@NgModule` directive\n\nAll generated services are defined with `@Injectable({ providedIn: 'root' }){:ts}` and in most cases you don't need to overwrite it, because providing a service to the root injector is highly recommended. To customize that behavior you can use `@NgModule` directive, anywhere in an operation, to let the codegen know which injector should it use to create a service.\n\n<Callout>You can't use multiple `@NgModule` directives in the same operation</Callout>\n\n```graphql\nquery feed {\n  feed @NgModule(module: \"./feed/feed.module#FeedModule\") {\n    id\n    title\n  }\n}\n```\n\n#### `@namedClient` directive\n\nSometimes you end up with multiple Apollo clients, which means part of operations can't use the defaults. In order to customize that behavior you simply attach the `@namedClient` directive and the `typescript-apollo-angular` plugin takes care of the rest.\n\n<Callout>You can't use multiple `@namedClient` directives in the same operation</Callout>\n\n```graphql\nquery feed {\n  feed @namedClient(name: \"custom\") {\n    id\n    title\n  }\n}\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-apollo-client-helpers.mdx",
    "content": "---\ntitle: typescript-apollo-client-helpers\ndescription: Generates helpers for improving the integration of TypeScript and Apollo-Client, based on your schema. This plugin generates fully-typed keyFields and Type-Policies for Apollo-Client.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\nThis plugin generates helpers for improving the integration of TypeScript and Apollo-Client, based on your schema.\n\n<Callout type=\"warning\">Note: this plugin generates code that intended for `apollo-client` @ `> v3` only.</Callout>\n\nThis plugin generates fully-typed `keyFields` and Type-Policies for Apollo-Client.\n\n<Callout>\n  [You can read more about type-policies in Apollo Cache\n  here](https://apollographql.com/docs/react/caching/cache-configuration/#typepolicy-fields)\n</Callout>\n\n### How to use?\n\nStart by adding this plugin to your configuration:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'my-schema.graphql',\n  generates: {\n    'apollo-helpers.ts': {\n      plugins: ['typescript-apollo-client-helpers']\n    }\n  }\n}\nexport default config\n```\n\nThen, use the generated TypeScript `type` as your signature for `typePolicies`:\n\n```ts /StrictTypedTypePolicies/2\nimport { StrictTypedTypePolicies } from './apollo-helpers'\n\nconst typePolicies: StrictTypedTypePolicies = {\n  // Keys in this object will be validated against the types on your schema\n  Product: {\n    keyFields: ['id'] // Values in this field will be validated against the available fields from the Product type\n  },\n  Person: {\n    keyFields: ['name', 'email']\n  },\n  Book: {\n    // This entire definition is typed, based on available types and fields\n    fields: {\n      tags: {\n        merge: false\n      }\n    }\n  }\n}\n\nconst cache = new InMemoryCache({ typePolicies })\n```\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-apollo-next.mdx",
    "content": "---\ntitle: typescript-apollo-next\ndescription: Apollo Client plugin for GraphQL Code Generator. Generates React Apollo HOC and React Hooks.\n---\n\nimport { PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<PluginHeader />\n\nThis plugin generates:\n\n- a function running an ApolloClient query and cache extraction, to be used inside `getServerSideProps` or `getStaticProps`\n- a React Apollo HOC running an ApolloClient query consuming the InMemory cache\n- an interface for the React component wrapped by the HOC\n\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\n\n## Motivations\n\nNext.js recently introduced `getServerSideProps` and `getStaticProps` which doesn't allow to use the HOC pattern adopted by the official apollo graphql plugin (based on `getInitialProps`). At the same time the SSR method offered by apollo client (`getDataFromTree`) enforces the React app to render multiple times in order to collect and fetch all the relevant queries.\nBy declaring a top level query we can save rendering time and provide a simpler pattern which works with `getServerSideProps`. Note that this pattern requires each SSR query to run at top level. [Example](https://github.com/correttojs/graphql-codegen-apollo-next-ssr/tree/master/example)\n\n## API Reference\n\n### `apolloReactCommonImportFrom`\n\ntype: `string`\ndefault: `\"`\n\nCustomize the package where apollo-react common lib is loaded from.\n\n### `apolloImportFrom`\n\ntype: `string`\ndefault: `\"`\n\nCustomize the package where apollo-client lib is loaded from.\n\n### `apolloCacheImportFrom`\n\ntype: `string`\ndefault: `\"`\n\nCustomize the package where apollo-cache-inmemory lib is loaded from.\n\n### `apolloReactHooksImportFrom`\n\ntype: `string`\ndefault: `\"`\n\nCustomize the package where apollo-react hooks lib is loaded from.\n\n### `reactApolloVersion`\n\ntype: `number (values: 2, 3)`\ndefault: `2`\n\nSets the version of react-apollo.\n\n#### Usage Examples\n\n```ts filename=\"codegen.ts\" {9}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],\n      config: {\n        reactApolloVersion: 3\n      }\n    }\n  }\n}\nexport default config\n```\n\n### `withHOC`\n\ntype: `boolean`\ndefault: `true`\n\nCustomized the output by enabling/disabling the HOC.\n\n#### Usage Examples\n\n```ts filename=\"codegen.ts\" {9}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],\n      config: {\n        withHOC: 'I'\n      }\n    }\n  }\n}\nexport default config\n```\n\n### `withHooks`\n\ntype: `boolean`\ndefault: `false`\n\nCustomized the output by enabling/disabling the generated React Hooks.\n\n#### Usage Examples\n\n```ts filename=\"codegen.ts\" {9}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],\n      config: {\n        withHooks: 'I'\n      }\n    }\n  }\n}\nexport default config\n```\n\n### `excludePatterns`\n\ntype: `string`\ndefault: `''`\n\nRegexp to exclude a certain operation name.\n\n### `excludePatternsOptions`\n\ntype: `string`\ndefault: `''`\n\nRegexp options to exclude a certain operation name.\n\n### `pre`\n\ntype: `string`\ndefault: `''`\n\nAdd custom code before each operation.\n\n### `post`\n\ntype: `string`\ndefault: `''`\n\nAdd custom code after each operation.\n\n### `customImports`\n\ntype: `string`\ndefault: `''`\n\nAdd custom imports needed by pre/post.\n\n### `gqlImport`\n\ntype: `string`\ndefault: `gql#graphql-tag`\n\nCustomize from which module will `gql` be imported from.\nThis is useful if you want to use modules other than `graphql-tag`, e.g. `graphql.macro`.\n\n#### Usage Examples\n\n##### graphql.macro\n\n```ts filename=\"codegen.ts\" {9}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],\n      config: {\n        gqlImport: 'graphql.macro#gql'\n      }\n    }\n  }\n}\nexport default config\n```\n\n##### Gatsby\n\n```ts filename=\"codegen.ts\" {9}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],\n      config: {\n        gqlImport: 'gatsby#graphql'\n      }\n    }\n  }\n}\nexport default config\n```\n\n### `noExport`\n\ntype: `boolean`\ndefault: `false`\n\nSet this configuration to `true` if you wish to tell codegen to generate code with no `export` identifier.\n\n### `dedupeOperationSuffix`\n\ntype: `boolean`\ndefault: `false`\n\nSet this configuration to `true` if you wish to make sure to remove duplicate operation name suffix.\n\n### `omitOperationSuffix`\n\ntype: `boolean`\ndefault: `false`\n\nSet this configuration to `true` if you wish to disable auto add suffix of operation name, like `Query`, `Mutation`, `Subscription`, `Fragment`.\n\n### `operationResultSuffix`\n\ntype: `string`\ndefault: ``\n\nAdds a suffix to generated operation result type names\n\n### `documentVariablePrefix`\n\ntype: `string`\ndefault: ``\n\nChanges the GraphQL operations variables prefix.\n\n### `documentVariableSuffix`\n\ntype: `string`\ndefault: `Document`\n\nChanges the GraphQL operations variables suffix.\n\n### `fragmentVariablePrefix`\n\ntype: `string`\ndefault: ``\n\nChanges the GraphQL fragments variables prefix.\n\n### `fragmentVariableSuffix`\n\ntype: `string`\ndefault: `FragmentDoc`\n\nChanges the GraphQL fragments variables suffix.\n\n### `documentMode`\n\ntype: `DocumentMode`\ndefault: `graphQLTag`\n\nDeclares how DocumentNode are created:\n\n- `graphQLTag`: `graphql-tag` or other modules (check `gqlImport`) will be used to generate document nodes. If this is used, document nodes are generated on client side i.e. the module used to generate this will be shipped to the client\n- `documentNode`: document nodes will be generated as objects when we generate the templates.\n- `documentNodeImportFragments`: Similar to documentNode except it imports external fragments instead of embedding them.\n- `external`: document nodes are imported from an external file. To be used with `importDocumentNodeExternallyFrom`\n\n### `importOperationTypesFrom`\n\ntype: `string`\ndefault: ``\n\nThis config is used internally by presets, but you can use it manually to tell codegen to prefix all base types that it's using.\nThis is useful if you wish to generate base types from `typescript-operations` plugin into a different file, and import it from there.\n\n### `importDocumentNodeExternallyFrom`\n\ntype: `string`\ndefault: ``\n\nThis config should be used if `documentMode` is `external`. This has 2 usage:\n\n- any string: This would be the path to import document nodes from. This can be used if we want to manually create the document nodes e.g. Use `graphql-tag` in a separate file and export the generated document\n- 'near-operation-file': This is a special mode that is intended to be used with `near-operation-file` preset to import document nodes from those files. If these files are `.graphql` files, we make use of webpack loader.\n\n#### Usage Examples\n\n```ts filename=\"codegen.ts\" {10}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file': {\n      // plugins...\n      config: {\n        documentMode: 'external',\n        importDocumentNodeExternallyFrom: 'path/to/document-node-file'\n      }\n    }\n  }\n}\nexport default config\n```\n\n```ts filename=\"codegen.ts\" {10}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file': {\n      // plugins...\n      config: {\n        documentMode: 'external',\n        importDocumentNodeExternallyFrom: 'near-operation-file'\n      }\n    }\n  }\n}\nexport default config\n```\n\n### `scalars`\n\ntype: `ScalarsMap`\n\nExtends or overrides the built-in scalars and custom GraphQL scalars to a custom type.\n\n#### Usage Examples\n\n```ts filename=\"codegen.ts\" {10-11}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file': {\n      // plugins...\n      config: {\n        scalars: {\n          DateTime: 'Date',\n          JSON: '{ [key: string]: any }'\n        }\n      }\n    }\n  }\n}\nexport default config\n```\n\n### `namingConvention`\n\ntype: `NamingConvention`\ndefault: `change-case-all#pascalCase`\n\nAllow you to override the naming convention of the output.\nYou can either override all namings, or specify an object with specific custom naming convention per output.\nThe format of the converter must be a valid `module#method`.\nAllowed values for specific output are: `typeNames`, `enumValues`.\nYou can also use \"keep\" to keep all GraphQL names as-is.\nAdditionally, you can set `transformUnderscore` to `true` if you want to override the default behavior,\nwhich is to preserve underscores.\n\n#### Usage Examples\n\n##### Override All Names\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file': {\n      // plugins...\n      config: {\n        namingConvention: 'change-case-all#lowerCase'\n      }\n    }\n  }\n}\nexport default config\n```\n\n##### Upper-case enum values\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file': {\n      // plugins...\n      config: {\n        namingConvention: {\n          typeNames: 'change-case-all#pascalCase',\n          enumValues: 'change-case-all#upperCase'\n        }\n      }\n    }\n  }\n}\nexport default config\n```\n\n##### Keep names as is\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file': {\n      // plugins...\n      config: {\n        namingConvention: 'keep'\n      }\n    }\n  }\n}\nexport default config\n```\n\n##### Remove Underscores\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file': {\n      // plugins...\n      config: {\n        namingConvention: {\n          typeNames: 'change-case-all#pascalCase',\n          transformUnderscore: true\n        }\n      }\n    }\n  }\n}\nexport default config\n```\n\n### `typesPrefix`\n\ntype: `string`\ndefault: ``\n\nPrefixes all the generated types.\n\n#### Usage Examples\n\n```ts filename=\"codegen.ts\" {9}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],\n      config: {\n        typesPrefix: 'I'\n      }\n    }\n  }\n}\nexport default config\n```\n\n### `skipTypename`\n\ntype: `boolean`\ndefault: `false`\n\nDoes not add `__typename` to the generated types, unless it was specified in the selection set.\n\n#### Usage Examples\n\n```ts filename=\"codegen.ts\" {9}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],\n      config: {\n        skipTypename: true\n      }\n    }\n  }\n}\nexport default config\n```\n\n### `nonOptionalTypename`\n\ntype: `boolean`\ndefault: `false`\n\nAutomatically adds `__typename` field to the generated types, even when they are not specified\nin the selection set, and makes it non-optional.\n\n#### Usage Examples\n\n```ts filename=\"codegen.ts\" {9}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  // ...\n  generates: {\n    'path/to/file.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],\n      config: {\n        nonOptionalTypename: true\n      }\n    }\n  }\n}\nexport default config\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-document-nodes.mdx",
    "content": "---\ntitle: typescript-document-nodes\ndescription: Generate TypeScript code for GraphQL documents. Useful for GraphQL codegen.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n<PluginApiDocs />\n\n## Usage\n\nWith [GitHub GraphQL API v4](https://developer.github.com/v4) schema and following GraphQL operation:\n\n```graphql\nquery Viewer {\n  viewer {\n    login\n    name\n  }\n}\n```\n\nIt will generate following TypeScript code:\n\n```ts\nimport { DocumentNode } from 'graphql'\nimport gql from 'graphql-tag'\n\nexport const viewerQuery: DocumentNode = gql`\n  query Viewer {\n    viewer {\n      login\n      name\n    }\n  }\n`\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-fabbrica.mdx",
    "content": "---\ntitle: typescript-fabbrica\ndescription: GraphQL Code Generator Plugin to define mock data factory.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-generic-sdk.mdx",
    "content": "---\ntitle: typescript-generic-sdk\ndescription: Generate TypeScript SDK for GraphQL APIs. Supports Apollo Client, React Query, and more.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<PluginHeader />\n\n<Callout>Make sure you have `typescript` plugin and `typescript-operations` as well in your configuration:</Callout>\n\n<PluginApiDocs />\n\n## Usage\n\nYou can find a usage [example for Apollo-Client here](https://gist.github.com/akozhemiakin/731b0c1e99eb89b01f80f08f9146b6b6).\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-graphql-files-modules.mdx",
    "content": "---\ntitle: typescript-graphql-files-modules\ndescription: GraphQL Code Generator plugin for generating TypeScript types for GraphQL files. This plugin generates a single file per GraphQL file, and uses the `graphql-tag/loader` to load the GraphQL files.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\n<Callout>\n**Webpack Integration**\n\nIf you wish to have a simpler integration in a Webpack project, use [`graphql-let`](https://github.com/piglovesyou/graphql-let), it uses this plugin behind the scenes, and provides simpler developer experience.\n\n</Callout>\n\n## Pre-Requirements\n\nTo use this template, make sure you are using [`graphql-tag/loader`](https://github.com/apollographql/graphql-tag#webpack-preprocessing-with-graphql-tagloader) with Webpack.\n\n<PluginApiDocs />\n\n## Example\n\nGiven that you have a query named `MyQuery` in `my-query.graphql` file, this template will generate the following code:\n\n```ts\ndeclare module '*/my-query.graphql' {\n  import { DocumentNode } from 'graphql'\n  const MyQuery: DocumentNode\n\n  export { MyQuery }\n\n  export default defaultDocument\n}\n```\n\nAccordingly, you can import the generated types and use it in your code:\n\n```ts\nimport myQuery from './my-query.graphql'\n\n// OR\n\nimport { myQuery } from './my-query.graphql'\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-graphql-request.mdx",
    "content": "---\ntitle: typescript-graphql-request\ndescription: GraphQL Code Generator plugin for generating TypeScript code using graphql-request. This plugin generates a fully-typed SDK based on your GraphQL operations.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<PluginHeader />\n\n<Callout>Make sure you have `typescript` plugin and `typescript-operations` as well in your configuration:</Callout>\n\n<PluginApiDocs />\n\n## Usage Example\n\nFor the given input:\n\n```graphql\nquery continents {\n  continents {\n    name\n    countries {\n      ...CountryFields\n    }\n  }\n}\n\nfragment CountryFields on Country {\n  name\n  currency\n}\n```\n\nIt generates SDK you can import and wrap your `GraphQLClient` instance, and get fully-typed SDK based on your operations:\n\n```ts\nimport { GraphQLClient } from 'graphql-request'\nimport { getSdk } from './sdk' // THIS FILE IS THE GENERATED FILE\n\nasync function main() {\n  const client = new GraphQLClient('https://countries.trevorblades.com')\n  const sdk = getSdk(client)\n  const { continents } = await sdk.continents() // This is fully typed, based on the query\n\n  console.log(`GraphQL data:`, continents)\n}\n```\n\n## Simple Request Middleware\n\nThe generated sdk accepts an optional middleware function to wrap the requests the `client` makes.\n\nThis can enable scenarios like request failure retries and logging at the sdk level.\n\nTo use middleware, just pass an `SdkFunctionWrapper` as the second argument to `getSdk`.\n\n```ts\n// `SdkFunctionWrapper` is a type we provide. `action` is the `client` request execution generated by this template. The wrapper MUST invoke `action()` and should return the promise returned by `action`, or its resolution.\n\ntype SdkFunctionWrapper = <T>(action: () => Promise<T>) => Promise<T>\n```\n\n### Examples of Middleware\n\n- This example shows a naive request timing logger.\n\n```ts\nconst client = new GraphQLClient('')\nconst clientTimingWrapper: SdkFunctionWrapper = async <T>(action: () => Promise<T>): Promise<T> => {\n  const startTime = new Date()\n  const result = await action()\n  console.log('request duration (ms)', new Date() - startTime)\n  return result\n}\n\nconst sdk = getSdk(client, clientTimingWrapper)\n```\n\n- This example uses [polly-js](https://github.com/mauricedb/polly-js) to define a failure retry wrapper. (this is the use case for which I originally intended to add this capability)\n\n```ts\nconst withRetries: RetryWrapper = <T>(action: () => Promise<T>) =>\n  polly()\n    .handle((err: Error) => {\n      warn('GraphqlClient:NetworkError', err)\n      return err.message.includes('connect ETIMEDOUT')\n    })\n    .waitAndRetry(3)\n    .executeForPromise(info => {\n      if (info.count === 3) {\n        error('GraphqlClient:MaxRetries', null, {\n          ...info,\n          action: action.toString()\n        })\n      } else if (info.count > 0) {\n        warn('GraphqlClient:RetryingCall', null, {\n          ...info,\n          action: action.toString()\n        })\n      }\n\n      return action()\n    })\n\nconst sdk = getSdk(client, withRetries)\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-mock-data.mdx",
    "content": "---\ntitle: typescript-mock-data\ndescription: Generate mock data for your TypeScript types. Useful for testing and prototyping.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-mongodb.mdx",
    "content": "---\ntitle: typescript-mongodb\ndescription: GraphQL Code Generator plugin for generating TypeScript types for MongoDB models. This plugin generates TypeScript types for MongoDB models, which makes it relevant for server-side development only. It uses GraphQL directives to declare the types you want to generate and use in your MongoDB backend.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { isDev: false })\n\n<PluginHeader />\n\n<Callout type=\"warning\">\n  Don't install this plugin as `devDependency`, because you need to import the directives from it.\n</Callout>\n\nThis plugin generates TypeScript types for MongoDB models, which makes it relevant for server-side development only. It uses GraphQL directives to declare the types you want to generate and use in your MongoDB backend.\n\n### What this plugin does?\n\nGiven the following GraphQL declaration:\n\n```graphql\ntype User @entity {\n  id: String @id\n  username: String! @column\n  email: String @column\n}\n```\n\nWe can have the following TypeScript output:\n\n```ts\nimport { ObjectId } from 'mongodb'\n\nexport interface UserDbObject {\n  _id: ObjectId\n  username: string\n  email?: string | null\n}\n```\n\nThis interface can be used for db read/write purposes, thus making communication with the db much more consistent.\n\n<PluginApiDocs />\n\n## Usage Example\n\nOnce installed, add the directives' declaration to your GraphQL Schema definition:\n\n```ts\nimport { makeExecutableSchema } from '@graphql-tools/schema'\nimport { DIRECTIVES } from '@graphql-codegen/typescript-mongodb'\n\nconst schema = makeExecutableSchema({\n  typeDefs: [\n    DIRECTIVES\n    // the rest of your GraphQL types\n  ],\n  resolvers\n})\n```\n\nAnd generate code using `gql-gen`:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: './src/my-schema.js',\n  require: ['ts-node/register'],\n  generates: {\n    './src/generated/graphql.ts': {\n      plugins: ['typescript', 'typescript-mongodb']\n    }\n  }\n}\nexport default config\n```\n\nAt this point, you can add the directives to your GraphQL definitions, and generate your MongoDB models file.\n\n## Directives\n\n#### `@entity(additionalFields: [AdditionalEntityFields])` (on `OBJECT`)\n\nUse this directive to specify which GraphQL type should have generated MongoDB models.\n\n- `embedded: Boolean` - use this option to declare target entity as child of a greater entity. For example, given the following structure `{ _id: string, username: string, profile: { name: string }}`, the GraphQL type `Profile` should be declared as embedded.\n- `additionalFields: [AdditionalEntityFields]` - specify any additional fields that you would like to add to your MongoDB object, and are not a part of your public GraphQL schema.\n\n```graphql\ntype User\n  @entity(\n    additionalFields: [\n      { path: \"services.login.token\", type: \"string\" }\n      { path: \"services.login.refreshToken?\", type: \"string\" }\n    ]\n  ) {\n  id: String @id\n  email: String @column\n}\n```\n\n#### `@column(overrideType: String)` (on `FIELD_DEFINITION`)\n\nUse this directive to declare a specific GraphQL field as part of your generated MongoDB type.\n\n- `overrideType: String` - use this to override the type of the field; for example, if you store dates as `Date` but expose them as `String`.\n\n<Callout type=\"warning\">If target property is an embedded entity, you should use `@embedded` instead.</Callout>\n\n#### `@id` (on `FIELD_DEFINITION`)\n\nUse this directive on the filed that should be mapped to a MongoDB `_id`. By default, it should be the `id` field of the GraphQL `type`.\n\n#### `@link` (on `FIELD_DEFINITION`)\n\nUse this directive to declare that a specific field is a link to another type in another table. This will use the `ObjectId` type in the generated result.\n\n#### `@embedded` (on `FIELD_DEFINITION`)\n\nuse this option to declare target entity as child of a greater entity.\n\n#### `@map(path: String)` (on `FIELD_DEFINITION`)\n\nUse this directive to override the path or the name of the target field. This would come in handy whenever we would like to create a more complex object structure in the database;\nfor example, if you wish to project a field as `username` on your schema, but store it as `credentials.username` in your DB.\nYou can either specify the name of the field, or a path to which will lead to its corresponding field in the DB.\n\nGiven the following GraphQL schema:\n\n```graphql\ntype User @entity {\n  username: String @column @map(path: \"credentials.username\")\n}\n```\n\nThe output should be:\n\n```ts\nexport interface UserDbObject {\n  credentials: {\n    username: string\n  }\n}\n```\n\n#### `@abstractEntity(discriminatorField: String!)` (on `INTERFACE`)\n\nUse this directive on a GraphQL interface to mark it as a basis for other database types.\nThe `discriminatorField` argument is mandatory and will tell the generator what field name in the database determines what interface the target object is implementing.\n\nFor example:\n\n```graphql\ninterface BaseNotification @abstractEntity(discriminatorField: \"notificationType\") {\n  id: ID! @id\n  createdAt: String! @column(overrideType: \"Date\")\n}\n\ntype TextNotification implements BaseNotification @entity {\n  id: ID!\n  createdAt: String!\n  content: String! @column\n}\n```\n\nThis way, you will get:\n\n```ts\nexport interface BaseNotificationDbInterface {\n  notificationType: string\n  _id: ObjectId\n  createdAt: Date\n}\n\nexport interface TextNotificationDbObject extends BaseNotificationDbInterface {\n  content: string\n}\n```\n\n#### `@union(discriminatorField: String)` (on `UNION`)\n\nThis directive is similar to `@abstractEntity`, but for unions (that don't necessarily have any common fields).\nThe `discriminatorField` argument is mandatory and will tell the generator what field name in the database determines what interface the target object is implementing.\n\nGiven the following GraphQL schema:\n\n```graphql\ntype A @entity {\n  fieldA: String @column\n}\n\ntype B @entity {\n  fieldB: String @column\n}\n\nunion PossibleType @union(discriminatorField: \"entityType\") = A | B\n```\n\nThe output should be:\n\n```ts\nexport interface ADbObject {\n  fieldA: string\n}\n\nexport interface BDbObject {\n  fieldB: string\n}\n\nexport type PossibleType = { entityType: string } & (ADbObject | BDbObject)\n```\n\n## Example\n\nGiven the following GraphQL types:\n\n```graphql\ntype User @entity {\n  id: String! @id\n  username: String! @column\n  email: String! @column\n  profile: Profile! @embedded\n  friendsCount: Int! # this field won't get a generated MongoDB field\n  friends: [User]! @link\n}\n\ntype Profile @entity(embedded: true) {\n  name: String! @column\n  age: Int! @column\n}\n```\n\nThe generated MongoDB models should look like so:\n\n```ts\nimport { ObjectId } from 'mongodb'\n\nexport interface UserDbObject {\n  _id: ObjectId\n  username: string\n  email: string\n  profile: ProfileDbObject\n  friends: ObjectId[]\n}\n\nexport interface ProfileDbObject {\n  name: string\n  age: string\n}\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-msw.mdx",
    "content": "---\ntitle: typescript-msw\ndescription: TypeScript-MSW - Mock GraphQL requests with MSW.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<PluginHeader />\n\n[MSW](https://mswjs.io/) is a powerful tool for mocking HTTP requests in your tests and development environment. This plugin generates typed mock function wrappers for your GraphQL operations.\n\nThe generated functions are named with the pattern: `mock<OperationName><OperationType>[LinkName]`. As an example, a query with the name `getUser` would generate a mock function `mockGetUserQuery`. If you have links configured for multiple endpoints, the link name will be appended to the end. A link configured for the Stripe API, for example, would generate a mock name `mockAdminMutationStripe`. See below for more examples.\n\n## Configuration\n\nTo use this plugin, you need the `typescript` plugin and `typescript-operations` in your configuration.\n\nIf you are using the [`client`](https://the-guild.dev/graphql/codegen/plugins/presets/preset-client) you can simply add the `typescript-msw` plugin to your configuration:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  documents: ['src/**/*.tsx', 'src/**/*.ts', '!src/gql/**'],\n  generates: {\n    './src/gql/graphql.ts': {\n      preset: 'client',\n      plugins: ['typescript-msw']\n    }\n  }\n}\nexport default config\n```\n\n<PluginApiDocs />\n\n## Usage\n\nThe examples below assume the following GraphQL schema with a `getUser` query and a `setEmail` mutation.\n\n```graphql filename=\"schema.graphql\"\nquery GetUser($id: ID!) {\n  GetUser(id: $id) {\n    name\n    email\n    id\n  }\n}\n\nmutation SetUsername($id: ID!, $name: String!) {\n  SetUsername(id: $id, name: $name) {\n    id\n    name\n  }\n}\n```\n\n### Mocking a query response\n\n```ts filename=\"mocks.ts\"\nimport { mockGetUserQuery } from './generated'\nimport { HttpResponse } from 'msw'\n\nconst mockSuccess = mockGetUserQuery(({ variables }) => {\n  const { id } = variables\n\n  return HttpResponse.json({\n    data: {\n      getUser: { name: 'John Doe', id }\n    }\n  })\n})\n\nexport mockUserQuerySuccess;\n```\n\n### Mocking an error response\n\n```ts filename=\"mocks.ts\"\nimport { mockGetUserQuery } from './generated'\nimport { HttpResponse } from 'msw'\n\nconst mockUserQueryError = mockGetUserQuery(({ variables }) => {\n  return HttpResponse.json({\n    errors: [\n      {\n        message: 'User not found'\n      }\n    ]\n  })\n})\n\nexport mockUserQueryError;\n```\n\n### Accessing other resolver argument properties\n\nThe resolver function receives an object with a number of properties. The most up to date documentation is going to be in the [`msw` docs site](https://mswjs.io/docs/api/graphql#resolver-argument).\n\n```ts\nmockGetUserQuery({ query, variables, operationName, request }) => {})\n```\n\n## Migrating from MSW 1.x to 2.x\n\nMSW 2.x introduced a number of breaking changes. The types from `msw` are not compatible between the two versions so to upgrade, you will have to make some changes.\n\n### Updating the resolver function\n\nYou will need to update callback signatures to use the new resolver argument. In addition, the returned result must be a `Response` object.\n\n```ts filename=\"msw-v1.ts\"\nmockGetUserQuery((req, res, ctx) => {\n  const { id } = req.variables\n\n  return res(\n    ctx.data({\n      getUser: { name: 'John Doe', id }\n    })\n  )\n})\n```\n\nAfter:\n\n```ts filename=\"msw-v2.ts\"\nimport { HttpResponse } from 'msw'\nmockGetUserQuery(({ variables }) => {\n  const { id } = variables\n\n  return HttpResponse.json({\n    data: {\n      getUser: { name: 'John Doe', id }\n    }\n  })\n})\n```\n\n### Replacing the `res.once` method\n\nIn addition to the changes above, since the `res` object does not get passed to the resolver, you will need to adjust. To achieve the same behavior, you can pass a second \"options\" parameter to the mock function.\n\n```ts filename=\"msw-v1.ts\"\nmockGetUserQuery((req, res, ctx) => {\n  const { id } = req.variables\n\n  return res.once(\n    ctx.data({\n      getUser: { name: 'John Doe', id }\n    })\n  )\n})\n```\n\n```ts filename=\"msw-v2.ts\"\nimport { HttpResponse } from 'msw'\n\nmockGetUserQuery(\n  ({ variables }) => {\n    const { id } = variables\n\n    return HttpResponse.json({\n      data: {\n        getUser: { name: 'John Doe', id }\n      }\n    })\n  },\n  { once: true }\n)\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-nhost.mdx",
    "content": "---\ntitle: typescript-nhost\ndescription: GraphQL Code Generator plugin for Nhost Typescript SDK. It generates the schema for the Typescript Nhost SDK.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<PluginHeader />\n<PluginApiDocs />\n\nThis plugin generates the schema for the [`Typescript Nhost SDK`](https://docs.nhost.io/reference/javascript).\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:4000',\n  generates: {\n    'src/schema.ts': { plugins: ['typescript-nhost'] }\n  }\n}\nexport default config\n```\n\n## Usage\n\n### Step 1: Generate the schema\n\nFirst, install GraphQL codegen and the Nhost Typescript plugin:\n\n```sh\nyarn add -D @graphql-codegen/cli @graphql-codegen/typescript-nhost\n```\n\nThen configure the code generator by adding a `codegen.yaml` file:\n\n```yaml filename=\"codegen.yaml\"\nschema:\n  - http://localhost:1337/v1/graphql:\n      headers:\n        x-hasura-admin-secret: nhost-admin-secret\ngenerates:\n  ./src/schema.ts:\n    plugins:\n      - typescript-nhost\n```\n\n### Step 2: Install and configure the Nhost Typescript SDK\n\n```sh\nyarn add @nhost/nhost-js\n```\n\n```ts filename=\"src/main.ts\"\nimport { NhostClient } from '@nhost/nhost-js'\nimport schema from './schema'\n\nconst nhost = new NhostClient({ subdomain: 'localhost', schema })\n```\n\nA GraphQL query named `todos` will then be accessible through:\n\n```ts\nconst todos = await nhost.graphql.query.todos({ select: { contents: true } })\n```\n\nThe `todos` object will be strongly typed based on the GraphQL schema, and the fields that would have been selected in the query.\n\n## Custom scalars\n\nIt is possible to customize the scalar types in adapting the configuration file.\nThe following example illustrates how to specify some Hasura scalars. The `@graphql-codegen/add` plugin is necessary to be able to add the definition of the `JSONValue` type.\n\n```yaml filename=\"codegen.yaml\"\nschema:\n  - http://localhost:1337/v1/graphql:\n      headers:\n        x-hasura-admin-secret: nhost-admin-secret\ngenerates:\n  ./src/schema.ts:\n    plugins:\n      - typescript-nhost\n      - add:\n          content: 'export type JSONValue = string | number | boolean | { [x: string]: JSONValue } | Array<JSONValue>;'\n    config:\n      scalars:\n        uuid: 'string'\n        bigint: 'number'\n        citext: 'string'\n        timestamptz: 'string'\n        json: 'JSONValue'\n        jsonb: 'JSONValue'\n        bytea: 'string'\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-oclif.mdx",
    "content": "---\ntitle: typescript-oclif\ndescription: Generate a Typescript Oclif CLI. This plugin is based on the official Typescript plugin.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<PluginHeader />\n<PluginApiDocs />\n\nThis plugin generates [`oclif`](https://npmjs.com/package/oclif) CLI commands.\n\nThen, make sure you have `typescript` plugin as well in your configuration:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'http://localhost:4000',\n  documents: 'src/commands/**/*.graphql',\n  generates: {\n    'src/types.ts': { plugins: ['typescript'] },\n    'src/commands/': {\n      preset: 'near-operation-file',\n      presetConfig: {\n        extension: '.ts',\n        baseTypesPath: '../types.ts'\n      },\n      plugins: [\n        {\n          'typescript-oclif': {\n            handlerPath: '../../handler'\n          }\n        }\n      ]\n    }\n  }\n}\nexport default config\n```\n\n## Usage\n\nWith GraphQL Codegen, building a CLI tool for your GraphQL API couldn't be easier. In four steps,\nyou can have a user-friendly command-line interface:\n\n1. Generate a boilerplate CLI using `oclif`\n2. Add GraphQL Documents (Queries & Mutations)\n3. Add and export a graphql client of your choice (`graphql-request`, `apollo-client`, etc.)\n4. Add, configure, and run the code generator\n\n### Step 1: Generate the CLI scaffold\n\nYou'll be starting from your projects directory. From there, generate the CLI skeleton using `oclif`\nby following the steps in their [guide](https://oclif.io/docs/introduction). You can choose either\nthe `single` or `multi` type, and can switch later if you change your mind.\n\n### Step 2: Add GraphQL Documents\n\nThese documents are how `oclif` will interact with your API. For each document, there will be\nexactly one command.\n\nWithin the directory created by the `oclif` tool, you'll have a subdirectory `src/commands`. That's\nwhere you'll put your GraphQL documents. Ie, to create a `<cli-name> hello` command, you'd write a\n`src/commands/hello.graphql` document, which will be used to generate a `src/commands/hello.ts`\nfile. **Important**: each document should have exactly one GraphQL operation.\n\n### Step 3: Add & Export a GraphQL Query Handler\n\nWhich client you use, and how you configure it, is entirely up to you! It just has to conform to\nthis `QueryHandler` signature:\n\n```ts\nimport { Command } from '@oclif/command'\n\ninterface QueryHandlerProps {\n  command: Command\n  query: string\n  variables?: Record<string, any>\n}\n\ntype QueryHandler = (props: QueryHandlerProps) => any\n```\n\nThis allows you to pre-process, send, and post-process requests however you'd like, as well as format\nthe results returned. The arguments are:\n\n- `command`: the command object being executed, described [here](https://oclif.io/docs/commands) in the `oclif` documentation.\n- `query`: the string version of the GraphQL query being executed.\n- `variables`: the variables as configured in your GraphQL operation and parsed by `oclif`.\n\nYou can add a `src/handler.ts` (or any other path), configure your handler function there, and then\nexport your handler as the **default export**. It's in this module that you can handle auth logic,\nread config files, etc., and that will apply to all CLI operations. This file will not be modified\nby the codegen.\n\nTo get started quickly and easily, consider using the simple `graphql-request` as your handler:\n\n```ts filename=\"handler.ts\"\nimport { GraphQLClient } from 'graphql-request'\nimport { Command } from '@oclif/command'\n\ninterface QueryHandlerProps {\n  command: Command\n  query: string\n  variables?: Record<string, any>\n}\n\n// Change the URL to the endpoint your CLI will use\nconst client = new GraphQLClient('http://localhost:4000')\n\nconst handler = ({ command, query, variables }: QueryHandlerProps) => {\n  return client.request(query, variables).then(command.log).catch(command.error)\n}\n\nexport default handler\n```\n\n### Step 4: Add & Configure GraphQL Codegen\n\nFirst, follow the GraphQL-Code-Generator guide to install it, and make sure to also install\n`@graphql-codegen/typescript-oclif`. Then, change your `codegen.yml` file to look like this:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: '<path-to-your-schema>',\n  documents: 'src/commands/**/*.graphql',\n  generates: {\n    'src/types.ts': { plugins: ['typescript'] },\n    'src/commands/': {\n      preset: 'near-operation-file',\n      presetConfig: {\n        extension: '.ts',\n        baseTypesPath: '../types.ts'\n      },\n      plugins: [\n        {\n          'typescript-oclif': {\n            client: '../../client'\n          }\n        }\n      ]\n    }\n  }\n}\nexport default config\n```\n\nBreaking that down:\n\n- Reading your schema allows the codegen tool to understand what types it's working with\n- The 'documents' section will collect all of your `*.graphql` files\n- `src/types.ts` creates the typescript types that the rest of the tool can reference\n- `near-operation-file` is a `graphql-codegen` preset which allows one output file per input file\n  (ie, one `.ts` module per `.graphql` document) rather than one output file for the whole package.\n  This is _required_ for `oclif` to work, since it uses the file structure to generate the command structure.\n- Note: `typescript-operations` plugin isn't required, since this library isn't meant to be consumed\n  programmatically (and so nothing reads the types that `typescript-operations` would produce)\n- The `client` path is to the file which has a default export of your `graphql-request` client,\n  relative to the generated files (ie here, `src/commands/something/file.graphql`).\n  Note that it has no extension.\n\nWith that configured, just run `yarn graphql-codegen` or `npx graphql-code-generator` to generate all the\nnecessary `oclif` command files. With that complete, follow the directions in the\n[oclif guide](https://oclif.io/docs/introduction) to run your new CLI tool.\n\n## Advanced Features\n\n### Descriptions & Examples\n\nYou can add descriptions and examples for your commands via `typescript-oclif` with the `@oclif`\nclient-side directive, like so:\n\n```graphql\nmutation CreateAuthor($name: String!)\n@oclif(\n  description: \"Create a new author\"\n  example: \"cli author:create --name Alice\"\n  example: \"cli author:create --name Bob\"\n) {\n  createAuthor(input: { name: $name }) {\n    name\n  }\n}\n```\n\nThis `@oclif` directive will not be sent to the server. Note that, for multiple examples, you must\nuse multiple `example` keys rather than an `examples` array. This is a ~~quirk~~ feature of\n`graphql`.\n\n### Custom/Manually-maintained Commands\n\nIf you want a command that doesn't just execute a GraphQL Query or Mutation, then you can still\ncreate one manually in the same way as any other `oclif` application. If you wanted to add a `fix`\ncommand, for example, you can just create a file at `src/commands/fix.ts`, follow the `oclif` API\n(ie, export a class with a `run()` method), and `graphql-codegen` won't disturb that file - so long\nas you **don't** _also_ create a `fix.graphql` file next to it (in which case, it _would_ override\n`fix.ts` on the next run of `graphql-codegen`).\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-operations.mdx",
    "content": "---\ntitle: typescript-operations\ndescription: Generate TypeScript operations from GraphQL queries. This plugin is based on the `typescript` plugin, but it generates operations instead of types.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<Callout>\n  This plugin is meant to be used for low-level use cases or as building block for presets.\n  <br /> For building a **GraphQL client application** we recommend using the [`client-preset`](/plugins/presets/preset-client).\n</Callout>\n\n<PluginHeader />\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-react-apollo.mdx",
    "content": "---\ntitle: typescript-react-apollo\ndescription: GraphQL Code Generator plugin for TypeScript and React Apollo. Generates React Hooks and HOCs for your GraphQL operations.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<Callout type=\"info\">\n\nWe now recommend using the `client-preset` package for a **better developer experience** and smaller impact on bundle size.\n\n**Get started on [our \"React/Vue\" guide](/docs/guides/react-vue).**\n\n</Callout>\n\n<Callout type=\"warning\">\n\nThe generated hooks created by this package are no longer compatible with Apollo Client 4.0. We provide a codemod that automates the the migration to the `client` preset. See the [tutorial video](https://youtu.be/GGmt0hvnQNU?si=4DQEyqc24pfiih9J) to learn how to use the codemod to migrate your codebase.\n\n</Callout>\n\n<PluginHeader />\n<PluginApiDocs />\n\n## Usage Example\n\n### With React Hooks\n\nFor the given input:\n\n```graphql\nquery Test {\n  feed {\n    id\n    commentCount\n    repository {\n      full_name\n      html_url\n      owner {\n        avatar_url\n      }\n    }\n  }\n}\n```\n\nAnd the following configuration:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'YOUR_SCHEMA_HERE',\n  documents: './src/**/*.graphql',\n  generates: {\n    './generated-types.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo']\n    }\n  }\n}\nexport default config\n```\n\nCodegen will pre-compile the GraphQL operation into a `DocumentNode` object, and generate a ready-to-use React Hook for each operation you have.\n\nIn your application code, you can import it from the generated file, and use the React Hook in your component code:\n\n```tsx\nimport { useTest } from './generated-types'\n\nexport const MyComponent: React.FC = () => {\n  const { data, error, loading } = useTest()\n\n  return <div>…</div>\n}\n```\n\n### Generate Data Component\n\nCodegen also supports generating data Components (deprecated in `@apollo/client` v3), you can turn it on this way:\n\n```ts filename=\"codegen.ts\" {10}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'YOUR_SCHEMA_HERE',\n  documents: './src/**/*.graphql',\n  generates: {\n    './generated-types.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],\n      config: {\n        withComponent: true\n      }\n    }\n  }\n}\nexport default config\n```\n\n### Generate HOC\n\nCodegen also supports generating High-Order-Components (deprecated in `@apollo/client` v3), you can turn it on this way:\n\n```ts filename=\"codegen.ts\" {10}\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'YOUR_SCHEMA_HERE',\n  documents: './src/**/*.graphql',\n  generates: {\n    './generated-types.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-apollo'],\n      config: {\n        withHOC: true\n      }\n    }\n  }\n}\nexport default config\n```\n\n<Callout>\n  Watch [Episode #29 of `graphql.wtf`](https://graphql.wtf/episodes/29-apollo-client-3-with-graphql-code-generator) for\n  a quick introduction to using this plugin with GraphQL Code Generator:\n</Callout>\n\n<iframe src=\"https://youtube.com/embed/PYDGjTufGsk\" />\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-react-query.mdx",
    "content": "---\ntitle: typescript-react-query\ndescription: GraphQL Code Generator plugin for generating React Query hooks. Supports TypeScript and Flow.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<Callout type=\"info\">\n\nWe now recommend using the `client-preset` package for a **better developer experience** and smaller impact on bundle size.\n\n**Get started on [our \"React/Vue\" guide](/docs/guides/react-vue).**\n\n</Callout>\n\n<PluginHeader />\n<PluginApiDocs />\n\n## Usage Examples\n\n<Callout>\n  Note: all generated hooks are just wrappers around `react-query` original functions. This codegen plugin just burns\n  the generated TypeScript types into the operation, and provides flexibility to choose your `fetcher`.\n</Callout>\n\n### Using default `fetch`\n\nBy default, this plugin will generate a `fetcher` based on the environment global `fetch` definition.\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'MY_SCHEMA_PATH',\n  documents: './src/**/*.graphql',\n  generates: {\n    './generates.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-query'],\n      config: {\n        fetcher: 'fetch'\n      }\n    }\n  }\n}\nexport default config\n```\n\nTo use the generated hooks, import it, and then specify the endpoint and optionally `fetchParams`:\n\n```ts\nimport { useMyQuery } from './generated'\n\nexport const MyComponent = () => {\n  const { status, data, error, isFetching } = useMyQuery({\n    endpoint: 'http://localhost:3000/graphql',\n    fetchParams: {\n      headers: {\n        'My-Header': 'XYZ'\n      }\n    }\n  })\n}\n```\n\n### Using `fetch` with Codegen configuration\n\nIf you wish to avoid specifying `endpoint` and `fetchParams` on each hook usage, you can specify those in the `codegen.yml` file:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'MY_SCHEMA_PATH',\n  documents: './src/**/*.graphql',\n  generates: {\n    './generates.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-query'],\n      config: {\n        fetcher: {\n          endpoint: 'http://localhost:3000/graphql',\n          fetchParams: {\n            headers: {\n              'My-Header': 'SomeValue'\n            }\n          }\n        }\n      }\n    }\n  }\n}\nexport default config\n```\n\nAnd if you wish to have more control over the value, or even provide it in runtime, you can use environment variables:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'MY_SCHEMA_PATH',\n  documents: './src/**/*.graphql',\n  generates: {\n    './generates.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-query'],\n      config: {\n        fetcher: {\n          endpoint: 'process.env.ENDPOINT'\n        }\n      }\n    }\n  }\n}\nexport default config\n```\n\nYou can even use a custom variable from your code, and add custom imports with `add` plugin:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'MY_SCHEMA_PATH',\n  documents: './src/**/*.graphql',\n  generates: {\n    './generates.ts': {\n      plugins: [\n        {\n          add: {\n            content: \"import { endpointUrl, fetchParams } from './my-config';\"\n          }\n        },\n        'typescript',\n        'typescript-operations',\n        'typescript-react-query'\n      ],\n      config: {\n        fetcher: {\n          endpoint: 'endpointUrl',\n          fetchParams: 'fetchParams'\n        }\n      }\n    }\n  }\n}\nexport default config\n```\n\nThe generated hooks doesn't require you to specify anything, you can just use it as-is:\n\n```ts\nimport { useMyQuery } from './generated'\n\nexport const MyComponent = () => {\n  const { status, data, error, isFetching } = useMyQuery({})\n}\n```\n\n### Using `graphql-request`\n\nIf you are using `graphql-request`, you can set `fetcher` to `graphql-request`, and then the generated React Hook will expect you to pass the `GraphQLClient` instance (created by `graphql-request` library).\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'MY_SCHEMA_PATH',\n  documents: './src/**/*.graphql',\n  generates: {\n    './generates.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-query'],\n      config: {\n        fetcher: 'graphql-request'\n      }\n    }\n  }\n}\nexport default config\n```\n\nAnd the, while using, provide your `client` instance:\n\n```ts\nimport { useMyQuery } from './generated'\nimport { client } from './my-graphql-request-client'\n\nexport const MyComponent = () => {\n  const { status, data, error, isFetching } = useMyQuery(client, {})\n}\n```\n\n### Using Custom Fetcher\n\nIf you wish to create a custom fetcher, you can provide your own function as a Mapper string (`file#identifier`). Codegen will take care of importing it and use it as a fetcher.\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'MY_SCHEMA_PATH',\n  documents: './src/**/*.graphql',\n  generates: {\n    './generates.ts': {\n      plugins: ['typescript', 'typescript-operations', 'typescript-react-query'],\n      config: {\n        fetcher: {\n          func: './my-file#myFetcher',\n          isReactHook: false // optional, defaults to false, controls the function's signature. Read below\n        }\n      }\n    }\n  }\n}\nexport default config\n```\n\nAs a shortcut, the `fetcher` property may also directly contain the function as a mapper string:\n\n```ts filename=\"codegen.ts\"\n# …\nconfig:\n  fetcher: './my-file#myFetcher' # isReactHook is false here (the default version)\n```\n\nCodegen will use `myFetcher`, and you can just use the hook directly:\n\n```ts\nimport { useMyQuery } from './generated'\n\nexport const MyComponent = () => {\n  const { status, data, error, isFetching } = useMyQuery({})\n}\n```\n\nDepending on the `isReactHook` property, your `myFetcher` should be in the following signature:\n\n- `isReactHook: false`\n  ```ts\n  type MyFetcher<TData, TVariables> = (operation: string, variables?: TVariables, options?: RequestInit['headers']): (() => Promise<TData>)\n  ```\n- `isReactHook: true`\n  ```ts\n  type MyFetcher<TData, TVariables> = (operation: string, options?: RequestInit['headers']): ((variables?: TVariables) => Promise<TData>)\n  ```\n\n#### Usage example (`isReactHook: false`)\n\n```tsx\nexport const fetchData = <TData, TVariables>(\n  query: string,\n  variables?: TVariables,\n  options?: RequestInit['headers']\n): (() => Promise<TData>) => {\n  return async () => {\n    const res = await fetch('https://api.url', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        ...options\n      },\n      body: JSON.stringify({\n        query,\n        variables\n      })\n    })\n\n    const json = await res.json()\n\n    if (json.errors) {\n      const { message } = json.errors[0] || {}\n      throw new Error(message || 'Error…')\n    }\n\n    return json.data\n  }\n}\n```\n\n#### Usage example (`isReactHook: true`)\n\n```tsx\nexport const useFetchData = <TData, TVariables>(\n  query: string,\n  options?: RequestInit['headers']\n): ((variables?: TVariables) => Promise<TData>) => {\n  // it is safe to call React Hooks here.\n  const { url, headers } = React.useContext(FetchParamsContext)\n\n  return async (variables?: TVariables) => {\n    const res = await fetch(url, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        ...headers,\n        ...options\n      },\n      body: JSON.stringify({\n        query,\n        variables\n      })\n    })\n\n    const json = await res.json()\n\n    if (json.errors) {\n      const { message } = json.errors[0] || {}\n      throw new Error(message || 'Error…')\n    }\n\n    return json.data\n  }\n}\n```\n\n<Callout>\n  Note: The return value is an async function, with no params, that returns a `Promise` with the actual data.\n</Callout>\n\n### Using Infinite Query\n\nIf you wish to use infinite query for pagination or infinite scroll you can with the `addInfiniteQuery` config setting. This will however setup an infinite query for every request whether in reality it can do it or not.\n\nTo use this you need to return an object of new queries, and it blends them in to the query.\n\n#### Usage example (`addInfiniteQuery: true`)\n\nwith the following query:\n\n```graphql\nquery AnimalsQuery($catsRange: Int, $catsStarting: Int, $dogsRange: Int, $dogsStarting: Int) {\n  cats(range: $catsRange, starting: $catsStarting) {\n    # …\n  }\n  dogs(range: $dogsRange, starting: $dogsStarting) {\n    # …\n  }\n}\n```\n\n```tsx\nimport { useInfiniteMyQuery } from './generated'\n\nexport const MyComponent = () => {\n  const { status, data, error, isFetching } = useInfiniteAnimalsQuery(\n    {\n      catsRange: 5,\n      catsStarting: 0,\n      dogsRange: 10,\n      dogsStarting: 0\n    },\n    {\n      getNextPageParam(lastPage, allPages) {\n        const totalLocal = (allPages.length ?? 0) * (queryParams.limit ?? 1)\n        const totalDogs = lastPage.dogs.items?.length ?? 0\n        if (totalLocal < totalDogs) {\n          return {\n            catsStarting: totalLocal * 5,\n            dogsStarting: totalLocal * 10\n          }\n        }\n      }\n    }\n  )\n}\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-resolvers.mdx",
    "content": "---\ntitle: typescript-resolvers\ndescription: Generate TypeScript resolvers types. Works with graphql-tools and apollo-server. Supports custom mappers and enum resolvers.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<Callout>\n  This plugin is meant to be used for low-level use cases or as building block for presets.\n  <br /> For building a **GraphQL server schema** we recommend using the [`server-preset`](/docs/guides/graphql-server-apollo-yoga-with-server-preset).\n</Callout>\n\n<PluginHeader />\n\n<Callout>\n  Watch [Episode #26 of `graphql.wtf`](https://graphql.wtf/episodes/26-type-safe-resolvers-with-graphql-code-generator)\n  for a quick introduction to this plugin and its features:\n</Callout>\n\n<iframe src=\"https://youtube.com/embed/tHMaNmqPIC4\" />\n\n<Callout>\n  [More weekly episodes are available in `graphql.wtf`](https://graphql.wtf/) by [Jamie\n  Barton](https://twitter.com/notrab).\n</Callout>\n\n<PluginApiDocs />\n\n## Usage Example\n\n<Callout>\n**Quick Start with `typescript-resolvers`**\n\nYou can find [a blog post we wrote about using and customizing this plugin here](https://the-guild.dev/blog/better-type-safety-for-resolvers-with-graphql-codegen)\n\n</Callout>\n\nRun `graphql-codegen` as usual, with this new plugin:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.json',\n  generates: {\n    './src/resolvers-types.ts': {\n      plugins: ['typescript', 'typescript-resolvers']\n    }\n  }\n}\nexport default config\n```\n\nImport the types from the generated file and use in the resolver:\n\n```ts\nimport { Resolvers } from './resolvers-types'\n\nexport const resolvers: Resolvers = {\n  Query: {\n    myQuery: (root, args, context) => {}\n  }\n}\n```\n\nThis will make the resolver fully typed and compatible with typescript compiler, including the handler's arguments and return value.\n\nGenerated resolvers can be passed directly into [graphql-tools](https://npmjs.com/package/graphql-tools) `makeExecutableSchema` function.\n\n## Integration with Apollo-Server\n\nBy default `apollo-server` will not work with generated resolvers signature.\n\nIf you are using Apollo Server with TypeScript, note that you need to set `useIndexSignature: true` in your config, in order to add a compatible index signature ([more info](https://github.com/dotansimha/graphql-code-generator/issues/1133#issuecomment-456812621)).\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  generates: {\n    './resolvers-types.ts': {\n      config: {\n        useIndexSignature: true\n      },\n      plugins: ['typescript', 'typescript-resolvers']\n    }\n  }\n}\nexport default config\n```\n\nIf you wish to have an easy start, and have the ability to use resolvers chaining without models types, you can also add to your config `defaultMapper: Partial<{T}>`. This will allow you to return partial types in your resolvers.\n\n## Use Your Model Types (`mappers`)\n\nIf you wish to use your custom model types, codegen allow you to use `mappers` feature to map GraphQL types to your custom model types. [You can find an article explaining how to use `mappers` here](https://the-guild.dev/blog/better-type-safety-for-resolvers-with-graphql-codegen).\n\nHere's the basic example of using it:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  generates: {\n    './resolvers-types.ts': {\n      config: {\n        contextType: 'models#MyContextType',\n        mappers: {\n          User: './models#UserModel',\n          Profile: './models#UserProfile'\n        }\n      },\n      plugins: ['typescript', 'typescript-resolvers']\n    }\n  }\n}\nexport default config\n```\n\n## Enum Resolvers\n\n[Apollo-Server](https://apollographql.com/docs/apollo-server) and schemas built with [`graphql-tools`](https://graphql-tools.com) supports creating resolvers for GraphQL `enum`s.\n\nThis is helpful because you can have internal values that are different from the public enum values, and you can use the internal values in your resolvers.\n\nCodegen allows you to specify either `mappers` or `enumValues` to map enums in your resolvers, and if you are using it for enums, you'll get a resolver signature for the enum resolvers as well.\n\n### Usage Example\n\nWith the following schema:\n\n```graphql\ntype Query {\n  favoriteColor: Color!\n}\n\nenum Color {\n  RED\n  BLUE\n}\n```\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  generates: {\n    './resolvers-types.ts': {\n      config: {\n        enumValues: {\n          Color: './enums#ColorsCode'\n        }\n      },\n      plugins: ['typescript', 'typescript-resolvers']\n    }\n  }\n}\nexport default config\n```\n\n```ts filename=\"enums.ts\"\nexport enum ColorsCode {\n  MY_RED = '#FF0000',\n  MY_BLUE = '#0000FF'\n}\n```\n\n```ts filename=\"resolvers.ts\"\nimport { Resolvers } from './resolvers-types'\nimport { ColorsCode } from './enums'\n\nconst resolvers: Resolvers = {\n  Color: {\n    RED: ColorsCode.MY_RED,\n    BLUE: ColorsCode.MY_BLUE\n  },\n  Query: {\n    favoriteColor: () => ColorsCode.MY_RED // Now you cn return this, and it will be mapped to your actual GraphQL enum\n  }\n}\n```\n\nYou can also define the same with explicit enum values:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  generates: {\n    './resolvers-types.ts': {\n      config: {\n        enumValues: {\n          Color: {\n            RED: '#FF0000',\n            BLUE: '#0000FF'\n          }\n        }\n      },\n      plugins: ['typescript', 'typescript-resolvers']\n    }\n  }\n}\nexport default config\n```\n\nOr, with `mappers`:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  generates: {\n    './resolvers-types.ts': {\n      config: {\n        mappers: {\n          Color: './enums#ColorsCode'\n        }\n      },\n      plugins: ['typescript', 'typescript-resolvers']\n    }\n  }\n}\nexport default config\n```\n\n## Defined shared mappers across configurations\n\nIn some case, you might want to share some common `mappers` between many output file configurations.\n\nTo do so, you can leverage the YAML references features as follow:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst sharedMappers = {\n  ID: 'IDType'\n}\n\nconst config: CodegenConfig = {\n  schema: 'schema.graphql',\n  documents: 'src/*.ts',\n  generates: {\n    'resolvers-types-1.ts': {\n      plugins: ['typescript', 'typescript-resolvers'],\n      config: {\n        mappers: {\n          ...sharedMappers,\n          String: 'StringType'\n        }\n      }\n    },\n    'resolvers-types-2.ts': {\n      plugins: ['typescript', 'typescript-resolvers'],\n      config: {\n        mappers: {\n          ...sharedMappers,\n          String: 'StringType'\n        }\n      }\n    }\n  }\n}\nexport default config\n```\n\nThe above configuration will provide the ID type mapping to both `resolvers-types-1.ts` and `resolvers-types-2.ts` files.\n\nThe complete example is available here: [codegen-repros/reusable-mappers](https://github.com/charlypoly/codegen-repros/blob/master/reusable-mappers/codegen.yml)\n\nYou can also achieve a similar reusable mappers configuration by providing a TypeScript or JavaScript file configuration.\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-rtk-query.mdx",
    "content": "---\ntitle: typescript-rtk-query\ndescription: RTK Query codegen plugin for GraphQL. Generates React Hooks for GraphQL queries and mutations. Works with any GraphQL client.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<PluginHeader />\n<PluginApiDocs />\n\n## Usage Examples\n\n<Callout>\n  Note: this plugin just injects new endpoints into an existing API you created with `createApi`, so you still have to\n  define that - but also have all freedom on how to do that.\n</Callout>\n\n### Using `graphql-request`\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'MY_SCHEMA_PATH',\n  documents: './src/**/*.graphql',\n  generates: {\n    './src/app/api/generated.ts': {\n      plugins: [\n        'typescript',\n        'typescript-operations',\n        {\n          'typescript-rtk-query': {\n            importBaseApiFrom: 'src/app/api/baseApi',\n            exportHooks: true\n          }\n        }\n      ]\n    }\n  }\n}\nexport default config\n```\n\nThe generated `src/app/api/generated.ts` would try to `import { api } from 'src/app/api/baseApi'{:ts}`, so you have to create that file:\n\n```ts filename=\"src/app/api/baseApi.ts\" {7-10}\nimport { createApi } from '@reduxjs/toolkit/query/react'\nimport { graphqlRequestBaseQuery } from '@rtk-query/graphql-request-base-query'\nimport { GraphQLClient } from 'graphql-request'\n\nexport const client = new GraphQLClient('/graphql')\n\nexport const api = createApi({\n  baseQuery: graphqlRequestBaseQuery({ client }),\n  endpoints: () => ({})\n})\n```\n\nFrom that point on, you can import the generated hooks from `src/app/api/generated.ts`:\n\n```ts filename=\"src/components/MyComponent.ts\" {4}\nimport { useMyQuery } from 'src/app/api/generated'\n\nexport const MyComponent = () => {\n  const { data, isLoading } = useMyQuery({ page: 5 })\n}\n```\n\n### Extending generated code\n\nYou can import the generated code into a new file and use `api.enhanceEndpoints{:ts}` to add lifecycle hooks or `providesTags`/`invalidatedTags` information to your api:\n\n```ts filename=\"src/аpp/api/enhanced.ts\"\nimport { api as generatedApi } from 'src/app/api/generated'\n\nexport const api = generatedApi.enhanceEndpoints({\n  addTagTypes: ['User'],\n  endpoints: {\n    GetUserById: {\n      providesTags: (result, error, arg) => [{ type: 'User', id: arg.userId }]\n    }\n  }\n})\n\nexport const { useGetUserByIdQuery } = api\n```\n\nMake sure that this file is referenced from your code so that the enhanced endpoints are usable. The easiest way to do this is to re-export the hooks in this file and import them exclusively from it.\n\n#### Setting an authentication header after a Mutation\n\nYou can also use this to set an \"authentication\" header after a login mutation:\n\n```ts {7-10}\nimport { api as generatedApi } from 'src/app/api/generated'\nimport { client } from 'src/app/api/baseApi'\n\nexport const api = generatedApi.enhanceEndpoints({\n  endpoints: {\n    Login: {\n      async onQueryStarted(arg, { queryFulfilled }) {\n        const { data } = await queryFulfilled\n        client.setHeader('authentication', `Bearer ${data.token}`)\n      }\n    }\n  }\n})\n\nexport const { useLoginMutation } = api\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-stencil-apollo.mdx",
    "content": "---\ntitle: typescript-stencil-apollo\ndescription: A Stencil plugin for generating TypeScript code from GraphQL queries. This plugin uses Apollo Client.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<PluginHeader />\n<PluginApiDocs />\n\n## Usage Example\n\nFor the given input:\n\n```graphql\nquery Test {\n  feed {\n    id\n    commentCount\n    repository {\n      full_name\n      html_url\n      owner {\n        avatar_url\n      }\n    }\n  }\n}\n```\n\nWe can use the generated code like this:\n\n```tsx\n<TestComponent variables={...}>\n  …\n</TestComponent>\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-svelte-apollo.mdx",
    "content": "---\ntitle: typescript-svelte-apollo\ndescription: This plugin generates observable Apollo queries with Typescript typings. This is a community plugin, to report eventual issues or find more examples, refer to this repository\n---\n\nimport { PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\nThis plugin generates observable Apollo queries with Typescript typings.\n\nThis is a community plugin, to report eventual issues or find more examples, refer to this [repository](https://github.com/ticruz38/graphql-codegen-svelte-apollo#readme)\n\nIt extends the basic TypeScript plugins: `@graphql-codegen/typescript`, `@graphql-codegen/typescript-operations` - and thus shares a similar configuration.\n\n## API Reference\n\n### `clientPath`\n\ntype: `string`\ndefault: `null`\nrequired: true\n\nPath to the apollo client for this project (should point to a file with an apollo-client as default export)\n\n#### Usage Examples\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  generates: {\n    'path/to/file.ts': {\n      plugins: ['typescript', 'typescript-operations', 'graphql-codegen-svelte-apollo'],\n      config: {\n        clientPath: 'PATH_TO_APOLLO_CLIENT'\n      }\n    }\n  }\n}\nexport default config\n```\n\n### `asyncQuery`\n\ntype: `boolean`\ndefault: `false`\n\nBy default, the plugin only generate observable queries, sometimes it may be useful to generate promise-based queries\n\n#### Usage Examples\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  generates: {\n    'path/to/file.ts': {\n      plugins: ['typescript', 'typescript-operations', 'graphql-codegen-svelte-apollo'],\n      config: {\n        clientPath: 'PATH_TO_APOLLO_CLIENT',\n        asyncQuery: true\n      }\n    }\n  }\n}\nexport default config\n```\n\n## Usage Example\n\n### With Observable queries\n\nFor the given input:\n\n```graphql\nfragment TransactionFragment on TransactionDescription {\n  contractAddress\n  from\n  gasUsed\n  gasPrice\n  input\n  isError\n  to\n  value\n}\n\nquery Transactions($address: String) {\n  transactions(address: $address) {\n    ...TransactionFragment\n  }\n}\n```\n\nAnd the following configuration:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'YOUR_SCHEMA_HERE',\n  documents: './src/**/*.graphql',\n  generates: {\n    'path/to/file.ts': {\n      plugins: ['typescript', 'typescript-operations', 'graphql-codegen-svelte-apollo'],\n      config: {\n        clientPath: 'PATH_TO_APOLLO_CLIENT'\n      }\n    }\n  }\n}\nexport default config\n```\n\nCodegen will pre-compile the GraphQL operation into a `DocumentNode` object, and generate a ready-to-use Apollo query for each operation you have.\n\nIn your application code, you can import it from the generated file, and use the query in your component code:\n\n```svelte\n<script lang=\"ts\">\n  import { Transactions } from 'codegen'\n\n  var address = '0x0000000000000000000000000000'\n  $: t = Transactions({ address })\n</script>\n\n<ul>\n  {#each $t?.data?.transactions || [] as transaction}\n    <li>Sent transaction from {transaction.from} to {transaction.to}</li>\n  {/each}\n</ul>\n```\n\nEach time you change the address, the query will re-fetch and show the new results in the template.\n\n### With Async Queries\n\nSometimes, you may need/prefer to have an async query (only available with asyncQuery option set to true)\n\nFor the given input:\n\n```graphql\nfragment TransactionFragment on TransactionDescription {\n  contractAddress\n  from\n  gasUsed\n  gasPrice\n  input\n  isError\n  to\n  value\n}\n\nquery Transactions($address: String) {\n  transactions(address: $address) {\n    ...TransactionFragment\n  }\n}\n```\n\nAnd the following configuration:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  schema: 'YOUR_SCHEMA_HERE',\n  documents: './src/**/*.graphql',\n  generates: {\n    'path/to/file.ts': {\n      plugins: ['typescript', 'typescript-operations', 'graphql-codegen-svelte-apollo'],\n      config: {\n        clientPath: 'PATH_TO_APOLLO_CLIENT',\n        asyncQuery: true\n      }\n    }\n  }\n}\nexport default config\n```\n\nCodegen will pre-compile the GraphQL operation into a `DocumentNode` object, and generate a ready-to-use Apollo query for each operation you have.\n\nIn your application code, you can import it from the generated file, and use the query in your component code:\n\n```svelte\n<script lang=\"ts\">\n  import { AsyncTransactions } from 'codegen'\n\n  var address = '0x0000000000000000000000000000'\n</script>\n\n<ul>\n  {#await AsyncTransactions({ address })}\n    Loading…\n  {:then transactions}\n    {#each transactions || [] as transaction}\n      <li>Sent transaction from {transaction.from} to {transaction.to}</li>\n    {/each}\n  {/await}\n</ul>\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-type-graphql.mdx",
    "content": "---\ntitle: typescript-type-graphql\ndescription: Generate TypeScript types for use with TypeGraphQL. This plugin is similar to the basic TypeScript plugin. However, this package generates types that can be used by TypeGraphQL to generate a GraphQL schema. This is especially useful if you are building a service that is a gateway to multiple downstream GraphQL services, or otherwise combining GraphQL schemas. In this case, this plugin can be used to re-expose types defined in downstream GraphQL services without redefining them as TypeGraphQL objects. This plugin should be compatible with other client-side plugins, such as typescript-operations.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\nThis plugin is similar to the basic TypeScript plugin. However, this package generates types that can be used by TypeGraphQL to generate a GraphQL schema. This is especially useful if you are building a service that is a gateway to multiple downstream GraphQL services, or otherwise combining GraphQL schemas. In this case, this plugin can be used to re-expose types defined in downstream GraphQL services without redefining them as TypeGraphQL objects. This plugin should be compatible with other client-side plugins, such as typescript-operations.\n\nSome differences with the types generated by the basic TypeScript plugin:\n\n- classes are generated instead of interfaces\n- TypeGraphQL decorators like `@ObjectType` and `@Field` will be added\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-urql.mdx",
    "content": "---\ntitle: typescript-urql\ndescription: GraphQL codegen plugin for generating TypeScript code using urql. This plugin generates React Hooks and TypeScript types.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<Callout type=\"info\">\n\nWe now recommend using the `client-preset` package for a **better developer experience** and smaller impact on bundle size.\n\n**Get started on [our \"React/Vue\" guide](/docs/guides/react-vue).**\n\n</Callout>\n\n<PluginHeader />\n<PluginApiDocs />\n\n## Usage Example\n\nFor the given input:\n\n```graphql\nquery Test {\n  feed {\n    id\n    commentCount\n    repository {\n      full_name\n      html_url\n      owner {\n        avatar_url\n      }\n    }\n  }\n}\n```\n\nWe can use the generated code like this:\n\n```tsx\n<TestComponent variables={...}>\n  …\n</TestComponent>\n```\n\nOr if you prefer:\n\n```ts\nconst [result] = useTestQuery(...)\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-validation-schema.mdx",
    "content": "---\ntitle: typescript-validation-schema\ndescription: A plugin for GraphQL Codegen to generate form validation schema (such as yup, zod) based on your GraphQL schema for use in a client application.\n---\n\nimport { PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<PluginHeader />\n\n_Built and maintained by [Code-Hex](https://github.com/Code-Hex)_\n\nA plugin for GraphQL Codegen to generate form validation schema (such as [yup](https://github.com/jquense/yup), [zod](https://github.com/colinhacks/zod)) based on your GraphQL schema for use in a client application.\n\n## Examples\n\nSet up your project per the GraphQL Codegen Docs, and specify this plugin in your `codegen.yml`:\n\n```ts filename=\"codegen.ts\"\nimport type { CodegenConfig } from '@graphql-codegen/cli'\n\nconst config: CodegenConfig = {\n  generates: {\n    'path/to/graphql.ts': {\n      plugins: ['typescript', 'typescript-validation-schema'],\n      config: {\n        strictScalars: true,\n        schema: 'yup'\n      }\n    }\n  }\n}\nexport default config\n```\n\n## Usage & Documentation\n\nFor the complete documentation, please refer to [Code-Hex/graphql-codegen-typescript-validation-schema](https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema) repository.\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-vue-apollo-smart-ops.mdx",
    "content": "---\ntitle: typescript-vue-apollo-smart-ops\ndescription: A Vue plugin for Apollo GraphQL with smart operations. It generates Vue composition functions for your GraphQL queries and mutations.\n---\n\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<PluginHeader />\n<PluginApiDocs />\n\n## Examples\n\n### Queries\n\nUsing the generated query code.\n\n#### Basic query\n\nFor the given input:\n\n```graphql\nquery Messages($type: FeedType!) {\n  feed(type: $type) {\n    id\n  }\n}\n```\n\nWe can use the generated code like this:\n\n```vue\n<template>\n  <div>\n    <div v-if=\"loading > 0\">Loading…</div>\n    <ul v-else>\n      <li v-for=\"message in messages\">{{ message.id }}</li>\n    </ul>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport { useMessagesQuery } from '../generated/graphqlOperations'\n\nexport default {\n  apollo: {\n    messages: useMessagesQuery({\n      // variables will be correctly typed here!\n      variables: {\n        type: 'HOT'\n      },\n      loadingKey: 'loading',\n      update: data => data.feed\n    })\n  },\n  data() {\n    return {\n      messages: null,\n      loading: 0\n    }\n  }\n}\n</script>\n```\n\n#### Basic mutation\n\nFor the given operation:\n\n```graphql\nmutation CreateMessage($text: String!) {\n  createMessage(text: $text) {\n    id\n  }\n}\n```\n\nWe can use the generated code like this:\n\n```vue\n<template>\n  <div>\n    <textarea v-model=\"text\"></textarea>\n    <button @click=\"send\">Send Message</button>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport { createMessageMutation } from '../generated/graphqlOperations'\n\nexport default {\n  data() {\n    return {\n      text: ''\n    }\n  },\n  async send() {\n    const result = await createMessageMutation(this, {\n      variables: {\n        text: this.text\n      }\n    })\n\n    if (!result.success || !result.data) {\n      alert('Failed to create message')\n      return\n    }\n\n    const messageId = result.data.createMessage.id\n  }\n}\n</script>\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-vue-apollo.mdx",
    "content": "---\ntitle: typescript-vue-apollo\ndescription: GraphQL Code Generator plugin for Vue Apollo. It generates Vue Apollo hooks and TypeScript types. It also generates a Vue plugin that can be used to register the generated hooks as global components.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<Callout type=\"info\">\n\nWe now recommend using the `client-preset` package for a **better developer experience** and smaller impact on bundle size.\n\n**Get started on [our \"React/Vue\" guide](/docs/guides/react-vue).**\n\n</Callout>\n\n<PluginHeader />\n\n<PluginApiDocs />\n\n## Examples\n\nThe examples below use Vue 2 with the ([composition api plugin](https://github.com/vuejs/composition-api)).\n\n### Queries\n\nUsing the generated query code.\n\n#### Basic query\n\nFor the given input:\n\n```graphql\nquery Message {\n  feed {\n    id\n  }\n}\n```\n\nWe can use the generated code like this:\n\n```vue\n<template>\n  <div>\n    <div v-if=\"loading\">Loading…</div>\n    <div v-else>{{ result.feed.id }}</div>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from '@vue/composition-api'\nimport { useMessageQuery } from '../generated/graphqlOperations'\n\nexport default defineComponent({\n  setup() {\n    const { result, loading } = useMessageQuery()\n    return { result, loading }\n  }\n})\n</script>\n```\n\n#### Select a single property with useResult and add an error message\n\nFor the given input:\n\n```graphql\nquery allAccounts {\n  accounts {\n    accountID\n    givenName\n    age\n  }\n}\n```\n\nWe can use the generated code with `useResult` like this:\n\n```vue\n<template>\n  <div>\n    <div v-if=\"loading\">Loading…</div>\n    <div v-else-if=\"error\">Error: {{ error.message }}</div>\n    <div v-else-if=\"allAccounts\">\n      <div v-for=\"account in allAccounts\" :key=\"account.accountID\">\n        {{ account.accountID }} {{ account.givenName }} {{ account.age }}\n      </div>\n    </div>\n  </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from '@vue/composition-api'\nimport { useResult } from '@vue/apollo-composable'\nimport { useAllAccountsQuery } from '../generated/graphqlOperations'\n\nexport default defineComponent({\n  setup() {\n    const { result, loading, error } = useAllAccountsQuery()\n    // Only select the property 'accounts' for use in the template\n    const allAccounts = useResult(result, null, data => data.accounts)\n    return { allAccounts, loading, error }\n  }\n})\n</script>\n```\n\n#### Use an options object\n\nEvery `useXxxxQuery` can receive an [options object](https://v4.apollo.vuejs.org/guide-composable/query.html#options) to define query specific settings. To demonstrate the use of an options object we will try to only execute a query once a condition is met.\n\nThe ref `isAuthenticated` represents a boolean value that is set to `true` once the user successfully logged in to the app. To retrieve the user's application settings we can only execute the graphql query once the user is logged on (and the ref `isAuthenticated` is set to `true`). Setting this ref is done in another part of the app and is used as a simple example.\n\nFor the given input:\n\n```graphql\nquery {\n  viewer {\n    preference {\n      language\n      darkMode\n    }\n  }\n}\n```\n\nWithin the options object is a property `enabled` that defines if a query is enabled or disabled. To only execute the query when `isAuthenticated` is `true` we set the property `enabled` equal to the ref `isAuthenticated`:\n\n```vue\n<script lang=\"ts\">\nimport { defineComponent, watchEffect } from '@vue/composition-api'\nimport { useViewerQuery } from '../generated/graphqlOperations'\nimport { isAuthenticated } from 'src/store/authentication'\n\nexport default defineComponent({\n  setup(_, { root }) {\n    // our imported ref:\n    // const isAuthenticated = ref(false)\n    const { result, loading, error } = useViewerQuery(() => ({\n      enabled: isAuthenticated.value\n    }))\n\n    return {\n      loading,\n      error,\n      result\n    }\n  }\n})\n</script>\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript-vue-urql.mdx",
    "content": "---\ntitle: typescript-vue-urql\ndescription: GraphQL Code Generator plugin for Vue.js and urql. It generates Vue.js components and urql hooks. It also generates TypeScript types.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename, { hasOperationsNote: true })\n\n<Callout type=\"info\">\n\nWe now recommend using the `client-preset` package for a **better developer experience** and smaller impact on bundle size.\n\n**Get started on [our \"React/Vue\" guide](/docs/guides/react-vue).**\n\n</Callout>\n\n<PluginHeader />\n<PluginApiDocs />\n\n## Usage Example\n\nFor the given input:\n\n```graphql\nquery Test {\n  feed {\n    id\n    commentCount\n    repository {\n      full_name\n      html_url\n      owner {\n        avatar_url\n      }\n    }\n  }\n}\n```\n\nWe can use the generated code like this:\n\n```ts\nconst { data } = useTestQuery(...)\n```\n"
  },
  {
    "path": "website/src/pages/plugins/typescript/typescript.mdx",
    "content": "---\ntitle: typescript\ndescription: TypeScript plugin. Adds support for TypeScript.\n---\n\nimport { Callout } from '@theguild/components'\nimport { PluginApiDocs, PluginHeader } from '@/components/plugin'\nimport { pluginGetStaticProps } from '@/lib/plugin-get-static-props'\nexport const getStaticProps = pluginGetStaticProps(__filename)\n\n<Callout>\n  This plugin is meant to be used for low-level use cases or as building block for presets.\n  <br /> For building a **GraphQL client application** we recommend using the [`client-preset`](/plugins/presets/preset-client).\n  <br /> For building a **GraphQL server schema** we recommend using the\n  [`server-preset`](/docs/guides/graphql-server-apollo-yoga-with-server-preset).\n</Callout>\n\n<PluginHeader />\n\n<PluginApiDocs />\n"
  },
  {
    "path": "website/src/pages/plugins.mdx",
    "content": "---\ntitle: Plugins\n---\n\nimport { useData } from '@theguild/components'\nimport { PluginsMarketplaceSearch } from '../components/plugins-marketplace-search'\nexport { getPluginsStaticProps as getStaticProps } from '../components/plugins-marketplace-search'\n\nexport default () => {\n  const plugins = useData()\n  return (\n    <>\n      <style>{`.light body { background: #fff; }`}</style>\n      <PluginsMarketplaceSearch plugins={plugins} />\n    </>\n  )\n}\n"
  },
  {
    "path": "website/src/selection-styles.css",
    "content": ".light ::selection {\n  @apply !bg-blue-500/20;\n}\n"
  },
  {
    "path": "website/tailwind.config.ts",
    "content": "import theGuildTailwindConfig from '@theguild/tailwind-config';\nimport type { Config } from 'tailwindcss';\nimport { fontFamily } from 'tailwindcss/defaultTheme';\n\nconst config: Config = {\n  ...theGuildTailwindConfig,\n  theme: {\n    ...theGuildTailwindConfig.theme,\n    extend: {\n      ...theGuildTailwindConfig.theme.extend,\n      fontFamily: {\n        sans: ['var(--font-sans)', ...fontFamily.sans],\n        display: ['var(--font-sans)', ...fontFamily.sans],\n      },\n      colors: {\n        ...theGuildTailwindConfig.theme.extend.colors,\n        primary: theGuildTailwindConfig.theme.extend.colors['hive-yellow'],\n      },\n      keyframes: {\n        'accordion-down': {\n          from: { height: '0', opacity: '0' },\n          to: { height: 'var(--radix-accordion-content-height)', opacity: '1' },\n        },\n        'accordion-up': {\n          from: { height: 'var(--radix-accordion-content-height)', opacity: '1' },\n          to: { height: '0', opacity: '0' },\n        },\n      },\n      animation: {\n        'accordion-down': 'accordion-down 0.5s ease',\n        'accordion-up': 'accordion-up 0.5s ease',\n      },\n    },\n  },\n  content: [...theGuildTailwindConfig.content, './theme.config.tsx'],\n};\n\nexport default config;\n"
  },
  {
    "path": "website/theme.config.tsx",
    "content": "/* eslint-disable react-hooks/rules-of-hooks */\n/* eslint sort-keys: error */\nimport { useRouter } from 'next/router';\nimport {\n  defineConfig,\n  Giscus,\n  PRODUCTS,\n  useTheme,\n  HiveFooter,\n  cn,\n  HiveNavigation,\n  Anchor,\n  CodegenIcon,\n  GitHubIcon,\n  PaperIcon,\n  PencilIcon,\n} from '@theguild/components';\n\nimport favicon from './public/favicon.svg';\n\nexport default defineConfig({\n  docsRepositoryBase: 'https://github.com/dotansimha/graphql-code-generator/tree/master/website',\n  main({ children }) {\n    const { resolvedTheme } = useTheme();\n    const { route } = useRouter();\n\n    const comments = route !== '/' && (\n      <Giscus\n        // ensure giscus is reloaded when client side route is changed\n        key={route}\n        repo=\"dotansimha/graphql-code-generator\"\n        repoId=\"MDEwOlJlcG9zaXRvcnk3NTY1Nzc5MA==\"\n        category=\"Docs Discussions\"\n        categoryId=\"DIC_kwDOBIJyPs4CSDSK\"\n        mapping=\"pathname\"\n        theme={resolvedTheme}\n      />\n    );\n    return (\n      <>\n        {children}\n        {comments}\n      </>\n    );\n  },\n  websiteName: 'GraphQL-Codegen',\n  description: 'Generate anything from GraphQL schema & operations',\n  logo: PRODUCTS.CODEGEN.logo({ className: 'w-8' }),\n  themeVersion: 'hive-rebranding',\n  color: {\n    hue: {\n      dark: 67.1,\n      light: 173,\n    },\n    saturation: {\n      dark: 100,\n      light: 40,\n    },\n  },\n  navbar: {\n    component: function NavigationMenu() {\n      const { route } = useRouter();\n\n      return (\n        <HiveNavigation\n          className={route === '/' ? 'light max-w-[1392px]' : 'max-w-[90rem]'}\n          productName={PRODUCTS.CODEGEN.name}\n          navLinks={[{ href: '/plugins', children: 'Plugins' }]}\n          developerMenu={[\n            {\n              href: '/docs',\n              icon: PaperIcon,\n              children: 'Documentation',\n            },\n            {\n              href: 'https://the-guild.dev/graphql/hive/blog',\n              icon: PencilIcon,\n              children: 'Blog',\n            },\n            {\n              href: 'https://github.com/dotansimha/graphql-code-generator',\n              icon: GitHubIcon,\n              children: 'GitHub',\n            },\n          ]}\n          logo={\n            <Anchor href=\"/\" className=\"hive-focus -m-2 flex items-center gap-3 rounded-md p-2\">\n              <CodegenIcon className=\"size-8\" />\n              <span className=\"text-2xl font-medium tracking-[-0.16px]\">Codegen</span>\n            </Anchor>\n          }\n        />\n      );\n    },\n  },\n  footer: {\n    component: _props => {\n      const { route } = useRouter();\n\n      return (\n        <HiveFooter\n          className={cn(route === '/' ? 'light' : '[&>:first-child]:mx-0 [&>:first-child]:max-w-[90rem]', 'pt-[72px]')}\n          resources={[\n            {\n              children: 'Privacy Policy',\n              href: 'https://the-guild.dev/graphql/hive/privacy-policy.pdf',\n              title: 'Privacy Policy',\n            },\n            {\n              children: 'Terms of Use',\n              href: 'https://the-guild.dev/graphql/hive/terms-of-use.pdf',\n              title: 'Terms of Use',\n            },\n          ]}\n          description=\"End-to-end type safety\"\n          logo={{\n            href: '/',\n            children: (\n              <div className=\"flex items-center gap-3 text-green-1000\">\n                <CodegenIcon className=\"size-8\" />\n                <span className=\"text-2xl/[1.2] font-medium tracking-[-0.16px]\">Codegen</span>\n              </div>\n            ),\n          }}\n        />\n      );\n    },\n  },\n  head: () => {\n    return (\n      <>\n        <link rel=\"icon\" href={favicon.src} />\n      </>\n    );\n  },\n});\n"
  },
  {
    "path": "website/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2019\",\n    \"baseUrl\": \"./src\",\n    \"module\": \"esnext\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"noEmit\": true,\n    \"moduleResolution\": \"Bundler\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"preserve\",\n    \"incremental\": true,\n    \"useUnknownInCatchVariables\": false,\n    \"paths\": {\n      \"@/*\": [\"./*\"]\n    }\n  },\n  \"include\": [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  }
]